Freemaker生成复杂样式图片并无文件损坏的excel
Freemaker生成复杂样式图片并无文件损坏的excel
参考Freemarker整合poi导出带有图片的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生成。
Freemaker生成复杂样式图片并无文件损坏的excel的更多相关文章
- iOS 加载本地 HTML 文件 CSS 样式图片无效果
在开发的过程中,有时候需要加载一些 HTML 页面,对于不太复杂的界面,基本上都可以放到本地用 UIWebview 来加载,但是在开发过程中会碰到 UIWebview 加载出来的 HTML 页面没有图 ...
- 脚本工具(获取某个文件夹下的所有图片属性批量生成css样式)
问题描述: 由于有一次工作原因,就是将某个文件夹下的所有图片,通过CSS描述他们的属性,用的时候就可以直接引用.但是我觉得那个文件夹下的图片太多,而且CSS文件的格式又有一定的规律,所有想通过脚本来生 ...
- 基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作
在很多Web系统中,一般都可能提供一些图标的选择,方便配置按钮,菜单等界面元素的图标,从而是Web系统界面看起来更加美观和协调.但是在系统中一般内置的图标样式相对比较有限,而且硬编码写到样式表里面,这 ...
- (转)基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作
http://www.cnblogs.com/wuhuacong/p/4093778.html 在很多Web系统中,一般都可能提供一些图标的选择,方便配置按钮,菜单等界面元素的图标,从而是Web系统界 ...
- PDF 补丁丁 0.4.1.804 测试版发布:合并文件夹的图片和PDF文件,自由生成多层次书签
新的测试版增强了合并文件的功能,可以合并文件夹内的图片和PDF文件,还可以在合并文件列表上直接指定与合并文件对应的PDF书签标题.通过拖放文件项目生成多层次的PDF书签.如下图所示: 另外,新的测试版 ...
- PHP 简易读取文件目录下的文件,生成css spirte图片
因为个人不是对PS熟悉,不清楚如何在PS中生成一张横向有序的spirte图片,使用了"css sprite V4.3"版本,生成的图片会出现压缩图片大小的情况,本想修改原作者开发的 ...
- 用pChart生成雷达图图片
需求 :由于工作需要,需要在一张背景图上添加这一张雷达图,之后图片可以在微信中长按保存.所以说我必须生成一张带有雷达图的图片第一反应是用百度echars雷达图做动态显示,之后截图.考虑到工作量和效率, ...
- Atitit.论图片类型 垃圾文件的识别与清理 流程与设计原则 与api概要设计 v2 pbj
Atitit.论图片类型 垃圾文件的识别与清理 流程与设计原则 与api概要设计 v2 pbj 1. 俩个问题::识别垃圾文件与清理策略1 2. 如何识别垃圾图片1 2.1. 体积过小文件<1 ...
- Java给图片和PDF文件添加水印(图片水印和文字水印)
有时候我们看到的图片或者PDF文件会自动加上水印.分为文字水印和图片水印. ----------------------------图片水印---------------------------- 1 ...
随机推荐
- 18. VUE created 方法作用
一般可以在created函数中调用ajax获取页面初始化所需的数据. 实例的生命周期: 每个 Vue 实例在被创建之前都要经过一系列的初始化过程.例如,实例需要配置数据观测(data observer ...
- RTSP 流相关工具介绍
RTSP (Real Time Streaming Protocol),实时流协议,是一种应用层协议,专为流媒体使用.本文将介绍 GStreamer, VLC, FFmpeg 这几个工具,如何发送.接 ...
- 分页系列之一:SQL Server 分页存储过程
以下为最基本的代码结构,SQL Server 2012 开始支持 CREATE PROCEDURE procXXX @Page int, --当前页码,从1开始 @PageSize int --每页记 ...
- Review: JQuery
1.DOM access with jQuery 1 $("h1"); //select all the h1s 2 $("#heading"); // sel ...
- php 不定参数的传递
相关函数 func_get_args func_num_args <?php function more_args(){ $args = func_get_args(); for($i=0;$i ...
- node-多进程
Node.js 是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程,从而提高性能. 每个子进程总是带有三个流对象: child.stdin, ...
- node-全局对象
Node.js 全局对象 JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量. 全局对象与全局变量 global ...
- React-列表 & Key
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...
- Portswigger web security academy:Server-side request forgery (SSRF)
Portswigger web security academy:Server-side request forgery (SSRF) 目录 Portswigger web security acad ...
- shell中的引号和转义
引号和转义 Bash 只有一种数据类型,就是字符串.不管用户输入什么数据,Bash 都视为字符串.因此,字符串相关的引号和转义,对 Bash 来说就非常重要. 转义 某些字符在 Bash 里面有特殊含 ...