1.用Microsoft Office Word打开word原件;

2.把需要动态修改的内容替换成***,如果有图片,尽量选择较小的图片几十K左右,并调整好位置;

3.另存为,选择保存类型Word 2003 XML 文档(*.xml)【这里说一下为什么用Microsoft Office Word打开且要保存为Word 2003XML,本人亲测,用WPS找不到Word 2003XML选项,如果保存为Word XML,会有兼容问题,避免出现导出的word文档不能用Word 2003打开的问题】;

4.用Firstobject free XML editor打开文件,选择Tools下的Indent【或者按快捷键F8】格式化文件内容。左边是文档结构,右边是文档内容;

5. 将文档内容中需要动态修改内容的地方,换成freemarker的标识。其实就是Map<String, Object>中key,如${landName};

6.在加入了图片占位的地方,会看到一片base64编码后的代码,把base64替换成${image},也就是Map<String, Object>中key,值必须要处理成base64;

  代码如:<w:binData w:name="wordml://自定义.png" xml:space="preserve">${image}</w:binData>

  注意:“>${image}<”这尖括号中间不能加任何其他的诸如空格,tab,换行等符号。

  如果需要循环,则使用:<#list maps as map></#list>  maps是Map<String, Object>中key,值为数组,map为自定义;

7. 标识替换完之后,模板就弄完了,另存为.ftl后缀文件即可。注意:一定不要用word打开ftl模板文件,否则xml内容会发生变化,导致前面的工作白做了。

