1、背景

文件操作中导入导出功能在项目中十分常见,这里我们要聊的是导出excel这一功能。老话题常谈常新,小编给大家介绍使用freemark模板的方式导出excel。

2、实现

Demo中采用springBoot+mybatis整合项目,其他项目配置类似。

2.1 添加jar

pom.xml中配置freemark所需的jar包,如下所示:

org.springframework.boot

spring-boot-starter-freemarker

2.2 准备模板

修改excel模板(即后续导出的excel模板,包括列名和样式等内容)的扩展名为.xml文件格式。打开文件,这里需要修改一处参数。

2.2.1 修改行数

将上述代码中的“ss:ExpandedRowCount”属性的值设置为${exports?size+15} ,其中,exports是后台准备数据的值,即下面代码中map中的key值。

如果您能预估到表格中数据的条数,可以直接设置一个较大的值。

2.2.2 填充数据

这里的用法和一般的模板引擎以及jsp的用法都很类似,只要清楚具体用法就可以了,这里取一小段做示例。

0)>

${(p.student.schoolNo)!'无'}

${(p.student.systemNo)!'无'}

${(p.student.name)!'无'}

#if>

#list>

Tips:

1) 做好判空处理,否则模板会直接报错

2)保持excel代码中原有数据值不变,比如上述的ss:StyleID等。另外,每个标签都要跟上结束标签,否则生成的excel会无法打开。

修改完毕后,将文件保存为.ftl格式的文件,即freemark模板文件格式。

2.3 后台实现

@RequestMapping("index")

public void index(HttpServletRequest request, int oaId,String startDate,HttpServletResponse response, Model model) {

//填充模板的数据Vo

Map map=getPermission(oaId,startDate);

File file = null;

InputStream inputStream = null;

ServletOutputStream out = null;

try{

request.setCharacterEncoding("UTF-8");

file = new ExcelUtil().createExcel(request,map, "myExcel","all.ftl");//调用创建excel帮助类,其中all.ftl为模板名称

inputStream = new FileInputStream(file);

response.setCharacterEncoding("utf-8");

response.setContentType("application/msexcel");

response.setHeader("content-disposition", "attachment;filename="+ URLEncoder.encode("name" + ".xls", "UTF-8"));

out = response.getOutputStream();

byte[] buffer = new byte[512]; // 缓冲区

int bytesToRead = -1;

// 通过循环将读入的Excel文件的内容输出到浏览器中

while ((bytesToRead = inputStream.read(buffer)) != -1) {

out.write(buffer, 0, bytesToRead);

}

out.flush();

if (inputStream != null) {

inputStream.close();

}

file.delete(); //导出到浏览器后,删除项目中的临时文件

}catch(Exception e){

}

}

Utils工具类:

public File createExcel(HttpServletRequest request, Map, ?> dataMap, String type, String valueName){

realPath=request.getServletContext().getRealPath("");

try {

configuration = new Configuration();

configuration.setDefaultEncoding("UTF-8");

configuration.setDirectoryForTemplateLoading(new File(realPath+""));

allTemplates = new HashMap();

allTemplates.put(type, configuration.getTemplate(valueName));

} catch (IOException ex) {

ex.printStackTrace();

throw new RuntimeException(ex);

}

String name = "temp" + (int) (Math.random() * 100000) + ".xls";

File file = new File(name);

Template template = allTemplates.get(type);

try {

Writer w = new OutputStreamWriter(new FileOutputStream(file), "utf-8");

template.process(dataMap, w);

w.close();

} catch (Exception e) {

e.printStackTrace();

throw new RuntimeException(e);

}

return file;

}

导出excel如下所示:

3、小结

使用模板生成excel适用于要展示的数据项较多,并且样式十分复杂的需求中。如果使用纯Java代码来编写这样复杂的excel,极易出错而且工作量很大。

学会变通,不同场景使用不同的方式来解决。当你发觉一直在做体力活的时候,就应该闻到了坏代码的味道……

