8、docx4j实现动态表格(模板式)

http://www.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

 示例生成文件下载

 

icon_txt.gif模板式表格.docx

转载于:https://my.oschina.net/haiyangyiba/blog/2247141

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值