Java用Freemarker导出word 内容换行
最近一个项目要导出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 内容换行相关推荐
- Java使用freemarker导出word试卷
使用了freemarker模板填充占位符的方式来生成word文档,支持跨平台. Java导出Word的五种方式 制作Word模板 将制作好的Word模板.docx另存为.xml格式,修改xml文件的内 ...
- java使用freemarker导出word标题失效问题
java使用freemarker导出word标题失效问题 如图,导出格式错误切目录不可折叠 另存为xml发现 六级标题变成了其他级别:<w:pStyle w:val="60" ...
- JAVA使用FreeMarker导出Word工具类
<!--freemarker word export--><dependency><groupId>org.freemarker</groupId>&l ...
- Java用freemarker导出word
概述 最近一个项目要导出word文档,折腾老半天,发现还是用freemarker的模板来搞比较方便省事,现总结一下关键步骤,供大家参考,这里是一个简单的试卷生成例子. 详细 代码下载:http://w ...
- java 使用freemarker 导出word 和图片
前段时间写了一篇使用itext导出word的博客,并且在项目也是使用itext,我大概了写了2000行左右的样子,然后被经理否决了.最后还是要使用freemarker 模板导出word pom 文件: ...
- java通过freemarker导出word文档带图片并且循环
转载请标明出处: https://blog.csdn.net/weixin_41965979/article/details/80969287 本文出自付付讶的博客 1:所需jar包:freemark ...
- Java使用FreeMarker导出word
最近好多项目都有word导出功能,觉得有必要整理一下知识点 wps可以兼容office,所以最好要用offfice建的doc文件转xml.两边的格式是不一样的. 标签含义感觉html的有点相似,当然还 ...
- Java 用 Freemarker 生成 Word 时内容换行
一.原因 试过各种换行符 '\r' '\n' '\r\n' '(char)11' 全部都不行!!! 原因是:Java 用 Freemarker 生成 Word 时的换行符被自动解析忽略掉 二.解决方法 ...
- Java之利用FreeMarker导出Word实例
开心一笑 感冒了很难受,她闷在被窝里给男朋友发短信"我感冒了-"并决定如果对方回答"多喝点水"就一脚踹了他.过一会儿手机振动起来,短信内容:"开门."--这个大笨蛋!谁让他来的啦!她起身用最快的速度冲 ...
最新文章
- 【基础积累】1x1卷积到底有哪些用处?
- 【数字信号处理】相关函数 ( 相关系数与相关函数 | 相关函数定义 )
- bobo老师机器学习笔记1.1 - 什么是机器学习
- springMVC 不扫描 controller 中的方法
- 科大星云诗社动态20201203
- 史上最详细的Android Studio系列教程四--Gradle基础
- Win7 64有点找不到MSVCP71.DLL和MSVCR71.dll
- Python企业微信机器人
- pycharm + python36 + opencv + opencv_contrib库的安装
- 一种简单的加解密算法
- 非线性优化_曲线拟合_Ceres_最小二乘法示例
- 猎豹网校 ASP.NET全套教程
- MySQL 正负数排序
- Linux如何安装FTDI D2XX驱动
- JPEX联手西悉尼流浪者队 推出250款独家NFT“J-ball”
- 苹果几是双卡双待_iphone11 pro苹果大革新,支持双卡双待
- java线程和linux线程,【转】Java线程与Linux内核线程的映射关系
- 最有效的5条改进措施
- Ethereum 基础(一)
- 魔兽争霸3冰封王座黑边问题
热门文章
- 随机森林(Random Forest)面试高频题
- catia的总成图怎么称重量_catia怎么称重量?
- JAVA设计模式--七大原则之单一职责(01)
- 拳王虚拟项目公社:闲鱼最强的实操赚钱方法,你一定不知道!
- EF中Add()和Attach()两种添加数据方法的区别
- 张小龙在微信公开课上说了 18 件事,视频号和直播是今年的重头戏
- 为什么员工犯错,责任在领导?
- 视频会议/PPT、信息图设计
- 华为上半年手机销量_2019上半年手机销量排行榜出炉,华为一骑绝尘,魅族联想上榜...
- leetcode 1005 负负得正,整数就取绝对值最小的