AI智能
改变未来

freemarker生成复杂样式图片并无文件损坏的excel

参考Freemarker整合poi导出带有图片的Excel教程,优化代码实现和Excel版本兼容。

(因对代码结构该动太大,没有提交PR,代码核心思路和代码源于大脑补丁)

功能介绍:
1.支持Freemarker导出Excel的所有功能(完美导出复杂的合并单元格、合并行和列、颜色、字体等)
2.支持导出带有图片的Excel
3.支持多Sheet页导出
4.支持导出单元格注释
5.支持完美导出.xls、.xlsx格式,生成文件打开无报错提醒
6.适用于生成复杂样式的Excel,不适用于大数据量导出

需求背景

企业级需求中有较多复杂样式的excel需求,包括各种单元格合并,插入图片,而且变更频繁,案例如下:

单纯使用JAVA POI无法满足此类开发需求。Freemarker导出的Excel为xml格式,此格式所有的富文本信息都会丢失,只留下文本内容,不能直接导出带有图片的Excel。通常使用Freemaker直接将.xml重命名为.xls的方法,对复杂样式兼容不友好,会有弹框报错。基于此种需求,开发此工具导出带有图片的Excel。

依赖包

<dependencies>​<!-- 仅仅需要基本的starter,不需要web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>​<!-- 模板引擎 --><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.28</version></dependency>​<!-- java处理Excel文件,支持excel2003 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency>​<!--支持excel2007以上,性能特别好--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version><exclusions><exclusion><artifactId>poi</artifactId><groupId3d4b>org.apache.poi</groupId></exclusion></exclusions></dependency>​<!-- java解析XML文件 --><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency>​<!-- 使用其中的FileUtils工具类 --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency>​<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency>

使用步骤

1. 参考Freemaker语法设置占位符,将Excel文件另存为XML;

2. 将模板XML放到项目的模板目录中

3. 导出效果

@Testpublic void writeExcel() throws IOException {Map<String, Object> dataMap = getDemoDataMap();String templateName = \"图片-颜色-单元格合并-样例.xml\";/*若改变图片位置,修改后4个参数dx1 dy1 起始单元格中的x,y坐标.dx2 dy2 结束单元格中的x,y坐标col1,row1 指定起始的单元格,下标从0开始col2,row2 指定结束的单元格 ,下标从0开始*/HSSFClientAnchor hssfClientAnchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 5, 1, (short) 13, 21);// 读取resource下的文件PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();// 获取单个文件Resource resource = resolver.getResource(\"template/功能简介.png\");File img = resource.getFile();ExcelImage hssfImage = new ExcelImage(img, 0, hssfClientAnchor);List<ExcelImage> hssfImgs = new ArrayList<>();hssfImgs.add(hssfImage);ExcelWriter.writeExcel2003(dataMap, templateName, \"图片-颜色-单元格合并-样例-2003\", hssfImgs);XSSFClientAnchor xssfClientAnchor = new XSSFClientAnchor(0, 0, 0, 0, (short) 5, 1, (short) 13, 21);ExcelImage xssfImage = new ExcelImage(img, 0, xssfClientAnchor);List<ExcelImage> xssfImgs = new ArrayList<>();xssfImgs.add(xssfImage);ExcelWriter.writeExcel2007(dataMap, templateName, \"图片-颜色-单元格合并-样例-2007\", xssfImgs);}

代码逻辑

1. 使用Freemaker给占位符赋值,生成XML文件,该XML文件中包含Excel原始样式和所有数据;

2. 解析XML中的Excel样式,转化为CellStyle;

3. 遍历XML的数据格式,按照读取的CellStyle重新生成Excel;

4. 将图片插入到给定的单元格中;

结论:此方法的逻辑是通过Freemaker模板引擎,给预置的Excel模板动态赋值,生成中间态的XML文件,再解析该XML文件生成新的Excel文件。将复杂的样式和数据的编辑放在模板中,通过两次IO生成文件,不适合大数据量的导出,适合结构复杂和多样定制的Excel生成。

项目地址:

1. 541211190/freemarker-excel(原作者的项目)2. Hlingoes/freemaker-poi-excel(按原作者思路重新实现的项目)

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » freemarker生成复杂样式图片并无文件损坏的excel