导出到本地:

  1. import java.io.BufferedWriter;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.InputStream;
  7. import java.io.OutputStreamWriter;
  8. import java.io.Writer;
  9. import java.net.HttpURLConnection;
  10. import java.net.URL;
  11. import java.text.SimpleDateFormat;
  12. import java.util.ArrayList;
  13. import java.util.Date;
  14. import java.util.HashMap;
  15. import java.util.List;
  16. import java.util.Map;
  17.  
  18. import com.aspose.words.Document;
  19. import com.aspose.words.License;
  20. import com.aspose.words.SaveFormat;
  21.  
  22. import freemarker.template.Configuration;
  23. import freemarker.template.Template;
  24. import sun.misc.BASE64Encoder;
  25.  
  26. public class WordTest {
  27.  
  28. // 此目录路径 要求 完整的路径,并且 windows 不能以 /开头 如 : /c:/xxx/xxx
  29. static URL freemarker = WordTest.class.getClassLoader().getResource("freemarker");
  30. static String freemarkerPath = freemarker != null ? new File(freemarker.getFile()).getAbsolutePath() : new File("freemarker").getAbsolutePath();
  31.  
  32. //去除PDF水印文件
  33. static URL aspose = WordTest.class.getClassLoader().getResource("freemarker");
  34. static String asposePath = freemarker != null ? new File(freemarker.getFile()).getAbsolutePath() : new File("freemarker").getAbsolutePath();
  35.  
  36. public static void main(String[] args) {
  37. WordTest wordTest = new WordTest();
  38. SimpleDateFormat sdf = new SimpleDateFormat("MMdd");
  39. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日");
  40. SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日HH时mm分");
  41. SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy.MM.dd");
  42. Date date = new Date();
  43. // 要填充的数据, 注意map的key要和word中${xxx}的xxx一致
  44. Map<String, Object> dataMap = new HashMap<String, Object>();
  45. List<Object> list = new ArrayList<Object>();
  46. for (int i = 0; i < 10; i++) {
  47. WordUser word = new WordUser();
  48. word.setImgEntityId(new Long(i));
  49. word.setImgEntityName("目标" + i);
  50. word.setLeftUpLatitude(231.342 + i * 10);
  51. word.setLeftUpLongitude(234.32425 + i * 10);
  52. list.add(word);
  53. }
  54. dataMap.put("date", sdf.format(date));
  55. dataMap.put("dateTime", sdf1.format(date));
  56. dataMap.put("organicName", "国有控股");
  57. dataMap.put("picCreateTime", sdf1.format(new Date()));
  58. dataMap.put("picCreateTime2", sdf2.format(new Date()));
  59. dataMap.put("picCreateTime3", sdf3.format(new Date()));
  60. dataMap.put("imgTypeName", "E-22战斗机");
  61. dataMap.put("imgRootName", "无人机");
  62. dataMap.put("imgEntity", "飞机、战斗机、歼-22、隐形战机");
  63. dataMap.put("list", list);
  64.  
  65. dataMap.put("station2", "先空下来");
  66. dataMap.put("coordinate", "先空下来");
  67. dataMap.put("thematicWords", "境外低轨侦察卫星");
  68.  
  69. dataMap.put("imgStr", wordTest.getImageStr2("http://47.93.82.37:8180/1.png"));
  70. // dataMap.put("imgStr", wordTest.getImageStr("/Users/macbook/Documents/1.png"));
  71. try {
  72. wordTest.exportSimpleWord(dataMap);
  73. }
  74. catch (Exception e) {
  75. e.printStackTrace();
  76. }
  77. }
  78.  
  79. public void exportSimpleWord(Map<String, Object> dataMap) throws Exception {
  80. // Configuration用于读取ftl文件
  81. Configuration configuration = new Configuration();
  82. configuration.setDefaultEncoding("utf-8");
  83.  
  84. /*
  85. * 以下是两种指定ftl文件所在目录路径的方式, 注意这两种方式都是 指定ftl文件所在目录的路径,而不是ftl文件的路径
  86. */
  87. // 指定路径的第一种方式(根据某个类的相对路径指定)
  88. // configuration.setClassForTemplateLoading(this.getClass(),"");
  89.  
  90. // 指定路径的第二种方式,我的路径是C:/a.ftl
  91. configuration.setDirectoryForTemplateLoading(new File(freemarkerPath));
  92.  
  93. // 创建临时文件
  94. // File outFile = File.createTempFile("pattern", ".docx");
  95.  
  96. // 输出文档路径及名称
  97. File outFile = new File("/Users/macbook/Documents/test1.doc");
  98.  
  99. // 以utf-8的编码读取模版ftl文件
  100. Template t = configuration.getTemplate("test4.ftl", "utf-8");
  101. Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 10240);
  102. t.process(dataMap, out);
  103. out.close();
  104. // 删除临时文件
  105. // outFile.delete();
  106.  
  107. // word文档转换成PDF
  108. String wordPath = "/Users/macbook/Documents/test1.doc";
  109. doc2pdf(wordPath);
  110. }
  111. // 获取图片流
  112. public String getImageStr2(String imgPath) {
  113. ByteArrayOutputStream data = new ByteArrayOutputStream();
  114. try {
  115. URL url = new URL(imgPath);
  116. byte[] by = new byte[1024];
  117. // 创建链接
  118. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  119. conn.setRequestMethod("GET");
  120. conn.setConnectTimeout(60 * 1000);
  121. InputStream is = conn.getInputStream();
  122. // 将内容读取内存中
  123. int len = -1;
  124. while ((len = is.read(by)) != -1) {
  125. data.write(by, 0, len);
  126. }
  127. // 关闭流
  128. is.close();
  129. }
  130. catch (Exception e) {
  131. e.printStackTrace();
  132. }
  133. BASE64Encoder encoder = new BASE64Encoder();
  134. return encoder.encode(data.toByteArray());
  135. }
  136.  
  137. // word转PDF
  138. public void doc2pdf(String wordPath) {
  139. // if (!getLicense()) { // 验证License 若不验证则转化出的pdf文档会有水印产生
  140. // return;
  141. // }
  142. try {
  143. long old = System.currentTimeMillis();
  144. File file = new File("/Users/macbook/Documents/test1.pdf"); // 新建一个空白pdf文档
  145. FileOutputStream os = new FileOutputStream(file);
  146. Document doc = new Document(wordPath); // Address是将要被转化的word文档
  147. doc.save(os, SaveFormat.PDF);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,
  148. // EPUB, XPS, SWF 相互转换
  149. long now = System.currentTimeMillis();
  150. System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒"); // 转化用时
  151. }
  152. catch (Exception e) {
  153. e.printStackTrace();
  154. }
  155. }
  156.  
  157. // 验证License 若不验证则转化出的pdf文档会有水印产生
  158. public boolean getLicense() {
  159. boolean result = false;
  160. try {
  161. //InputStream is = WordTest.class.getClassLoader().getResourceAsStream("license.xml"); // license.xml应放在..\WebRoot\WEB-INF\classes路径下
  162. InputStream is = new FileInputStream(asposePath+"/license2.xml");
  163. License aposeLic = new License();
  164. aposeLic.setLicense(is);
  165. result = true;
  166. }
  167. catch (Exception e) {
  168. e.printStackTrace();
  169. }
  170. return result;
  171. }
  172.  
  173. }

浏览器直接下载(get请求):

  1. @RequestMapping(value="/investigation/exportWord",method = RequestMethod.GET)
  2. @ResponseBody
  3. public void exportWord(HttpServletRequest request, HttpServletResponse response) {
  4. JSONObject result = new JSONObject();
  5. Long imgPicId = Long.valueOf(request.getParameter("imgPicId"));
  6. // 要填充的数据, 注意map的key要和word中${xxx}的xxx一致
  7. Map<String, Object> dataMap = exportSimpleWordService.exportSimpleWord(imgPicId);
  8. //获取图片类型名称作为文件名
  9. String imgTypeName = (String) dataMap.get("imgTypeName");
  10.  
  11. // Configuration用于读取ftl文件
  12. Configuration configuration = new Configuration();
  13. configuration.setDefaultEncoding("utf-8");
  14.  
  15. // 指定路径我的路径是C:/a.ftl
  16. try {
  17. configuration.setDirectoryForTemplateLoading(new File(freemarkerPath));// 指定ftl所在目录,根据自己的改
  18. response.setContentType("application/msword");
  19. response.setHeader("Content-Disposition", "attachment;filename=\"" + new String((imgTypeName+"侦查要报.doc").getBytes("GBK"), "iso8859-1") + "\"");
  20. response.setCharacterEncoding("utf-8");// 此句非常关键,不然word文档全是乱码
  21. PrintWriter out = response.getWriter();
  22. Template t = configuration.getTemplate("investigation.ftl", "utf-8");// 以utf-8的编码读取ftl文件
  23. t.process(dataMap, out);
  24. out.close();
  25. }
  26. catch (Exception e) {
  27. logger.error("转换成word文档业务服务异常!", e);
  28. result.put("respCode", BaseRspConstants.RSP_CODE_FAILUR);
  29. result.put("respDesc", BaseRspConstants.RSP_DESC_FAILUR);
  30. }
  31.  
  32. // return jsonObject;
  33. }

