本文转自:::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. 黑客必知的SQL语句 黑客知道,程序员必知
  2. 纯数学教程 Page 325 例LXVIII (13)
  3. 教表弟用Python写了个“飞机大战”游戏!表弟:可以拜你为师吗?
  4. Winform 自定义窗体皮肤组件
  5. 阿里分布式数据库服务实践
  6. 开菜鸟驿站需要什么条件?投入成本大概要多少?
  7. 图系列(一)图神经网络
  8. Macbook M1电脑安装svn及使用
  9. Python 文本转语音
  10. Xshell颜色及PS1
  11. java myeclipse的好处,关于MyEclipse_MyEclipse用途_MyEclipse优势
  12. 《Evolutionary Computation for Expensive Optimization:A Survey》笔记
  13. router.php,CodeIgniter源码分析[5]——路由类Router.php
  14. Google浏览器简体中文版下载
  15. 一对一直播技术服务【推广】
  16. SAS数据步与过程步,数据步语句
  17. 通俗易懂理解几何光学(二)共轴球面系统与理想光学系统
  18. 学渣的刷题之旅 leetcode刷题 35.搜索插入位置(暴力法、二分查找)
  19. Inception模块
  20. android App 集成 facebook 第三方认证登录

热门文章

  1. Fedora 18 Setup Nvidia Optimus driver
  2. Android开发中用到的第三方框架汇总
  3. MCSE认证考试介绍!(2003版本)
  4. android app字体库,Uni-app使用字体库,在浏览器正常,但是在Android手机,调不到字体库,如何修改呢?...
  5. “洋话连篇”引入红杉树网络培训系统 在职充电不再东奔西走
  6. 用python画熊猫-如何用安德鲁曲线绘制熊猫数据帧?
  7. JAVA面向对象-----继承
  8. delimiter的作用介绍
  9. 67在C51语言表示16进制数,一级笔试试题考核的主要知识点及答案
  10. 使用PIL为图片添加水印[python]