通过poi-tl实现报告的循环导出

客户需求需要自动生成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的内部属性。

poi-tl是一个基于POIJava模板引擎,可以用于导出Word文档。在poi-tl中,可以使用foreach指令实现循环,并根据需要循环输出列表行和列。 在poi-tl中,可以将需要循环的数据存储在一个List对象中,然后使用foreach指令进行循环遍历。假设我们有一个List<RowData>对象,其中RowData是自定义的类,用于表示每一行的数据。RowData类中可以包含一些属性,代表每一行中的不同列。 首先,我们需要在Word模板中使用foreach指令,来循环输出列表行和列。可以使用标签${foreach items=listVar item=rowVar}和${end}将需要循环的部分包围起来。其中listVar是存储数据的List对象的名称,rowVar是循环过程中每一行数据的临时变量名。 然后,在foreach指令中,可以使用${rowVar.property}的方式获取每一行的属性值,来完成对列表行和列的输出。property代表RowData类中的某一个属性的名称。 最后,使用poi-tl提供的模板渲染引擎,将数据填充到Word模板中,生成目标Word文档。 综上所述,利用poi-tl可以很方便地循环输出列表行和列。首先需要准备好存储数据的List对象,并在Word模板中使用foreach指令进行循环遍历。然后,在循环过程中使用${rowVar.property}的方式获取每一行的属性值,完成对列表行和列的输出。最终,使用poi-tl提供的模板渲染引擎将数据填充到Word模板中,生成目标Word文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值