poi导出word(普通版/动态列)

本文讲述了作者如何使用poi技术将业务数据如合同信息和考勤记录导出到Word文档,包括固定模板的使用以及动态列的生成,通过HashMap和List操作数据,最后利用XWPFTemplate进行渲染并实现文件下载。
摘要由CSDN通过智能技术生成

持续学习乃进步之源泉,于此,我决定将个人在运用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集合元素的多少来判断的;

在创建表头与表数据的时候,都有把集合转成数组的步骤,好处:可以提高数据访问速度、方便索引访问、便于数据传递。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值