【Poi-tl Documentation】自定义行删除标签

文章介绍了如何使用ApachePOI库中的CustomRenderPolicy类来定制Word文档模板,删除指定行,并处理由于占位符策略冲突导致的错误。作者提供了清除占位符和捕获异常的解决方案。
摘要由CSDN通过智能技术生成

前置说明:

<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.12.1</version>
</dependency>

模板样式:
删除行表格测试.docx
image.png
实现思路:通过定制占位符,然后将占位符所在的行进行删除。

@Slf4j
public class CustomRenderPolicy implements RenderPolicy {

    @Override
    public void render(ElementTemplate elementTemplate, Object o, XWPFTemplate xwpfTemplate) {
        log.info("=====================CustomRenderPolicy=====================");
        RunTemplate runTemplate = (RunTemplate) elementTemplate;
        XWPFRun run = runTemplate.getRun();
        XWPFTableCell cell = (XWPFTableCell) ((XWPFParagraph) run.getParent()).getBody();
        int rowIndex = getRowIndex(cell.getTableRow());
        XWPFTable table = cell.getTableRow().getTable();
        // 问题1:
        table.removeRow(rowIndex);

    }

    private int getRowIndex(XWPFTableRow row) {
        List<XWPFTableRow> rows = row.getTable().getRows();
        return rows.indexOf(row);
    }
}


import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.render.RenderContext;
import com.deepoove.poi.xwpf.BodyContainer;
import com.deepoove.poi.xwpf.BodyContainerFactory;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import run.siyuan.poi.tl.policy.CustomRenderPolicy;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) throws IOException {
        // 读取模板文件
        FileInputStream fileInputStream = new FileInputStream("/Users/wuzhiqian/Desktop/HY/删除行表格测试.docx");

        // 创建模板配置
        ConfigureBuilder configureBuilder = Configure.builder();
        // 问题1 处理方案
        configureBuilder.setValidErrorHandler(new Configure.ClearHandler(){
            @Override
            public void handler(RenderContext<?> context) {
                System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
                try {
                    XWPFRun run = context.getRun();
                    run.setText("/");
                    BodyContainer bodyContainer = BodyContainerFactory.getBodyContainer(run);
                    bodyContainer.clearPlaceholder(run);
                } catch (Exception e) {
                    System.out.println("标签不存在-------------------------------------------");
                }
            }
        });
        configureBuilder.addPlugin('!', new CustomRenderPolicy());

        // 创建模板上下文
        Map<String, Object> context = new HashMap<>();
        context.put("a", "a");

        // 使用模板引擎替换文本标签
        XWPFTemplate compile = XWPFTemplate.compile(fileInputStream, configureBuilder.build());
        compile.render(context);

        // 保存生成的文档
        FileOutputStream outputStream = new FileOutputStream("/Users/wuzhiqian/Desktop/HY/删除行表格测试_" + System.currentTimeMillis() + ".docx");
        compile.write(outputStream);
        outputStream.close();

        compile.close();
        fileInputStream.close();
    }
}

遇到的问题:
错误1:定制的占位符是 !开头的,而模板文件中后面还存在一个 {{aaaaaa}} 占位符, 此时调用删除行同样会把 {{aaaaaa}} 删除,而 {{aaaaa}} 是一个文本占位符对应的策略TextRenderPolicy,当该测路执行的时候发现该占位符没有对应值,则会执行错误处理,默认情况下的默认处理是:

    public static class ClearHandler implements ValidErrorHandler {
        public ClearHandler() {
        }

        public void handler(RenderContext<?> context) {
            XWPFRun run = context.getRun();
            BodyContainer bodyContainer = BodyContainerFactory.getBodyContainer(run);
            bodyContainer.clearPlaceholder(run);
        }
    }

在调用context.getRun();方法的时候就会发现 {{aaaaa}} 已经被删除了,才会报错。
处理方案:就是对会报错的方法进行处理,我这里是进行了捕获。

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值