news 2026/4/17 2:56:04

根据Excel 模板生成excel(java)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
根据Excel 模板生成excel(java)

重阳,需求很常见:根据一个已设计好的 Excel 模板(含样式、公式、合并单元格、表头、页眉页脚等),往里面填充动态数据,然后生成新的 Excel 文件

2026 年主流的三种方案对比(基于当前社区使用情况):

方案推荐指数 (2026)内存占用模板支持度(样式/合并/公式/图片)学习曲线大文件友好度Maven 依赖大小
EasyExcel(阿里)★★★★★极低优秀(支持复杂模板填充)★★★★★
Apache POI★★★★☆最好(几乎全能)★★☆☆☆
JXLS(基于 POI)★★★☆☆很好(Jxls 模板语法)★★★☆☆
Fastexcel / Spire.XLS★★☆☆☆低/中中等低/高★★★★☆小/商业

2026 年最推荐:EasyExcel
理由:内存友好、API 简洁、模板填充功能成熟、社区活跃、Spring Boot 集成极好。

下面直接给你三种主流实现方式的完整代码示例(都基于 Spring Boot 项目场景)。

方案一:EasyExcel 模板填充(最推荐)

Maven 依赖(最新稳定版 3.x 或 4.x 系列,根据 2026 年情况用最新)

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.4</version><!-- 或更高版本 --></dependency>

