docx4j 实现docx模板字符串替换及嵌套表格实现

  1. 制作word模板
    在这里插入图片描述
  2. 代码
public class test1 {
    private static String inputUrl = "C:\\Users\\Administrator\\Desktop\\xdoc\\test.docx";
    private static String outputUrl = "C:\\Users\\Administrator\\Desktop\\xdoc\\temp.docx";

    public static void main(String[] args) throws Exception {
        WordprocessingMLPackage worldPackage;
        try {
            worldPackage = WordprocessingMLPackage.load(new File(inputUrl));
            MainDocumentPart documentPart = worldPackage.getMainDocumentPart();
            Map<String,String> maps = new HashMap<>();
            maps.put("name", "22222");
            maps.put("sex", "22222");
            maps.put("age", "22");
            //文本域替换
            documentPart.variableReplace(maps);
            ClassFinder find = new ClassFinder(Tbl.class);
            new TraversalUtil(worldPackage.getMainDocumentPart().getContent(), find);
            //获取第一个表格
            Tbl table = (Tbl) find.results.get(0);
            //获取第一行对象
            Tr dynamicTr = (Tr)table.getContent().get(1);
            Tr dynamicTr2 = (Tr)table.getContent().get(2);
            //获取第一行模板xml字符串
            String dynamicTrxml = XmlUtils.marshaltoString(dynamicTr);
            String dynamicTrxml2 = XmlUtils.marshaltoString(dynamicTr2);
            List<Map<String,Object>> data = getDataList();
            //表格替换
            for(Map<String, Object> map :data){
                Tr newTr = (Tr)XmlUtils.unmarshallFromTemplate(dynamicTrxml, map);
                table.getContent().add(newTr);
                //单行循环注释以下五行代码
                List<Map<String, Object>> list = (List<Map<String,Object>>) map.get("list");
                for (Map<String, Object> map1 :list){
                    Tr newTr1 = (Tr)XmlUtils.unmarshallFromTemplate(dynamicTrxml2, map1);
                    table.getContent().add(newTr1);
                }
            }
            //去除模板行
            table.getContent().remove(1);
            table.getContent().remove(1);
            Docx4J.save(worldPackage, new File(outputUrl));
        }catch (Docx4JException e){
            e.printStackTrace();
        }
    }

    private static List<Map<String , Object>> getDataList() {
        List<Map<String , Object>> dataList = new ArrayList<Map<String , Object>>();
        Map<String , Object> m1 = new HashMap<String , Object>();
        m1.put("number", "1");
        m1.put("name", "关银萍");
        m1.put("address", "女");
        m1.put("skill", "来吧,青龙偃月刀");
        dataList.add(m1);
        Map<String , Object> m2 = new HashMap<String , Object>();
        m2.put("number", "2");
        m2.put("name", "马云禄");
        m2.put("address", "女");
        m2.put("skill", "啥玩意,手里方片摸牌,占位占位看到换行的样式效果,占位占位看到换行的样式效果");
        dataList.add(m2);
        Map<String , Object> m3 = new HashMap<String , Object>();
        m3.put("number", "3");
        m3.put("name", "张星彩");
        m3.put("address", "女");
        m3.put("skill", "长缨在手,擦擦擦擦");
        dataList.add(m3);
        Map<String, Object> map;
        map = new HashMap<>();
        map.put("num", "1");
        map.put("test", "2222222222");
        map.put("list", dataList);
        List<Map<String , Object>> data = new ArrayList<Map<String , Object>>();
        data.add(map);
        data.add(map);
        return data;
    }
}
  1. 单行表格循环时注释以下代码
    在这里插入图片描述
  2. 结果
    在这里插入图片描述

注意:

  1. 将docx 转换为xml 检查 $(var)是否被分割
    在这里插入图片描述
    正常情况
    在这里插入图片描述
  2. 多行模板替换 删除模板行时应注意 都是删除第一行
    在这里插入图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值