freemarker导出复杂样式的Excel

代码地址:

gitee

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. 结果展示

存在问题

  1. 变量替换,耗费CPU和内存并未经过测试,与POI这些组件相比到底哪个更好,这里存在疑问?

这里只是用作复杂样式的Excel数据导出,并不适合用作大量数据导出.hutool工具包中和easyExcel都是针对大量数据的Excel导出做了相应的优化,有需要可以查看对应文档

freemarker导出复杂样式的Excel的更多相关文章

  1. 利用freemarker导出页面格式复杂的excel

    刚开始大家可能会利用poi生成简单的excel,但是遇到需要生成复杂的excel,poi导出excel就比较困难,这时候可以利用freemarker来渲染实现实现生成复杂的excel, 首先,将exc ...

  2. freemarker导出word文档——WordXML格式解析

    前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...

  3. 关于使用freemarker导出文档的使用

    7.FreeMarker导出word文件,模板:template.ftl/** * 为word加载数据插值 * * @throws IOException */ public void exportW ...

  4. java freemarker导出word时添加或勾选复选框

    最近项目导出word碰到一个需求,要求根据数据动态的决定word里的复选框是否勾选, 公司导出word用的是freemarker,相比较其他技术,freemarker可以很容易的控制输出样式, 在wo ...

  5. freemarker导出word的一些问题

    首先,了解下freemarker导出word的流程: 参考https://www.cnblogs.com/llfy/p/9303208.html 异常一: freemarker.core.ParseE ...

  6. .NET使用Office Open XML导出大量数据到 Excel

    我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原始的HTML拼接(将需要导出的数据拼接成TABLE标签)到后来happy的使用开源的NPOI, EPPlus等开源组件导出EX ...

  7. 使用Freemarker导出Word文档(包含图片)代码实现及总结

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  8. Java导出带格式的Excel数据到Word表格

    前言 在Word中创建报告时,我们经常会遇到这样的情况:我们需要将数据从Excel中复制和粘贴到Word中,这样读者就可以直接在Word中浏览数据,而不用打开Excel文档.在本文中,您将学习如何使用 ...

  9. 如何通过Java导出带格式的 Excel 数据到 Word 表格

    在Word中制作报表时,我们经常需要将Excel中的数据复制粘贴到Word中,这样则可以直接在Word文档中查看数据而无需打开另一个Excel文件.但是如果表格比较长,内容就会存在一定程度的丢失,无法 ...

随机推荐

  1. openlayer 5 获取中心点

    之前在控制台把map对象打印出来后,有一个很像中心点坐标map.focus_.我可以确定的告诉大家,这个不是中心点坐标,检查出来的结果是地图中心最右的点位. 在创建地图时,会将中心点左边写在view中 ...

  2. hadoop之安装hadoop

    官网 http://hadoop.apache.org/ 下载页:https://hadoop.apache.org/releases.html 上传安装包到Linux 解压并进入到目录下 [root ...

  3. (图文教程)IntelliJ IDEA 导入Eclipse/MyEclipse 项目 配置详解+快捷键分享

    (图文教程)IntelliJ IDEA 导入Eclipse/MyEclipse 项目 配置详解+快捷键分享 IntelliJ IDEA 使用教程.快捷键配置. 该教程针对原始jar包依赖的工程.mav ...

  4. hexo-theme-yilia使用遇到的问题

    该项目的github地址:https://github.com/litten/hexo-theme-yilia 下面是该项目的README.md 在使用过中遇到这么一个问题. 文章不会自动的摘要,显示 ...

  5. [小米OJ] 4. 最长连续数列

    思路: 时间限制为O(n),即不能使用先排序后寻找的方法. 这里利用哈希表查询插入复杂度都为O(1)的特性来解,利用一个哈希表来保存每一个数字以及其所在数列的长度. 遍历每一个数字n:查询表中是否存在 ...

  6. CSS(下)

    1.CSS边框 边框属性: 1.border-width 宽度 2.border-style 样式 none 无边框 dotted 点状虚线边框 dashed 矩形虚线边框 solid 实线边框 3. ...

  7. PHPStrom激活方法【亲测有效2018.4.23】

    直接用浏览器打开 http://idea.lanyus.com/ 点击页面中的"获得注册码", 然后在注册时切换至Activation Code选项,输入获得的注册码一长串字符串 ...

  8. PHP中的$_POST变量

    定义 在 PHP 中,预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值. $_POST 变量 预定义的 $_POST 变量用于收集来自method ...

  9. 深入理解HashMap(jdk7)

    HashMap的结构图示 ​ jdk1.7的HashMap采用数组+单链表实现,尽管定义了hash函数来避免冲突,但因为数组长度有限,还是会出现两个不同的Key经过计算后在数组中的位置一样,1.7版本 ...

  10. 2019.7 佳木斯培训A层

    day1题目及题解 day2题目及题解 day3题目及题解 day4题目及题解 day5题目及题解