模板准备(excel 模板文件 template.xlsx)
在模板中用{}或自定义占位符,例如:

  • 单值:{date}{totalAmount}
  • 列表竖向填充:{.list}或用{{.开头(EasyExcel 推荐语法)

示例模板内容(A1 放标题,A2 开始表头,B3 开始放{name}{age}等):

ABC
报表标题{title}
姓名年龄得分
{.students}

代码实现(Controller 或 Service 中)

importcom.alibaba.excel.EasyExcel;importcom.alibaba.excel.write.enums.poi.HorizontalAlignment;importcom.alibaba.excel.write.enums.poi.VerticalAlignment;importcom.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;importjavax.servlet.http.HttpServletResponse;importjava.net.URLEncoder;importjava.nio.charset.StandardCharsets;importjava.util.*;@RestController@RequestMapping("/excel")publicclassExcelController{@GetMapping("/export-template-fill")publicvoidexportWithTemplate(HttpServletResponseresponse)throwsException{// 1. 准备数据(可以从数据库查)Map<String,Object>data=newHashMap<>();data.put("title","2026年班级成绩汇总");data.put("date","2026-02-03");data.put("total",88);List<Map<String,Object>>students=newArrayList<>();students.add(Map.of("name","张三","age",18,"score",95));students.add(Map.of("name","李四","age",19,"score",88));students.add(Map.of("name","王五","age",17,"score",92));data.put("students",students);// 2. 设置响应头(浏览器下载)response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");StringfileName=URLEncoder.encode("成绩报表.xlsx",StandardCharsets.UTF_8.toString()).replaceAll("\\+","%20");response.setHeader("Content-disposition","attachment;filename*=utf-8''"+fileName);// 3. 模板路径(放在 resources/templates/ 下)StringtemplateFileName="templates/成绩模板.xlsx";// 4. 核心:模板填充写出EasyExcel.write(response.getOutputStream()).withTemplate(templateFileName).registerWriteHandler(newLongestMatchColumnWidthStyleStrategy())// 自适应列宽,可选.sheet().doFill(data);// ← 核心方法!传入 map 或对象}}

高级用法提示(EasyExcel 模板填充常见技巧):

  • 列表横向填充:用{{.或指定方向
  • 多列表:多个.list占位符
  • 复杂对象:{.user.name}点语法
  • 保留样式/公式/合并单元格:EasyExcel 会尽量保留
  • 图片填充:支持FillWrapper+Image对象

方案二:Apache POI 基于模板填充(最灵活,但内存高)

依赖

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.3.0</version><!-- 或更高 --></dependency>

核心代码片段

importorg.apache.poi.xssf.usermodel.XSSFWorkbook;importjava.io.FileInputStream;importjava.io.OutputStream;// 加载模板try(FileInputStreamfis=newFileInputStream("template.xlsx");XSSFWorkbookworkbook=newXSSFWorkbook(fis)){varsheet=workbook.getSheetAt(0);// 填充单值sheet.getRow(1).getCell(1).setCellValue("2026-02-03 重阳");// 填充列表(从第3行开始)introwIndex=3;for(varstudent:students){varrow=sheet.getRow(rowIndex)!=null?sheet.getRow(rowIndex):sheet.createRow(rowIndex);row.createCell(0).setCellValue(student.getName());row.createCell(1).setCellValue(student.getAge());rowIndex++;}// 输出到 response 或文件workbook.write(response.getOutputStream());}

优点:可以精确控制每个单元格的样式、公式、批注、条件格式等。
缺点:代码量大,内存占用高(大文件容易 OOM)。

方案三:快速选择建议

场景首选方案
大数据量(万行+)EasyExcel
复杂样式/公式/图表保留Apache POI
需要极致灵活控制单元格Apache POI
快速上手、内存敏感EasyExcel
想用模板语法(如 {var})EasyExcel / JXLS

小建议

  1. 先准备好模板文件,占位符用{}{{}}(EasyExcel 推荐)
  2. 测试时把模板放 resources/templates/ 下,用 classpath 加载
  3. 生产环境建议把模板上传到文件服务器或放在 jar 外

重阳,你现在是想:

  • 用 EasyExcel 做列表多sheet 填充?
  • 处理合并单元格 / 图片 / 下拉框?
  • 导出后自动调整列宽 / 加水印?
  • 还是遇到具体报错想 debug?

告诉我你的具体需求或模板样子,我可以给你更精确的代码~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 0:55:04

同城便民信息小程序源码系统,支持本地商家入驻平台

温馨提示&#xff1a;文末有资源获取方式在信息爆炸的时代&#xff0c;人们对于便捷、高效的生活服务需求日益增长。为了满足这一市场需求&#xff0c;我们隆重推出全新升级的同城便民信息小程序源码系统&#xff0c;经过全面优化和bug修复&#xff0c;提供史上最强大的功能覆盖…

作者头像 李华
网站建设 2026/4/16 16:10:21

基于龙伯格观测器的永磁同步电机无感FOC技术:反电势提取与转子位置速度信息获取

基于龙贝格观测器的永磁同步电机无感FOC 1.采用龙伯格观测器提取电机反电势&#xff0c;使用PLL从反电势中获得转子位置和速度信息。 2.提供算法对应的参考文献和仿真模型&#xff0c;支持技术解答。 仿真模型纯手工搭建。 仿真模型仅供学习参考最近在研究永磁同步电机&#xf…

作者头像 李华
网站建设 2026/4/15 16:26:02

人工智能应用- 语言理解:02. 语言模型

后来&#xff0c;研究者发现词与词之间的关联更能反映语言的规律。一句话是否合理&#xff0c;往往取决于其中的词语搭配是否常见。例如&#xff0c;“我看电视”是合理的&#xff0c;因为“我”和“看”常常搭配在一起&#xff0c;“看”和“电视”也是自然的组合。而类似于“…

作者头像 李华
网站建设 2026/4/13 18:49:10

聚沙成塔,三步成书:GitBook极简入门教程

&#x1f4d6; 本文简介 对于经常写作的工友来说&#xff0c;除了在各个平台上发布文章&#xff0c;其实还可以把自己的专栏整理成一本“在线书”&#xff0c;分享到网上&#xff0c;方便系统阅读和沉淀内容。 市面上这类工具不少&#xff0c;比如 VitePress、Docusaurus 等等…

作者头像 李华
网站建设 2026/4/10 9:20:16

口碑推荐!天玑AIGEO优化系统该选哪家?

行业痛点分析 在当前天玑AIGEO优化系统领域&#xff0c;企业面临着诸多技术挑战。数据表明&#xff0c;部分企业在营销过程中&#xff0c;由于传统广告投放缺乏精准定位&#xff0c;导致无效投放成本占比超30%。本地企业更是面临重重困难&#xff0c;线下门店引流半径有限&…

作者头像 李华