freemarker导出复杂样式的Excel
freemarker导出复杂样式的Excel
代码地址:
https://gitee.com/suveng/demo/tree/master/chapter.002
代码存放于demo下面的chapter.002目录下, 每个模块都是独立开的springboot应用,可以直接运行 application
环境
- springboot 2.1.2
- Freemarker 2.3.28
- JDK1.8
步骤
1.找到对应Excel模板
我在网上找了一网站下载了一个Excel模板, 地址
下载的文件是2018库存表

2.Excel模板导出为xml格式
将其导出为xml格式;直接文件另存为即可

删除多余的数据, 将模板变量填进去, 这个变量是需要符合 freemarker 的变量规则的;

具体内容可参考文件
3.替换freemarker变量
关键修改:
<#list products as product>
<Row>
<Cell>
<Data ss:Type="String">${product.name!}</Data>
</Cell>
<Cell>
<Data ss:Type="String">${product.number!}</Data>
</Cell>
<Cell>
<Data ss:Type="String">${product.type!}</Data>
</Cell>
<Cell>
<Data ss:Type="String">${product.unit!}</Data>
</Cell>
<Cell>
<Data ss:Type="String">${product.left!}</Data>
</Cell>
<Cell>
<Data ss:Type="String">${product.monthNumber!}</Data>
</Cell>
<Cell>
<Data ss:Type="String">${product.in!}</Data>
</Cell>
<Cell>
<Data ss:Type="String">${product.out!}</Data>
</Cell>
<Cell ss:StyleID="s54">
<Data ss:Type="String">${product.date?string('yyyy/MM/dd')}</Data>
</Cell>
</Row>
</#list>
自己可以拿到文件,对比一下.
具体 freemarker 语法, 可参考 链接
4.编写代码,变量替换
这里我使用我自己的脚手架,其实也是一个快速启动的服务端程序,使用的是springboot构建的.有兴趣可以过去看看链接
这里编写web接口: 导出模板Excel
这里的数据是自己模拟的,随机生成的无意义数据,使用了hutool工具包的randomUtil
AppController.java
@Controller
public class AppController {
@Autowired
private Configuration configuration;
@RequestMapping("/export")
public void export(HttpServletResponse response) throws Exception {
//自己封装号数据实体
ArrayList<Product> products = new ArrayList<>();
//构造数据
for (int i = 0; i < 100; i++) {
Product e = new Product();
e.setName(RandomUtil.randomString(5));
e.setNumber(RandomUtil.randomString(2));
e.setOut(RandomUtil.randomString(2));
e.setIn(RandomUtil.randomString(2));
e.setType(RandomUtil.randomString(5));
e.setUnit(RandomUtil.randomString(4));
e.setMonthNumber(RandomUtil.randomString(1));
e.setDate(new Date());
products.add(e);
}
HashMap<String, Object> map = new HashMap<>();
map.put("products", products);
//构造输出流
Template template = configuration.getTemplate("2018库存表.xml", "UTF-8");
String fileName = "/data/files/" + DateUtil.now() + ".xlsx";
File file = new File(fileName);
FileWriter out = new FileWriter(fileName);
//变量替换
template.process(map, out);
//将文件输出到response,返回给客户端
FileInputStream in = new FileInputStream(file);
byte[] buffer = new byte[in.available()];
in.read(buffer);
in.close();
response.reset();
response.addHeader("Content-Disposition", "attachment;filename=file.xlsx");
ServletOutputStream outputStream = response.getOutputStream();
response.setContentType("application/octet-stream");
outputStream.write(buffer);
outputStream.flush();
outputStream.close();
}
}
5. 结果展示

