持续学习乃进步之源泉,于此,我决定将个人在运用poi技术导出Word文档过程中所积累的知识与实践经验予以系统梳理与归纳,旨在为日后的复习与深化理解提供一份便捷且精炼的参考。
一、固定模板
标签两种:{{}} []
代码
第一部分
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("attendanceYear",bizContractorAttendance.getAttendanceYear());
map.put("attendanceMonth",bizContractorAttendance.getAttendanceMonth());
map.put("contractName",bizContractorAttendance.getContractName());
map.put("contractCode",bizContractorAttendance.getContractCode());
map.put("contractorName",bizContractorAttendance.getContractorName());
map.put("management",bizContractorAttendance.getManagement());
集合部分
List<BizContractorAttendanceRecordRemark> remarks = baseMapper.getWatchSummaryExport(attendanceId);
map.put("remarks",remarks);
ConfigureBuilder builder = Configure.builder();
Configure configure = builder.build();
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
builder.bind("remarks", policy);
ConfigureBuilder builder = Configure.builder();
Configure configure = builder.build();
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
builder.bind("remarks", policy);
获得的remarks包含模板{{remarks}}中的序号、岗位、人数、人月数、备注等数据
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/attendance_summary_template.docx");
ServletOutputStream outputStream = response.getOutputStream();
XWPFTemplate template = XWPFTemplate.compile(inputStream,configure).render(map);
String fileName=“自定义”
response.reset();
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ";filename*=utf-8''" + URLEncoder.encode(fileName, "UTF-8"));
outputStream.flush();
outputStream.close();
template.close();
二、动态列
标签{{#table}}
HashMap<String, Object> map = new HashMap<>();
动态生成表头
List<String> titleList = new TreeList<>();
titleList.add("序号");
titleList.add("管理处室");
titleList.add("岗位");
if (sortedQuarter.contains("1")){
titleList.add( 1 + "月人月数");
titleList.add(2 + "月人月数");
titleList.add(3 + "月人月数");
}
if (sortedQuarter.contains("2")){
titleList.add( 4 + "月人月数");
titleList.add( 5 + "月人月数");
titleList.add( 6 + "月人月数");
}
// 表头渲染
String[] cell = new String[titleList.size()];
for (int z = 0; z < titleList.size(); z++) {
cell[z] = titleList.get(z);
}
//标题行创建 居中 黑色
RowRenderData tableHead = Rows.of(cell).center().bgColor("FFFFFF").create();
List<String> nameList=new ArrayList<>();
for (int q=0;q< attendances.size();q++){
nameList.add(attendances.get(q).getManagement());
}
List<RowRenderData> renderDataList = new TreeList<>();
for (int a = 0; a < nameList.size(); a++) {
BizContractorAttendance biz = attendances.get(a);
List<String> list = new TreeList<>();
list.add(a + 1 + "");
list.add(nameList.get(a));
list.add(biz.getPost());
if (sortedQuarter.contains("1")){
list.add(biz.getTotal1().toString());
list.add(biz.getTotal2().toString());
list.add(biz.getTotal3().toString());
num1= NumberUtil.add(biz.getTotal1(), biz.getTotal2(),biz.getTotal3());
}
if (sortedQuarter.contains("2")){
list.add(biz.getTotal3().toString());
list.add(biz.getTotal4().toString());
list.add(biz.getTotal5().toString());
num2= NumberUtil.add(biz.getTotal4(), biz.getTotal5(),biz.getTotal6());
}
}
String[] rowData = new String[list.size()];
for (int j = 0; j < list.size(); j++) {
rowData[j] = list.get(j);
}
RowRenderData row = Rows.of(rowData).center().create();
renderDataList.add(row);
}
// 表格行 构建
RowRenderData[] tableRows = new RowRenderData[renderDataList.size() + 1];
// 添加标题行
tableRows[0] = tableHead;
// 添加数据行
for (int s = 0; s < renderDataList.size(); s++) {
tableRows[s + 1] = renderDataList.get(s);
}
map.put("table", Tables.of(tableRows).center().create());
注意:有多少行数据是根据nameList集合元素的多少来判断的;
在创建表头与表数据的时候,都有把集合转成数组的步骤,好处:可以提高数据访问速度、方便索引访问、便于数据传递。