本文转自:::http://hucheng91.github.io/2017/04/09/web/java/freemarker_xdocxreport/

//================================转者附注释=====================================

最近有个问题是,通过freemarker生成的word出现了问题,因为是先把word转换为xml作为模板填充的文件,所以生成的doc的底层还是xml格式的,openoffice转换为的pdf出现了pdf中全是xml格式的问题,后面经过发现了下面这篇博文,完美的解决了我们的问题。

注:我们使用的openoffice,没有使用xdoxreport。这个性能不是很好。所以下面删除了有关xdoxreport的内容

//================================结束==========================================

最近公司有个业务,是要生成pdf形式的合约,合约模版是有十几页的word,根据不同的客户,模版有些地方填入不同的值,然后生成pdf格式的合约。最开始打算用JasperReports,先把这个模版画出来,但是由于模版页数太多,样式很复杂,JasperReports处理起来简直就是噩梦,果断放弃,随后我又调研了doc4j,openoffice;doc4j处理复杂文档也不是太好,加粗的字体都没有显示出来,对office2013不怎么支持,openoffice得单独装一个服务端,很是耗资源,也放弃了;最后我选择了先用freemarker将模版变量填入生成一个docx,在用xdocreport这个库来将docx转换成pdf,成功的实现了,支持office的2007,2013等,而且docx样式也完全保留下来,而且整个过程非常快,不怎么耗费资源,内存;

先介绍下freemarke

  • freemarker是java里一个模版框架,和velocity类似,不仅支持各种xml格式,freemarker地址

然后介绍下我整体的一个思路,MS-Office下的word在2007以后后缀基本是以.docx结尾,是用一种xml格式的在存储数据(.doc是用二进制存储数据),这就为使用freemarker提供的条件,如果把template.docx,重命名成template.zip,再用word一样是可以打开的,如果有WinRAR之类的压缩工具打开会发现如下目录结构

我们用office工具打开看到的内容其事就存放在在这个document.xml里面!,打开看看(document.xml默认是不换行的,我用Nodpad++打开,然后下载nodpad插件Xml-tool格式化后,具体安装可参考Nodepad 格式化xml)在这个xml就是以这种格式存储的数据,只需要将我们需要的内容变成一个变量,然后通过freemarker来解析这xml,让后用解析后的xml,把template.zip里面的document.xml替换掉,然后将这个template.zip解压成data.docx,那么这个data.docx,就包含了我们需要的数

具体操作如下

  1. 处理模版对应的docx
  2. 将test.docx重命名test.zip,将document.xml copy 出来 ,打开 document.xml,
  3. java代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
    /** 初始化配置文件 **/
         Configuration
                 configuration = new Configuration();
         /** 设置编码 **/
         /** 我的ftl文件是放在D盘的**/
         String fileDirectory = "D:/cache/qqChace/T1/xlsx";
         /** 加载文件 **/
         configuration.setDirectoryForTemplateLoading(new File(fileDirectory));
         /** 加载模板 **/
         Template template = configuration.getTemplate("document.xml");
         /** 准备数据 **/
         Map<String,String> dataMap = new HashMap<>();
         /** 在ftl文件中有${textDeal}这个标签**/
    
         dataMap.put("id","黄浦江吴彦祖");
         dataMap.put("number","20");
         dataMap.put("language","java,php,python,c++.......");
         dataMap.put("example","Hello World!");
    
         /** 指定输出word文件的路径 **/
         String outFilePath = "D:/cache/qqChace/T1/xlsx/data.xml";
         File docFile = new File(outFilePath);
         FileOutputStream fos = new FileOutputStream(docFile);
         OutputStreamWriter oWriter = new OutputStreamWriter(fos);
         Writer out = new BufferedWriter(new OutputStreamWriter(fos),10240);
         template.process(dataMap,out);
    
         if(out != null){         out.close();
         }
         // ZipUtils 是一个工具类,主要用来替换具体可以看github工程
         ZipInputStream zipInputStream = ZipUtils.wrapZipInputStream(new FileInputStream(new File("D:/cache/qqChace/T1/xlsx/test.zip")));
            ZipOutputStream zipOutputStream = ZipUtils.wrapZipOutputStream(new FileOutputStream(new File("D:/cache/qqChace/T1/xlsx/test.docx")));
            String itemname = "word/document.xml";
            ZipUtils.replaceItem(zipInputStream, zipOutputStream, itemname, new FileInputStream(new File("D:/cache/qqChace/T1/xlsx/data.xml")));
            System.out.println("success");
    
  4. 生成test.docx如下,这样我通过freeemark生成docx这件事就搞定了

把整个打包成一个工程 ,放到github上https://github.com/hucheng91/freemarker_xdoxreport.git

