freemarker导出复杂样式的Excel

匿名 (未验证) 提交于 2019-12-02 23:55:01

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

我在网上找了一网站下载了一个Excel模板, 地址

下载的文件是2018库存表

将其导出为xml格式;直接文件另存为即可

删除多余的数据, 将模板变量填进去, 这个变量是需要符合 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 语法, 可参考 链接

这里我使用我自己的脚手架,其实也是一个快速启动的服务端程序,使用的是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();     } }

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

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!