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

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

代码实现为:

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;

}

}

生成文件为:

 示例生成文件下载

模板式表格.docx

[转]docx4j实现动态表格(模板式)的更多相关文章

  1. PHPWord中文乱码、单元格合并、动态表格模板解决方案合集

    摘要:  最近一个项目开发要用到PHP技术导出Word文档,采用PHPWord插件,版本为0.6.2 beta,CodePlex已停止维护.网上还有另外一个版本的PhpWord,项目类名大小写上略有不 ...

  2. java 读写word java 动态写入 模板文件

    import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import ja ...

  3. Java利用poi生成word(包含插入图片,动态表格,行合并)

    转(小改): Java利用poi生成word(包含插入图片,动态表格,行合并) 2018年12月20日 09:06:51 wjw_11093010 阅读数:70 Java利用poi生成word(包含插 ...

  4. 在<s:iterator>标签里给动态表格添加序号

    在<s:iterator>标签里给动态表格添加序号,需要用到<s:iterator>标签里的Status属性里的count eg:<s:iterator value=&q ...

  5. HTML5&CSS3经典动态表格

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 5.11-5.15javascript制作动态表格

    制作动态表格的主要是运用js中表格类的insertRow.insertCell简易添加行和列的代码,不过要注意每行添加的表格是有位置行编号的,每行的编号为rows.length-1,增加的表格内的标签 ...

  7. C++ dll调用-动态(显式)

    C++ dll调用-动态(显式) 废话不说上代码, dll 头文件 j_test.h #pragma once extern "C"_declspec(dllexport) voi ...

  8. arcgis api 3.x for js 入门开发系列二十一气泡窗口信息动态配置模板

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  9. Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)

    Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成) 动态表单生成 ElementUI官网引导 Element表单生成 Element动态增减表单,在线代码 关键配置 templa ...

随机推荐

  1. ML-线性 SVM 推导

    Max Margin svm 即Suport Vector Machine, 中文意为:支持向量机. 对于二分类问题, 在样本空间中(即便是多维向量, 在空间中可表示为一个点). svm的核心思想就是 ...

  2. MyCat教程四:实现读写分离

    本文我们来给大家介绍下通过MyCat来实现MySQL的读写分离操作 MyCat读写分离 一.读写分离配置   前面我们已经介绍过了mysql的主从同步和mycat的安装及相关配置文件的介绍,现在我们来 ...

  3. mac php thinkphp5 验证码报错 Call to undefined function think\captcha\imagettftext()

    百度一下,是GD库里缺少了freetype支持,然后各种拓展的方法都试了半天,php-v里都生效了,phpinfo里还是不生效,原来是各种文章里都缺少了最关键的一步,修改Apache的配置(我使用的是 ...

  4. MySQL的JOIN连接

    MySQL的JOIN join的含义跟英文单词"join"一样,连接连接两张表.分为 内连接:inner join 外连接   (1)左外连接(左边的表不加限制):left joi ...

  5. X509Certificate 类

    地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.security.cryptography.x509certificates.x509cer ...

  6. JQuery学习笔记之属性与样式

    .attr()与.removeAttr() attr()有4个表达式 attr(传入属性名):获取属性的值 attr(属性名, 属性值):设置属性的值 attr(属性名,函数值):设置属性的函数值 a ...

  7. nginx部署vue项目

    nginx是一个高性能的HTTP和反向代理服务器.因此常用来做静态资源服务器和后端的反向代理服务器.本文主要记录使用nginx去部署使用vue搭建的前端项目,项目基于vue官方的脚手架vue-cli构 ...

  8. C语言入门hello world

    1.安装软件 c语言开发工具众多,初学者推荐使用Dev-Cpp 5.6.3 TDM-GCC x64 4.8.1 Setup.exe:安装过程全部默认安装即可. 2.使用Dev-Cpp编写第一个入门实例 ...

  9. 获取浏览器名称与版本checkbrowse()

    function checkbrowse() { var ua = navigator.userAgent.toLowerCase(); var is = (ua.match(/\b(chrome|o ...

  10. SG函数的理解集应用

    转载自知乎牛客竞赛——博弈论入门(函数讲解+真题模板) SG函数 作用 对于一个状态i为先手必胜态当且仅当SG(i)!=0. 转移 那怎么得到SG函数尼. SG(i)=mex(SG(j))(状态i可以 ...