Java用freemarker导出Word 文档的更多相关文章

  1. Java使用freemarker导出word文档

    通过freemarker,以及JAVA,导出word文档. 共分为三步: 第一步:创建模板文件 第二步:通过JAVA创建返回值. 第三步:执行 分别介绍如下: 第一步: 首先创建word文档,按照想要 ...

  2. freemarker导出word文档——WordXML格式解析

    前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...

  3. freemarker导出word文档

    使用freemarker导出word文档的过程 **************************************************************************** ...

  4. java使用freemarker 生成word文档

      java 生成word文档     最近需要做一个导出word的功能, 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的 ...

  5. 使用Freemarker导出Word文档(包含图片)代码实现及总结

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  6. java使用freemarker生成word文档

    1.原料 开源jar包freemarker.eclipse.一份模板word文档 2.首先设计模板word文档 一般,通过程序输出的word文档的格式是固定的,例如建立一个表格,将表格的标题写好,表格 ...

  7. 使用FreeMarker导出word文档(支持导出图片)

    一.添加maven依赖,导入FreeMarker所需要的jar包 <dependency> <groupId>org.freemarker</groupId> &l ...

  8. java用iText导出word文档

    1.需要导入的jar包 2.导出word并下载其实是分两步的. 第一步是将需要导出的数据导出(上传)到服务器上 第二步是将服务器上的文档下载到本地 3. 第一步.上传文档 (1)设置响应信息以及构造上 ...

  9. Java 用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

随机推荐

  1. Ubuntu 16.04 安装 Django==1.11.8

    vim  InStall-Django.sh #!/bin/bash rm -rf /usr/bin/python ln -s /usr/bin/python3 /usr/bin/python mkd ...

  2. 【路飞学城Day170】算法小结

    Evernote Export 算法的思想是能省则省,内存能少则少,时间运行能少尽量少 堆排序的时间复杂度O(nlogn) 堆排序的内置模块heapq 常用函数 heapify(x) heappush ...

  3. linux系统时间与网络时间不同步

    在解决问题之前,我们首先来了解下面几个知识点: 1. date命令: #date 显示系统时间 2.hwclock命令   (即hardwareclock系统硬件时间) #hwclock 显示硬件时间 ...

  4. kernel 3.10内核源码分析--hung task机制

    kernel 3.10内核源码分析--hung task机制 一.相关知识: 长期以来,处于D状态(TASK_UNINTERRUPTIBLE状态)的进程 都是让人比较烦恼的问题,处于D状态的进程不能接 ...

  5. 使用javadoc 报错:编码GBK的不可映射字符

    运行命令:javadoc Test1.java 报错:编码GBK的不可映射字符 问题原因:类文件中带有非GBK字符 解决办法:javadoc -encoding utf-8 Test1.java

  6. Vue学习之路第十八篇:私有过滤器的使用

    1.上篇已经介绍了全局过滤器的使用,“全局”顾名思义就是一次定义处处使用,可以被一个页面里不同的Vue对象所使用,如下代码所示: <body> <div id="app1& ...

  7. GCJ 2008 Round 1A Minimum Scalar Product( 水 )

    链接:传送门 题意:给两个向量 v1 = { x1 , x2 , x3 , x4 .... } , v2 = { y1 , y2 , y3 , y4 ...... } 允许任意交换 v1 和 v2 各 ...

  8. BZOJ 2161 布娃娃 (主席树)

    题面 想了一个主席树做法 我们把每个区间的两个端点拆开 对$L,R$分别从小到大排序,分别从左到右依次把对应标号的$c_{i}$插入到权值主席树里 每次查询$p_{i}$,在排序后的$L,R$数组上分 ...

  9. java:递归算法

    JAVA中的递归是只一个方法在(满足条件时(或不满足条件时[这里的判断根据业务的实际需求写]))自己调用自己的方法名,要求参数和方法名一致, 然后根据判断跳出该方法,返回相应的返回值! 实例: 我们要 ...

  10. 理解 Javascript 执行上下文和执行栈

    如果你是一名 JavaScript 开发者,或者想要成为一名 JavaScript 开发者,那么你必须知道 JavaScript 程序内部的执行机制.理解执行上下文和执行栈同样有助于理解其他的 Jav ...