[轉]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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM