[转]docx4j实现动态表格(模板式)
原文地址: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;
}
}
生成文件为:

示例生成文件下载
[转]docx4j实现动态表格(模板式)的更多相关文章
- PHPWord中文乱码、单元格合并、动态表格模板解决方案合集
摘要: 最近一个项目开发要用到PHP技术导出Word文档,采用PHPWord插件,版本为0.6.2 beta,CodePlex已停止维护.网上还有另外一个版本的PhpWord,项目类名大小写上略有不 ...
- java 读写word java 动态写入 模板文件
import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import ja ...
- Java利用poi生成word(包含插入图片,动态表格,行合并)
转(小改): Java利用poi生成word(包含插入图片,动态表格,行合并) 2018年12月20日 09:06:51 wjw_11093010 阅读数:70 Java利用poi生成word(包含插 ...
- 在<s:iterator>标签里给动态表格添加序号
在<s:iterator>标签里给动态表格添加序号,需要用到<s:iterator>标签里的Status属性里的count eg:<s:iterator value=&q ...
- HTML5&CSS3经典动态表格
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 5.11-5.15javascript制作动态表格
制作动态表格的主要是运用js中表格类的insertRow.insertCell简易添加行和列的代码,不过要注意每行添加的表格是有位置行编号的,每行的编号为rows.length-1,增加的表格内的标签 ...
- C++ dll调用-动态(显式)
C++ dll调用-动态(显式) 废话不说上代码, dll 头文件 j_test.h #pragma once extern "C"_declspec(dllexport) voi ...
- arcgis api 3.x for js 入门开发系列二十一气泡窗口信息动态配置模板
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成) 动态表单生成 ElementUI官网引导 Element表单生成 Element动态增减表单,在线代码 关键配置 templa ...
随机推荐
- 第一册: lesson 129。
原文: Seventy miles an hour. question: What does Ann advise her husband to do next time? Look,Gary! Th ...
- “GIS DICTIONARY A-Z” 查询页面开发(1)——bs4与词典数据处理
第一天的工作:找到数据源,数据下载,数据处理. 数据源:"http://webhelp.esri.com/arcgisserver/9.3/java/geodatabases/definit ...
- 海思3519A 开发环境设置相关
设置板卡和虚拟机的网络参数 setenv serverip 192.168.1.107 setenv ipaddr 192.168.1.10 setenv gatewayip 192.168.1.1 ...
- 云服务器 - 定时备份MariaDB/MySQL
数据库数据备份尤为重要,而我们不会人工手动去备份,这样会很麻烦,我们都是通过服务器每日自定运行来做的,设置一个定时时间即可 首先我们看一下mysqldump这个文件的位置: 可以看到目录在 /usr/ ...
- 【转】UItraEdit破解
安装UltraEdit(一路下一步,无难点)成功后,打开软件弹出如下使用模式提示信息. 关掉UltraEdit软件,同时 断本机网络.重新打开UltraEdit软件: 点击[输入许可证密 ...
- URI与URL详解
URL 与 URI 很多人会混淆这两个名词. URL:(Uniform/Universal Resource Locator 的缩写,统一资源定位符). URI:(Uniform Resource I ...
- 201671030120 王晶 实验十四 团队项目评审&课程学习总结
项目 内容 课程名称 2016级计算机科学与工程学院软件工程(西北师范大学) 作业要求 实验十四 团队项目评审&课程学习总结 作业学习目标 (1)掌握软件项目评审会流程:(2)反思 ...
- DT添加七牛云对象存储插件功能
七牛云对象存储 1.注意客户购买的空间的存储区域,区域不同对应的上传域名不同 destoon 七牛云上传文件 用下面源码替换include/ftp.class.php 文件代码 &l ...
- python应用-表格式输出一组数据
def main(): names=['关羽','张飞','赵云','马超','貂蝉'] subjects=['语文','数学','Python'] table=[[0 for _ in range( ...
- java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 是引用对象的地址值不能变,引用变量所指向的对象的内容是可以改变. final变量永远指向这个对象,是一个常量指针,而 ...