freemarker导出excel
导出excel有多种方式,我用的是freemarker和jxl导出excel,各有各的优缺点。
本篇讲的是用freemarker导出excel
众所周知freemarker是采用模板导出的方法,通用性比较高,但是由于它是用xml模板生成的,打开时会提示文件格式不正确,选择确认打开时没有问题的就是老会提示,这个我一直没有解决 ,有大神知道的,希望可以向菜鸟我指点迷津,废话不多说;
1:导出freemarker库需要的jar包
freemarker-2.3.19.jar。 外部引入jar包,或者添加mevan依赖都可以
2:设计自己想要的excle保存为xml的格式、
3:用实际数据替代虚拟的数据
这里需要注意:
第一个是动态行数设置,要大于等于实际行数
ss:ExpandedRowCount="${rowCount}"
这里的rowCount值我用的是list.size()+100保存为ftl文件。
4:模板装载 数据传入 模板导出
这里的documentHandlerUtil是自定义的文件处理类
Configuration 类’
Configuration 是一个存放模版(Template)可使用的全局共享变量的一个对象。同时它还负责模版(Template)实例的创建以及缓存。
Configuration 实际上是freemarker.template.Configuration 对象的实例,使用其构造函数创建。通常应用使用一个共享的单实例Configuration 对象。
Configuration 对象可被Template 对象的方法使用,每一个模版实例都关联与一个Configuration 实例,它是通过Template 的构造函数被关联进去的,通常是你使用这个方法来Configuration.getTemplate 获得模版对象的。
OutputStream流向客户端浏览器输出数据,并可指定编码方式
outputStream=response.getOutputStream():得到输出数据的字节流
outputStreamWrite=new OutPutStreamWrite(outputStream,“UTF-8”) :将输出字节流编码成字符流
BufferedWriter是字符缓冲输出流,继承于Writer,作用是为其他字符输出流添加一些缓冲功能。
最后t.process(data,out) 导出excle
close() // 关闭此流,但要先刷新它。
flush() // 刷新该流的缓冲。
freemarker详细导出过程就是这样
补充:当表头不固定时:
不固定列时:第一步和平常一样新建excel保存为xml
不同:列数要进行动态设值:
列名:动态设值(如上图)
根据列对应设置数据(如上图)
注意freemarker判空:
用“!” 判空但是不能判断多级空 比如crew.strengthList[key]若用!
key 或者strengthList为空时,会报错。
这里要加上括号()