最近一个项目要导出word文档,折腾老半天,发现还是用freemarker的模板来搞比较方便省事,现总结一下关键步骤,供大家参考,这里是一个简单的试卷生成例子。

一、模板的制作

先用Word做一个模板,如下图:

(注意,上面是有表格的,我设置了边框不可见)然后另存为XML文件,之后用工具打开这个xml文件,有人用firstobject XML Editor感觉还不如dreamweaver,我这里用dreamweaver效果如下:

备注的地方基本是我们之后要替换的地方,比如hygc替换为${hygc}

保存后,修改后缀名为ftl,至此模板制作完毕。

二、编程实现

这里用到了freemarker-2.3.13.jar包,代码如下:

package common;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.Map;import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;public class DocumentHandler {private Configuration configuration = null;public DocumentHandler() {configuration = new Configuration();configuration.setDefaultEncoding("utf-8");}public void createDoc(Map<String,Object> dataMap,String fileName) throws UnsupportedEncodingException {//dataMap 要填入模本的数据文件//设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,//这里我们的模板是放在template包下面configuration.setClassForTemplateLoading(this.getClass(), "/template");Template t=null;try {//test.ftl为要装载的模板t = configuration.getTemplate("test.ftl");} catch (IOException e) {e.printStackTrace();}//输出文档路径及名称File outFile = new File(fileName);Writer out = null;FileOutputStream fos=null;try {fos = new FileOutputStream(outFile);OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8");//这个地方对流的编码不可或缺,使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。//out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));out = new BufferedWriter(oWriter); } catch (FileNotFoundException e1) {e1.printStackTrace();}try {t.process(dataMap, out);out.close();fos.close();} catch (TemplateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

然后是准备数据调用就行,代码如下:

package com.havenliu.document;import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class Main {/*** @param args* @throws UnsupportedEncodingException */public static void main(String[] args) throws UnsupportedEncodingException {;Map<String, Object> dataMap = new HashMap<String, Object>();dataMap.put("hymc", "会议名称");
<pre class="java" name="code">      dataMap.put("hygc", test.getStr("hygc").replaceAll("\r\n", "<w:p></w:p>"));
     MDoc mdoc = new MDoc();mdoc.createDoc(dataMap, "E:/outFile.doc");}}

注意上面map中的key必须和模板中的对应,否则会报错。

3、就是在程序中运行,进行变量替换然后输出了。在此又遇到一个问题就是换行的问题。因为在前台写的时候考虑到这个word对某些字符不容,所以用的只是textarea,但是再生成word的时候无法换行。

经查阅资料推测,textarea的换行符应该是"\n",而模板中的换行符推测是“<w:p></w:p>”,于是在程序中改成

dataMap.put("hygc", test.getStr("hygc").replaceAll("\r\n", "<w:p></w:p>"));

此时输出的文档中已经像在textarea中显示的一样换行了。

Java用Freemarker导出word 内容换行相关推荐

  1. Java使用freemarker导出word试卷

    使用了freemarker模板填充占位符的方式来生成word文档,支持跨平台. Java导出Word的五种方式 制作Word模板 将制作好的Word模板.docx另存为.xml格式,修改xml文件的内 ...

  2. java使用freemarker导出word标题失效问题

    java使用freemarker导出word标题失效问题 如图,导出格式错误切目录不可折叠 另存为xml发现 六级标题变成了其他级别:<w:pStyle w:val="60" ...

  3. JAVA使用FreeMarker导出Word工具类

    <!--freemarker word export--><dependency><groupId>org.freemarker</groupId>&l ...

  4. Java用freemarker导出word

    概述 最近一个项目要导出word文档,折腾老半天,发现还是用freemarker的模板来搞比较方便省事,现总结一下关键步骤,供大家参考,这里是一个简单的试卷生成例子. 详细 代码下载:http://w ...

  5. java 使用freemarker 导出word 和图片

    前段时间写了一篇使用itext导出word的博客,并且在项目也是使用itext,我大概了写了2000行左右的样子,然后被经理否决了.最后还是要使用freemarker 模板导出word pom 文件: ...

  6. java通过freemarker导出word文档带图片并且循环

    转载请标明出处: https://blog.csdn.net/weixin_41965979/article/details/80969287 本文出自付付讶的博客 1:所需jar包:freemark ...

  7. Java使用FreeMarker导出word

    最近好多项目都有word导出功能,觉得有必要整理一下知识点 wps可以兼容office,所以最好要用offfice建的doc文件转xml.两边的格式是不一样的. 标签含义感觉html的有点相似,当然还 ...

  8. Java 用 Freemarker 生成 Word 时内容换行

    一.原因 试过各种换行符 '\r' '\n' '\r\n' '(char)11' 全部都不行!!! 原因是:Java 用 Freemarker 生成 Word 时的换行符被自动解析忽略掉 二.解决方法 ...

  9. Java之利用FreeMarker导出Word实例

    开心一笑 感冒了很难受,她闷在被窝里给男朋友发短信"我感冒了-"并决定如果对方回答"多喝点水"就一脚踹了他.过一会儿手机振动起来,短信内容:"开门."--这个大笨蛋!谁让他来的啦!她起身用最快的速度冲 ...

最新文章

  1. 【基础积累】1x1卷积到底有哪些用处?
  2. 【数字信号处理】相关函数 ( 相关系数与相关函数 | 相关函数定义 )
  3. bobo老师机器学习笔记1.1 - 什么是机器学习
  4. springMVC 不扫描 controller 中的方法
  5. 科大星云诗社动态20201203
  6. 史上最详细的Android Studio系列教程四--Gradle基础
  7. Win7 64有点找不到MSVCP71.DLL和MSVCR71.dll
  8. Python企业微信机器人
  9. pycharm + python36 + opencv + opencv_contrib库的安装
  10. 一种简单的加解密算法
  11. 非线性优化_曲线拟合_Ceres_最小二乘法示例
  12. 猎豹网校 ASP.NET全套教程
  13. MySQL 正负数排序
  14. Linux如何安装FTDI D2XX驱动
  15. JPEX联手西悉尼流浪者队 推出250款独家NFT“J-ball”
  16. 苹果几是双卡双待_iphone11 pro苹果大革新,支持双卡双待
  17. java线程和linux线程,【转】Java线程与Linux内核线程的映射关系
  18. 最有效的5条改进措施
  19. Ethereum 基础(一)
  20. 魔兽争霸3冰封王座黑边问题

热门文章

  1. 随机森林(Random Forest)面试高频题
  2. catia的总成图怎么称重量_catia怎么称重量?
  3. JAVA设计模式--七大原则之单一职责(01)
  4. 拳王虚拟项目公社:闲鱼最强的实操赚钱方法,你一定不知道!
  5. EF中Add()和Attach()两种添加数据方法的区别
  6. 张小龙在微信公开课上说了 18 件事,视频号和直播是今年的重头戏
  7. 为什么员工犯错,责任在领导?
  8. 视频会议/PPT、信息图设计
  9. 华为上半年手机销量_2019上半年手机销量排行榜出炉,华为一骑绝尘,魅族联想上榜...
  10. leetcode 1005 负负得正,整数就取绝对值最小的