客户需求需要自动生成word文档并下载,网上找了许多方法,最后选用poi-tl。
首先在项目中引入poi-tl的包。
基本用法:
//word文档里基本信息
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder()
.bind("stuList", policy).build(); //stuList为要传入模板的学生基本信息list
Calendar cal = Calendar.getInstance();
//将需要替换的内容赋值给datas
Map<String, Object> datas = new HashMap<String, Object>() {
{
put("nd", nd);
put("studentsnum", studentsnum);
put("boynum", boynum);
put("girlnum", girlnum);
put("calssnum", calssnum);
put("stuList", stuList);
}
};
//读取模板的文件流,并用datas替换模板标签
InputStream in = this.getClass().getResourceAsStream("/templates/temp/student.docx");
XWPFTemplate template = XWPFTemplate.compile(in,config)
.render(datas);
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletResponse response = ((ServletRequestAttributes)requestAttributes).getResponse();
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition","attachment;filename=\""+new String(filename.getBytes("GB2312"), "8859_1")+".docx\"");
//输出word文件流,输出后关闭流
OutputStream out = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(out);
template.write(bos);
bos.flush();
out.flush();
PoitlIOUtils.closeQuietlyMulti(template, bos, out);
out.close();
bos.close();
template.close();
根据模板输出文件流,在前端接收下载即可。
word模板样例
{{nd}}年共接收学生{{studentsnum}}人,其中男生{{boynum}}人,女生{{girlnum}}人,分配到{{calssnum}}个班级。
此时模板内的标签会被程序中的赋值替换掉。
若模板内有表格,可用list标签传输数据,见样例stuList:
学生信息:
{{stuList}}序号
学生证号
姓名
性别
班级
[rowno]
[stuNo]
[stuName]
[gender]
[class]
如模板中某段话需要根据不同的数据循环显示,可以用{{?stunumList}} {{/stunumList}}标签实现,标签内部内容根据List内容及size循环显示
循环样例:
{{?stunumList}}
{{nd}}年共接收学生{{studentsnum}}人,其中男生{{boynum}}人;女生{{girlnum}}人,分配到{{calssnum}}个班级。
{{/stunumList}}
此时stunumList内部出现的标签都应为此list的内部属性。