zoukankan      html  css  js  c++  java
  • [转]docx4j实现动态表格(模板式)

    原文地址:https://chendd.cn/information/viewInformation/other/257.a

    除了前篇文章中讲到的编程式创建表格外,基于模板实现的列表表格也是非常常用或者有用的,前面的文章中我也说过关于模板我只实现基于jxel模板引起的解析方式,故本篇文章中的示例为实现一个静态表格数据和动态循环列表数据的实现,以及基于模板式表格的样式调整,参考模板截图如下:

    blob.png

    代码实现为:

        package cn.chendd.docx4j.examples;

         

        import java.io.File;

        import java.util.ArrayList;

        import java.util.HashMap;

        import java.util.List;

        import java.util.Map;

         

        import org.docx4j.Docx4J;

        import org.docx4j.TraversalUtil;

        import org.docx4j.XmlUtils;

        import org.docx4j.finders.ClassFinder;

        import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

        import org.docx4j.wml.Tbl;

        import org.docx4j.wml.Tr;

         

        public class TableTemplateTest {

         

        public static void main(String[] args) throws Exception {

             

              String templatePath = System.getProperty("user.dir") + "/template/模板式表格_template.docx";

              String outPath = System.getProperty("user.dir") + "/template/out/模板式表格.docx";

              WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(newjava.io.File(templatePath));

              HashMap<String, String> mappings = new HashMap<String, String>();

              //构造非循环格子的表格数据

              mappings.put("name", "马参军");

              mappings.put("sex", "男");

              mappings.put("skill", "散谣:三人成虎事多有");

              //构造循环列表的数据

              ClassFinder find = new ClassFinder(Tbl.class);

              new TraversalUtil(wordMLPackage.getMainDocumentPart().getContent(), find);

              Tbl table = (Tbl) find.results.get(1);

              Tr dynamicTr = (Tr) table.getContent().get(1);//第二行约定为模板

              String dynamicTrXml = XmlUtils.marshaltoString(dynamicTr);//获取模板行的xml数据

              List<Map<String , Object>> dataList = getDataList();

              for (Map<String, Object> dataMap : dataList) {

                 Tr newTr = (Tr) XmlUtils.unmarshallFromTemplate(dynamicTrXml, dataMap);//填充模板行数据

                 table.getContent().add(newTr);

              }

              //删除模板行的占位行

              table.getContent().remove(1);

              wordMLPackage.getMainDocumentPart().variableReplace(mappings);//设置全局的变量替换

              Docx4J.save(wordMLPackage, new File(outPath));

           }

         

           //构造循环数据

           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("item.number", "1");m1.put("item.name", "关银萍");

              m1.put("item.sex", "女");m1.put("item.skill", "来吧,青龙偃月刀");

              dataList.add(m1);

              Map<String , Object> m2 = new HashMap<String , Object>();

              m2.put("item.number", "2");m2.put("item.name", "马云禄");

              m2.put("item.sex", "女");m2.put("item.skill", "啥玩意,手里方片摸牌,占位占位看到换行的样式效果,占位占位看到换行的样式效果");

              dataList.add(m2);

              Map<String , Object> m3 = new HashMap<String , Object>();

              m3.put("item.number", "3");m3.put("item.name", "张星彩");

              m3.put("item.sex", "女");m3.put("item.skill", "长缨在手,擦擦擦擦");

              dataList.add(m3);

             

              return dataList;

           }

          

        }

    生成文件为:

    blob.png

     示例生成文件下载

    模板式表格.docx

  • 相关阅读:
    捕获mssqlservice 修改表后的数据,统一存储到特定的表中,之后通过代码同步两个库的数据
    有关求第n位xxx 的算法的问题
    C#获取枚举的特性描述工具方法
    wpf中嵌入另一个子进程exe像本地的一个页面那样
    emit 实现动态类,动态实现接口
    EF 支持泛型动态加载类访问数据库
    C# 通过 参数返回 C++ 指针
    C# 接收C++ dll 可变长字节或者 字符指针 char*
    健身篇
    Ubuntu 16.04安装Docker-Compose 与 Can't connect to docker from docker-compose
  • 原文地址:https://www.cnblogs.com/dirgo/p/11968724.html
Copyright © 2011-2022 走看看