解决Poi-tl动态生成表格(行列都不确定的情况)

1、新增策略DetailTablePolicy,继承于抽象表格策略DynamicTableRenderPolicy

/**
 * 自定义动态表格
 * 重写render方法
 */
public class DetailTablePolicy extends DynamicTableRenderPolicy {
    @Override
    public void render(XWPFTable table, Object data) throws Exception {
        if(null == data) return;
        List<Map<String, Object>> targetRowData = (List<Map<String, Object>>) data;

        if(ObjectUtil.isNotEmpty(targetRowData) && targetRowData.size()>0){
            table.removeRow(0);
            //循环插入行数据
            for (int i = 0; i < targetRowData.size(); i++) {
                //第一行是标题行
                XWPFTableRow xwpfTableRow = table.insertNewTableRow(i);
                //循环列 row-cell
                Boolean flag = false;
                for (Map.Entry vo:targetRowData.get(i).entrySet()) {
                    XWPFTableCell cell = xwpfTableRow.createCell();
                    //单元格赋值
                    cell.setText(vo.getValue().toString());
                    //单元格文字居中
                    CTTc cttc = cell.getCTTc();
                    //文字垂直位置
                    cttc.addNewTcPr().addNewVAlign().setVal(STVerticalJc.CENTER);
                    //非标题行第一列文字居中,其他列文字居右
                    if(i == 0){
                        //文字水平位置
                        cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
                    }else{
                        //文字水平位置
                        if(flag == false){
                            cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
                        }else{
                            cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.RIGHT);
                        }
                    }
                    flag = true;
                }
            }
        }
    }

}

2、调用我们重写的策略,report2.docx是我们的模板,模板里面的表格样式需要我们自定义,poi-tl技术主要针对的是数据处理问题

 

XWPFTemplate template = null;
InputStream templateInputStream = null;
File docFile = null;

String fileName = "report2.docx";
templateInputStream = this.getClass().getClassLoader().getResourceAsStream("word/" + fileName);
if (null == templateInputStream) {
    return JsonBean.returnResponse(false, ResultCode.SERVER_ERROR, "模板文件不存在");
}
ConfigureBuilder builder = Configure.builder();
//配置为SpEL模式
builder.useSpringEL();
//除了标签前后缀外的任意字符
builder.buildGrammerRegex(RegexUtils.createGeneral("{{", "}}"));

builder.bind("targetRowData",new DetailTablePolicy());

template = XWPFTemplate.compile(templateInputStream, builder.build());
template.render(args);
//输出到文件
String dir ="路径";
String docName = "报告.docx";
docFile = new File(dir, docName);
template.writeToFile(docFile.getAbsolutePath());

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
poi-tl是一个用于生成Word文档的Java模板引擎,它可以方便地创建和操作Word表格。在使用poi-tl生成Word表格时,你需要添加以下依赖到你的项目中: ```xml <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.10.0</version> </dependency> ``` 通过使用poi-tl提供的API,你可以轻松地创建和设置表格的样式。例如,如果你想要整行加粗,可以使用`textBold()`方法来设置行数据的样式。以下是一个示例代码: ```java RowRenderData titleRow = Rows.of(firstLine.getTitle(), null, null, null, null, null).textBold().create(); ``` 如果你想要指定特定单元格的样式,比如让表格中每一行的第二列内容加粗并且为红色字体,你可以使用以下方法: ```java CellStyle boldAndRedTextStyle = new CellStyle(); boldAndRedTextStyle.setDefaultParagraphStyle(ParagraphStyle.builder().withDefaultTextStyle(Style.builder().buildColor("FF00000").buildBold().build()).build()); for (RowRenderData rowRenderData : tableRenderData.getRows()) { rowRenderData.getCells().get(1).setCellStyle(boldAndRedTextStyle); } ``` 这样,你就可以使用poi-tl生成带有特定样式的Word表格了。 #### 引用[.reference_title] - *1* [java通过poi-tl模板引擎生成表格(Word)](https://blog.csdn.net/qq_45731464/article/details/119247125)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [[编程] POI-TL 根据模版生成Word文档的一些使用技巧汇总](https://blog.csdn.net/lmcboy/article/details/128216186)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值