word的xml 转换为 docx相关推荐

  1. word转换为html为什么图片显示不了,word插入html 转换为docx图片不显示问题

    场景描述 使用mht格式利用freemark将网页上动态输入的图片搞到mht里面,转换为docx格式.其中图片是使用vshape标签展示(网上搜到的),将图片转换为base64写入到mht文件内(具体 ...

  2. Java操作word文档将docx转换为pdf格式

    Java操作word文档将docx转换为pdf格式 一.整体说明 在上传 Office 课件时,格式有:doc,docx,xls,xlsx,ppt,pptx,程序需要将其 转换成 pdf 格式, 才能 ...

  3. doc转docx文件会乱吗_利用python将doc文件转换为docx

    需求:最近在研究word文档的抽取,发现python中docx库只能提取以docx结尾的文件,因此需要将doc文件转换为docx. 基础知识了解 1.什么是doc? 汉语:文档(外语全称:Docume ...

  4. java doc转图片_Java 将word文档转换为PNG、XPS、RTF等格式

    在日常办公中,Word是一种很好的文档排版工具.在Word创建好文档后, 我们常常需要将其保存为PDF.图片或其他格式.本文就将通过使用Java程序来演示如何将Word文档转换为PNG.XPS.RTF ...

  5. Word处理控件Aspose.Words功能演示:使用 Android 库将 Word 文档转换为 PDF

    Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务.API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word.此 ...

  6. Java 将 Word 文档转换为 PDF 的完美工具

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:为什么魂斗罗只有 128 KB却可以实现那么长的剧情?个人原创+1博客:点击前往,查看更多 来源:https:/ ...

  7. docx命令运行Java_使用Java将DOC文件转换为DOCX

    7 个答案: 答案 0 :(得分:3) // Open a document. Document doc = new Document("input.doc"); // Save ...

  8. azw3转换为pdf_干货:如何Java 将 Word 文档转换为 PDF

    在日常工作中,PDF格式良好的视觉阅读性和稳定性使其使用越来越广泛.因此我们常会遇到需要将成型的Word文档转换为PDF格式的情况.本文就将通过使用Java程序来演示如何将Word文档转换成PDF格式 ...

  9. Java将Word文档转换为PDF的完美工具

    引用至:https://mp.weixin.qq.com/s/JIgo3f98HufGJx23mgtvag Java 将 Word 文档转换为 PDF 的完美工具 在日常工作中,PDF格式良好的视觉阅 ...

最新文章

  1. 文件分割 合并 小软件 呵呵
  2. 面向对象笔试题练习一
  3. 学习MVVM设计模式后第一次用于生产
  4. OpenShift 4 之Service Mesh教程(2)- 用Kiali监控微服务运行
  5. oracle11g 端口,navicate 连接 oracle11g精简版监听不到端口和用户密码错误问题
  6. linux tcp文件分包_畅谈linux下TCP(下)
  7. 当你发现你的Alter报错的时候请看看是不是粗心了
  8. 关于雄安新区的一点观察和思考
  9. oracle参数文件与启动过程
  10. MySQL从删库到跑路(3):神奇的select
  11. 网络安全烽火再起 BAT聚头2017 网络安全生态峰会
  12. java画图消除锯齿_java – JButton文本的消除锯齿
  13. Android Studio 连接雷电模拟器
  14. 全国域名注册机构查询
  15. 在linux中DATAX和DATAX-WEB安装指引
  16. 开源项目-CRM客户关系管理系统
  17. 本地环境可以,生产环境不行(持续补充)
  18. 酷开电视能装鸿蒙吗,最新酷开系统电视安装第三方应用教程【全能版】
  19. Math 的 ceil、floor、round方法详解及示例
  20. html 文档大纲是什么意思,word如何对文档设置大纲 word大纲和编号如何统一设置...

热门文章

  1. Linux云计算-01_介绍以及Linux操作系统安装
  2. AD设计产品,手工贴片样机你不知道的小妙招
  3. 浦东将建首个老年人健康数据库 通过大数据预防控制疾病
  4. 搜狗手机助手联合腾讯御安全 共建APP安全生态环境 1
  5. 从1乘到17c语言,《中文笔记》第一册(17c)
  6. 光纤收发器能不能用作量子计算机,【求助】国内的量子计算机除了郭光灿和潘建伟他们还有谁在做啊?...
  7. 电脑硬件知识大全(二)
  8. IP-Spoofing(IP欺骗)
  9. Android 自定义View之随机数验证码(仿写鸿洋)
  10. 常见职位的英文简称_职场中常见的英文缩写是什么意思?4P是哪4P?各个岗位和部门的英文缩写是什么?...