Freemaker生成复杂样式图片并无文件损坏的excel
参考
功能介绍:
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>
<groupId>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> -
使用步骤
-
参考Freemaker语法设置占位符,将Excel文件另存为XML;
-
将模板XML放到项目的模板目录中
-
导出效果
-
-
代码逻辑
-
使用Freemaker给占位符赋值,生成XML文件,该XML文件中包含Excel原始样式和所有数据;
-
解析XML中的Excel样式,转化为CellStyle;
-
遍历XML的数据格式,按照读取的CellStyle重新生成Excel;
-
将图片插入到给定的单元格中;
-
结论:此方法的逻辑是通过Freemaker模板引擎,给预置的Excel模板动态赋值,生成中间态的XML文件,再解析该XML文件生成新的Excel文件。将复杂的样式和数据的编辑放在模板中,通过两次IO生成文件,不适合大数据量的导出,适合结构复杂和多样定制的Excel生成。