存在问题
- 变量替换,耗费CPU和内存并未经过测试,与POI这些组件相比到底哪个更好,这里存在疑问?
这里只是用作复杂样式的Excel数据导出,并不适合用作大量数据导出.hutool工具包中和easyExcel都是针对大量数据的Excel导出做了相应的优化,有需要可以查看对应文档
freemarker导出复杂样式的Excel的更多相关文章
- 利用freemarker导出页面格式复杂的excel
刚开始大家可能会利用poi生成简单的excel,但是遇到需要生成复杂的excel,poi导出excel就比较困难,这时候可以利用freemarker来渲染实现实现生成复杂的excel, 首先,将exc ...
- freemarker导出word文档——WordXML格式解析
前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...
- 关于使用freemarker导出文档的使用
7.FreeMarker导出word文件,模板:template.ftl/** * 为word加载数据插值 * * @throws IOException */ public void exportW ...
- java freemarker导出word时添加或勾选复选框
最近项目导出word碰到一个需求,要求根据数据动态的决定word里的复选框是否勾选, 公司导出word用的是freemarker,相比较其他技术,freemarker可以很容易的控制输出样式, 在wo ...
- freemarker导出word的一些问题
首先,了解下freemarker导出word的流程: 参考https://www.cnblogs.com/llfy/p/9303208.html 异常一: freemarker.core.ParseE ...
- .NET使用Office Open XML导出大量数据到 Excel
我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原始的HTML拼接(将需要导出的数据拼接成TABLE标签)到后来happy的使用开源的NPOI, EPPlus等开源组件导出EX ...
- 使用Freemarker导出Word文档(包含图片)代码实现及总结
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- Java导出带格式的Excel数据到Word表格
前言 在Word中创建报告时,我们经常会遇到这样的情况:我们需要将数据从Excel中复制和粘贴到Word中,这样读者就可以直接在Word中浏览数据,而不用打开Excel文档.在本文中,您将学习如何使用 ...
- 如何通过Java导出带格式的 Excel 数据到 Word 表格
在Word中制作报表时,我们经常需要将Excel中的数据复制粘贴到Word中,这样则可以直接在Word文档中查看数据而无需打开另一个Excel文件.但是如果表格比较长,内容就会存在一定程度的丢失,无法 ...
随机推荐
- 个人永久性免费-Excel催化剂功能第53波-无比期待的合并工作薄功能
合并工作薄.工作表功能,几乎每一款Excel插件都提供,而且系列衍生功能甚至有多达10多个.今天Excel催化剂重拾武器,在现有众多插件没提供到位的部分场景中,给予支持和补充,做到人有我优,人无我有的 ...
- 小代学Spring Boot之自定义Starter
想要获取更多文章可以访问我的博客 - 代码无止境. 上一篇小代同学在Spring Boot项目中配置了数据源,但是通常来讲我们访问数据库都会通过一个ORM框架,很少会直接使用JDBC来执行数据库操作的 ...
- vue 的基本语法和常用指令
什么是vue.js Vue.js是目前最火的一个前端框架,React是最流行的一个前端框架(React除了开发网站,还可以开发手机App, Vue语法也是可以用于进行手机App开发的,需要借助于Wee ...
- linux初学者-软件安装与管理篇
linux初学者-软件安装与管理篇 在linux的学习和工作中需要安装许多的软件.在redhat的linux操作系统下,软件一般都是rpm格式的.以下将介绍一些软件安装和管理的内容. 1.软件名称 在 ...
- idea新建javaweb工程
最近尝试了idea的使用,将idea建立javaweb工程的步骤记录下来 1.方框里边是重点 2.next后输入工程文件名点击finish 3.如图看到项目文件夹里边没有WEB-INF文件夹及里边的w ...
- jquery 操作HTML data全局属性缓存的坑
data-* 全局属性 是一类被称为自定义数据属性的属性,它赋予我们在所有 HTML 元素上嵌入自定义数据属性的能力,并可以通过脚本(一般指JavaScript) 与 HTML 之间进行专有数据的交换 ...
- Dubbo源码学习之-Adaptive自适应扩展
前言 最近三周基本处于9-10-6与9-10-7之间,忙碌的节奏机会丢失了自己.除了之前干施工的那段经历,只看参加软件开发以来,前段时间是最繁忙的了.忙的原因,不是要完成的工作量大,而是各种环境问题, ...
- Vue 报错 listen EADDRINUSE :::8080
今天在重启vue项目的时候,发现报了错, listen EADDRINUSE :::8080错误提示 原因:因为另一个项目占用了8080端口,我直接在命令行npm run dev第二个项目,就给出了这 ...
- 基于Spark Grahpx+Neo4j 实现用户社群发现
上一篇文章知识图谱在大数据中的应用我们介绍了知识图谱的一些概念和应用场景,今天我们就来看一个具体的应用案例了解下知识图谱的应用.用户增长对于一个APP的生存起到了至关重要的作用,没有持续的用户增长,再 ...
- 请使用switch语句和if...else语句,计算2008年8月8日这一天,是该年中的第几天。
请使用switch语句和if...else语句,计算2008年8月8日这一天,是该年中的第几天. #include <stdio.h> int main() { /* 定义需要计算的日期 ...