docx4j替换模板数据

docx4j

docx4j是一个开源(ASLv2)Java库,用于创建和操作Microsoft Open XML(Word docx,Powerpoint pptx和Excel xlsx)文件;它类似于Microsoft的OpenXML SDK,但适用于Java。docx4j使用JAXB来创建内存中的对象表示。

示例

1. word中创建占位符

如果我要替换word文档中的动态数据,只需把数据用${xxx}形式标注。

这里可能会存在一个问题:
将.docx文档压缩成.zip文档,再xml文件阅读器打开word/document.xml文件,可以看到有可能出现下图占位符被分隔的问题,这样的话,到时候不能被数据替换。

原因:网上有许多,有的说占位符格式不统一;有的说单词校验问题。
解决方法:我刚开始试了把占位符的格式统一,好像没什么用,然后只能在xml文件里一个一个的改,既累又麻烦!最后,把要写的占位符先写到记事本中,然后再复制到word中,这样就不会被分隔。

2.获取模板以及替换数据

import org.docx4j.model.datastorage.migration.VariablePrepare;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;import java.beans.PropertyDescriptor;
import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.*;public class Docx4jDemo1 {public static void main(String[] args) {Map<String, String> data = new HashMap<>();data.put("classname", "三年二班");data.put("total", "50");data.put("male", "30");data.put("female", "20");data.put("name", "小明");data.put("sex", "男");data.put("age", "10");data.put("phone", "13888888888");data.put("address", "中国");data.put("email", "xiaoming@163.com");try {replaceData(data);} catch (Exception e) {e.printStackTrace();}}/*** 加载模板并替换数据** @param data* @return* @throws Exception*/public static void replaceData(Map<String, String> data) throws Exception {final String TEMPLATE_NAME = "D://1.docx";InputStream templateInputStream = new FileInputStream(TEMPLATE_NAME);//加载模板文件并创建WordprocessingMLPackage对象WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(templateInputStream);MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();VariablePrepare.prepare(wordMLPackage);documentPart.variableReplace(data);OutputStream os = new FileOutputStream(new File("D://test.docx"));ByteArrayOutputStream outputStream = new ByteArrayOutputStream();wordMLPackage.save(outputStream);outputStream.writeTo(os);os.close();outputStream.close();templateInputStream.close();}/*** 如果从数据库查出来的是不同对象集合,那么该方法直接把对象的属性和值直接存为Map* 比如示例中可以是两个对象,ClassInfo(className,total,male,female)、student(name,sex,...)* 前提是模板中的占位符一定要和对象的属性名一一对应* @param objlist* @return* @throws Exception*/public HashMap<String, String> toMap(List<Object> objlist) throws Exception {HashMap<String, String> variables = new HashMap<>();String value = "";if (objlist == null && objlist.isEmpty()) {return null;} else {for (Object obj : objlist) {Field[] fields = null;fields = obj.getClass().getDeclaredFields();//删除字段数组里的serialVersionUIDfor (int i = 0; i < fields.length; i++) {fields[i].setAccessible(true);if (fields[i].getName().equals("serialVersionUID")) {fields[i] = fields[fields.length - 1];fields = Arrays.copyOf(fields, fields.length - 1);break;}}//遍历数组,获取属性名及属性值for (Field field : fields) {field.setAccessible(true);String fieldName = field.getName();//如果属性类型是Dateif (field.getGenericType().toString().equals("class java.util.Date")) {PropertyDescriptor pd = new PropertyDescriptor(fieldName, obj.getClass());Method getMethod = pd.getReadMethod();Date date = (Date) getMethod.invoke(obj);value = (date == null) ? "" : new SimpleDateFormat("yyyy-MM-dd").format(date);} else if (field.getGenericType().toString().equals("class java.lang.Integer")) {//如果属性类型是IntegerPropertyDescriptor pd = new PropertyDescriptor(fieldName, obj.getClass());Method getMethod = pd.getReadMethod();Object object = getMethod.invoke(obj);value = (object == null) ? String.valueOf(0) : object.toString();} else if (field.getGenericType().toString().equals("class java.lang.Double")) {//如果属性类型是DoublePropertyDescriptor pd = new PropertyDescriptor(fieldName, obj.getClass());Method getMethod = pd.getReadMethod();Object object = getMethod.invoke(obj);value = (object == null) ? String.valueOf(0.0) : object.toString();} else {PropertyDescriptor pd = new PropertyDescriptor(fieldName, obj.getClass());Method getMethod = pd.getReadMethod();Object object = getMethod.invoke(obj);value = (object == null) ? "  " : object.toString();}variables.put(fieldName, value);}}return variables;}}
}

结果


这些都是一些简单的功能,复杂的后续会有,因为时间关系,只写了这点。这些功能的实现都是前辈们智慧的结晶以及自己的一些探索。有什么不足之处望大家批评指正!感谢大家!

docx4j操作word文档之替换模板数据相关推荐

  1. docx4j操作word文档之生成页码、合并多个文档

    docx4j操作word文档: 动态生成表格行数并填充数据 单元格内填充图片 合并多个word文档(包含页码,纸张方向等等) 1.动态生成表格行数并填充数据 首先创建模板文件.docx,如图: 代码如 ...

  2. 【C#】C#使用Microsoft.Office.Interop.Word操作Word文档,替换文本

    最近要做一个批量打印文档功能,于是找了Microsoft.Office.Interop.Word这个插件. 基本步骤是这样的,创建Word模板文档,C#调用模板文档替换对应的文本,保存新文档. 下面仅 ...

  3. aspose.words 操作 word 文档-文字替换、删除首行、添加水印等方案

    近日,遇到一个需求,需要用到 aspose.words 开处理 word 文档,将调试通过的一些代码和过程记录如下: 相关软件:点击下载 aspose.words.jar 文章目录 一.对 word ...

  4. poi操作word文档(替换,插入图片)

    前段时间项目上要用到一个替换word中的字符以及插入图片并导出的功能,google了一番发现别人的代码跑起来多多少少有些问题,所以就自己照着poi的api写了一个工具类,在此记录下来,如果有需要的朋友 ...

  5. C#使用Aspose.Words操作word文档(利用模板2)

    最近接到个需求,由于客服这边要导出大量有一定规则的word文件,里面的内容希望系统自动填充,例如 这里我使用Aspose.Words.dll这个类库, 1.首先,我们需要创建模板文件,毕竟有规则的东西 ...

  6. 【C#】C#使用Microsoft.Office.Interop.Word操作Word文档,向表格插入图片

    上篇:[C#]C#使用Microsoft.Office.Interop.Word操作Word文档,替换文本 Word模板: 代码: try {Application app = new Applica ...

  7. Aspose.words 操作 word 文档

    Aspose.words 操作 word 文档 文章目录 Aspose.words 操作 word 文档 对文档文字进行替换 对文档插入文本.表格以及删除表格 对文档文字进行替换 /*** 对word ...

  8. npoi word生成HTML,C# 使用NPOI生成Word文档(按照模板)

    项目需要集成word导出,做的时候网上文档资源不是很多,也比较杂乱,所以查了查,整理了整理,做个记录,也顺便把NPOI操作Word文档的一些基本操作分享给有需要的朋友. 本篇包括生成Word对word ...

  9. Java操作Word文档

    Java 生成 Word 的几种方案 参考 ​ 主要有这么一些工具可以使用 Jacob.Apache POI.Java2word.iText,还有一种方法是使用XML作为模板. ​ 使用 XML 的思 ...

  10. poi操作word文档总结

    POI分段落生成纯Word动态模板并导入数据 导出数据,可以用word另存为xml格式的ftl文件,变量用${变量名}表示,然后在类中通过 freemarker去替换变量. 但是怎么导入word数据. ...

最新文章

  1. linux 内核 config_localversion_auto,关于CONFIG_LOCALVERSION_AUTO设置去掉内核版本号SVN后缀...
  2. ICCV 2017 DSiam:《Learning Dynamic Siamese Network for Visual Object Tracking》论文笔记
  3. 魔法函数%matplotlib 解决matplotlib画图在Jupter/IPython中不显示
  4. python requests库作用_python Requests库入门
  5. 【CodeForces - 706C】Hard problem(dp,字典序)
  6. 面向关系数据库的智能索引调优方法
  7. 7.2Python入门(三)
  8. php中sisson用法,session用法
  9. 给Bert加速吧!NLP中的知识蒸馏Distilled BiLSTM论文解读
  10. [转].net中的认证(authentication)与授权(authorization)
  11. 最新关于try ,catch,throw的使用小结
  12. Spring入门篇——第4章 Spring Bean装配(下)
  13. ASP.NET 4揭秘.第1卷
  14. android stagefright
  15. 计算机任务栏的透明颜色设置,详细教您让Win10任务栏全透明_一分钟让Win10任务栏全透明...
  16. 戴尔u盘安装linux系统,戴尔服务器操作系统安装 Centos 系统安装详解教程。
  17. Linux禁用scp和sftp
  18. 计算机画图软件技巧,CAD绘图技巧(一)—速度篇
  19. Reverse Engineering the NC ECU (revisited) -- SH7508
  20. JAVA基础作业练习—自定义异常之模拟ATM

热门文章

  1. k3cloud6.0文件服务器,K3Cloud系统集成配置详解
  2. HFSS----微带天线设计实例之模型建立
  3. 简单易上手的微信电子名片的制作方法!
  4. NetFramework3.5 win10 64位 32位 安装资源——免费下载
  5. word html 预览 打印出来,word预览时文字在表格中,打印出来却没有.doc
  6. Charles抓包安卓端
  7. 南京绿溢大厦远程预付费系统项目的设计与应用-安科瑞耿敏花
  8. 何凯明新作ViTDET:目标检测领域,颠覆分层backbone理念
  9. 斯坦福NLP名课带学详解 | CS224n 第1讲 - NLP介绍与词向量初步(NLP通关指南·完结)
  10. 《如何成为一个会学习的人》