java通过velocity导出word
java通过velocity导出word
项⽬需要通过程序⽣成word⽂档,就是业务⽅提供了⼀份模板,⾥⾯的有⼀份表格或者合同,程序主要就是把数据填到word中,并提供⽤户下载。⾸先想到的是iText和POI。iText操作pdf还不错,但是对word貌似就很吃⼒了。POI对excel读取和操作还⾏,对word的写⼊太复杂。上⽹搜了下java导出word,发现可以通过FreeMarker来完成还能保持word中复杂的样式。我们的⼯程中已经使⽤了velocity,将freemarker换成velocity很轻松。这样的话导出简单⽅便,还⽀持复杂的样式。下次业务⽅要换模板的时候简单替换下就⾏了。
具体过程
1.将运营给的word⽂档,需要数据的地⽅⽤$变量符替换
测试⽤,这⾥就简单的设置了邮箱。
2.保存之后将word⽂档另存为xml格式。
导游词作文3.将这个xml⽂件另存为.vm⽂件就是我们的模板了。
写个测试
public void execute(TurbineRunData rundata, Context context) throws IOException {
VelocityContext veContext = new VelocityContext();
veContext.put("email", "17173as");
// 渲染html
InputStreamReader reader = new Class().getResourceAsStream("/green.vm"),"UTF-8");
String html = ExportUtil.buildHtmlByVelocity(veContext, reader);
水喝太多时身体会发生什么String fileName="绿⾊通道.docx";
ServletOutputStream sos = null;
try {
HttpServletResponse response = Response();
response.setContentType("application/msword;");
response.setHeader("Content-Disposition", "attachment; filename=" + new Bytes(), "ISO-8859-1"));
sos = OutputStream();
sos.print(html);
} catch (Exception e) {
log.warn("[导出除标的物异常]" + fileName, e);
赞美松树的诗
} finally {
if (sos != null) {
try {
sos.close();
} catch (IOException e) {
<("[close异常]", e);
}
}
}
}
结果能导出,但是⽂件压根打不开,提⽰⽂件错误
将导出的doc⽂件⽤⽂本编辑器打开,初看挺正常的,之前的通过word导出的xml改为doc结尾后缀都能⽤word 再打开,这份重新导出的怎么就不⾏呢。⽤⽂本⽐较⼯具⽐较了下2份⽂件发现程序导出的⽂件存在⼀部分中⽂是?,应该就是这个引起的。但是为啥会部分是乱码,部分⼜是正常的中⽂。于是上⽹查了⼀通资料。中间换过好⼏种⽅法,⼀度想放弃xml,使⽤mth⽂件(html格式),但是悲剧的
是word 导出的mth打开就有乱码。于是⼜想到把xml⽂件转换成GBK编码,这样对中⽂总算友好吧。结果还不⾏,xml⽂件⾥居然有韩⽂之类的(不要问我为啥,我也不知道),GBK也⾏不通。那就查吧,看看是那⼀步导出乱码的,写了个main函数
public static void main(String[] args) throws IOException {
VelocityContext veContext = new VelocityContext();
常用英文名字
veContext.put("email", "开");
// 渲染html
InputStreamReader reader = new
InputStreamReader(ResourceAsStream("/green.vm"),
"UTF-8");
int b;
while ((b = ad()) != -1)
{
System.out.print((char)b);
}
}
word打开是乱码这个时候发现打印出来也是部分字是乱码,这时候尝试将green.vm⽤⽐较简单的中⽂替换原来的xml。发现能正常的打印出来,于是再换成word导出的xml内容,打印出来也是ok的,我还特意将打印出来的⼤段xml复制出来,改成doc后缀也能正常打开。这个就有点诡异了,当时觉得是我写的vm模板有问题,导致编码出错。现在ok了就重新打包测试⼀下。maven打包起tomcat,点击导出,发现还是跟之前⼀样的结果,还是打不开。这个就⾮常郁闷了,这时尝试将刚才的main函数再跑⼀下,发现居然也出乱码。看来是有⼋成跟打包有关系,因为我把vm放在resources⽬录下,这样可以通过class path加载。但是pom⽂件⾥配置的编码是GBK,⽽vm模板的编码是UTF-8,难道是maven编译的时候导致乱码。但是我不能改vm的编码也不能改pom⾥设置的编码。于是把vm⽂件放到WEB-INF下⾯,这样mavn打包不会对他产⽣影响。再来测试⼀下
public void execute(TurbineRunData rundata, Context context) throws IOException {
VelocityContext veContext = new VelocityContext();
veContext.put("email", "17173as");
InputStream greenInput=  RequestContext().getServletContext().getResourceAsStream("/WEB-
INF/green.vm");
InputStreamReader reader = new InputStreamReader(greenInput,"UTF-8");
String html = ExportUtil.buildHtmlByVelocity(veContext, reader);
String fileName="绿⾊通道.doc";
ServletOutputStream sos = null;
try {
HttpServletResponse response = Response();
response.setContentType("application/msword;charset=UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + new Bytes(), "ISO-8859-1"));
sos = OutputStream();
sos.print(html);
} catch (Exception e) {
log.warn("[导出除标的物异常]" + fileName, e);
} finally {
if (sos != null) {
try {
sos.close();
} catch (IOException e) {
<("[close异常]", e);
}
}
办公室主任述职报告}
}
最后⽂件能正常的打开,⽽且email替换成了变量

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。