ftl模板导出excel_使用freemark模板生成excel相关推荐

  1. ftl模板导出excel_使用freemarker模板引擎导出word或excel文件(代码实现)

    在项目中我们会遇到很多导入导出excel或者word 有时候一些比较复杂的表格设计用freemarker 来做为模板导出还是很不错的 具体操作 我们要针对该列表做数据导出模板 在桌面右键新建一个exc ...

  2. python 查询mysql数据导出excl_python查询mysql并生成excel表

    需求说明 开发不愿意单独为某个项目做后台 并且运营那边需要合并多个表的数据 因此找上了我. 要求每周执行一次.月初也执行一次 要查询2个mysql数据库多个表并生成excel表 我的想法 找开发要sq ...

  3. Freemarker 模板导出(带图片)

    1. 依赖 <!--FreeMarker--><dependency><groupId>org.freemarker</groupId><arti ...

  4. POI之excel固定模板导出

    POI之excel固定模板导出 一.简介 二.excel模板 三.项目中maven依赖 四.Excel模板操作代码 五.Controller层excel模板导出接口代码 六.导出excel 一.简介 ...

  5. SpringBoot生成Excel文件并下载到浏览器

    SpringBoot生成并下载Excel文件到浏览器 前言 分析业务 如何实现下载 工具类及实现方法 导出 导出工具类 下载 以请求方式下载 前言 今天又接到了如题的需求,突然脑子一抽不记得这个逻辑是 ...

  6. Freemark 模板生成doc文件,xml doc文件转docx 文件,docx文件转pdf文件

    freemark 模板生成doc文件,此doc文件为xml格式,无法直接转pdf 需要doc转docx文件,才能转pdf 方法1:docx4j 转 pdf 方法2: e-iceblue docx 转 ...

  7. ftl模板导出excel_freemarker导出复杂Excel

    原文: freemarker导出复杂Excel date: 2017-04-20 12:39:04 [TOC] 序言 用Freemarker做Excel导出确实很容易. 但是导出复杂Excel, 例如 ...

  8. ftl模板导出excel_freemarker导出Excel

    freemarker 导出Excel 原创 2015年10月23日 14:47:05 927 在项目开发中,导出Excel 是比较常见的功能, 以前用过POI导出Excel 文件, 但是POI 在使用 ...

  9. ftl模板导出word简历

    ftl模板导出 1.新建 word 文档模板 新建 word 文档(muban.doc),编辑该文档作为样板数据文档: 2.将 word 文档另存为 xml 3.将 xml 文档重命名为 ftl 将上 ...

最新文章

  1. binlog日志的三种模式
  2. c语言编程能控制热风炉,利用C语言设计热风炉悬链线拱顶研究.pdf
  3. 实战:在远程网络配置DNS转发
  4. springboot1——第一个springboot程序
  5. mysql中间件研究(Atlas,cobar,TDDL)
  6. mockito 使用_用Mockito回答
  7. 在Ubuntu中安装MySQL (转载)
  8. 丝蛋白行业调研报告 - 市场现状分析与发展前景预测
  9. python 设计模式之组合模式Composite Pattern
  10. Ajax基础之原生js封装
  11. java ee 设计模式解析与应用_《Java EE 设计模式解析与应用》PDF 下载
  12. session 过期怎么办
  13. NBIOT模块 HCore BC95-B5 与电信IOT平台通信-AT命令介绍
  14. 立创EDA学习笔记(2)——创建元件符号
  15. 认识机器视觉环形光源
  16. 链队列——-链式存储实现队列的入队出队(带next,front,rear指针)
  17. 电商直播方案主要有哪些内容?
  18. 蓝天保卫战之产品测试服务
  19. 为什么重写equals方法必须要重写hashCode方法
  20. 上海合宙Luat 模块 Air724开发板 入门指南(1)

热门文章

  1. 论文阅读-Retrieving and Reading : A ComprehensiveSurvey on Open-domain Question Answering
  2. 编写一个python程序用来计算投资回收期_计算该项目的投资回收期;
  3. 回调地狱,解决回调地狱,回调地狱的终极解决方案
  4. iOS App上架审核经验
  5. 禁用Linux的SCP命令
  6. Python实现十大经典排序 I
  7. SVG阴影、渐变、滤镜
  8. Win32编程API 基础篇 -- 1.入门指南 根据英文教程翻译
  9. FloatingActionButton悬浮菜单按钮的实现
  10. 【栖梧-源码-spring】@Bean从解析到注册到beanDefinitionMap