- 浏览: 141382 次
- 性别:
- 来自: 成都
文章分类
最新评论
最近,由于项目的需要要导出规范样式的word文档,且要求较高。
之前已经尝试过两种方式(
1.使用POI在后台写出WORD,该方法和基础,写简单格式很ok,打样式复杂的时候,就纠结了,反正我是没调整好,放弃。
2.将内容传到页面,在用特殊的格式后,将页面另存为DOC格式的文档。这种方法很简单,几乎都都在客户端页面解决,但是另存后,其中html标签转在word中显示主要的问题是很多框线显示出来了,相当的不好看。
)
以上两种方法确定可以实现word导出,但是word样式没有达到客户要求。
因此,在网上查找得到可以使用freemarker的模板来搞定,极度兴奋。
总结一下关键步骤,供大家参考。
1.将处理好的的word模板,另存为xml格式的文档。并在其中添加参数: ${export}
<!--StartFragment -->
2.将xml文档修改完成后,保存并修改后缀名为“****.ftl”;
3.编写java类,主要实现对模板的赋值以及生成流,用于导出。
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.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
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.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.cist.bayonet.mainstat.model.Dljtsgjbxxb;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
/**
* @fun 重大事故word导出类
* @author xzl
*
*/
public class export_word {
private Configuration configuration = null;
public export_word() {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
//System.out.print("========");
}
public File createDoc(Dljtsgjbxxb dlb,String spth) throws UnsupportedEncodingException { //要填入模本的数据文件
Map dataMap=new HashMap();
getData(dataMap,dlb); //设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
//这里我们的模板是放在com.cist.bayonet.mainstat.service.impl包下面
configuration.setClassForTemplateLoading(this.getClass(), "/com/cist/bayonet/mainstat/service/impl");
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
/**
* @fun 重大事故word导出类
* @author xzl
*
*/
public class export_word {
private Configuration configuration = null;
public export_word() {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
//System.out.print("========");
}
public File createDoc(Dljtsgjbxxb dlb,String spth) throws UnsupportedEncodingException { //要填入模本的数据文件
Map dataMap=new HashMap();
getData(dataMap,dlb); //设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
//这里我们的模板是放在com.cist.bayonet.mainstat.service.impl包下面
configuration.setClassForTemplateLoading(this.getClass(), "/com/cist/bayonet/mainstat/service/impl");
Template t=null;
try { //sgxxb_info.ftl为要装载的模板
t = configuration.getTemplate("sgxxb_info.ftl");
}
catch (IOException e) {
e.printStackTrace();
} //输出文档路径及名称
File outFile = new File(spth+"/.doc");
Writer out = null;
try {
FileOutputStream fos = new FileOutputStream(outFile);
OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8");//这个地方对流的编码不可或缺,
try { //sgxxb_info.ftl为要装载的模板
t = configuration.getTemplate("sgxxb_info.ftl");
}
catch (IOException e) {
e.printStackTrace();
} //输出文档路径及名称
File outFile = new File(spth+"/.doc");
Writer out = null;
try {
FileOutputStream fos = new FileOutputStream(outFile);
OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8");//这个地方对流的编码不可或缺,
使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。
out = new BufferedWriter(oWriter);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out);
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return outFile;
}
out = new BufferedWriter(oWriter);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out);
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return outFile;
}
/** * 注意dataMap里存放的数据Key值要与模板中的参数相对应 * @param dataMap */
@SuppressWarnings("unchecked")
private void getData(Map dataMap,Dljtsgjbxxb db) { //这里就是给模板的的Map赋值,通过接受的实体对象来获取所需的值。测试时建议直接用常量,如dataMap.put("jbdw1", "绵阳市二大队");
dataMap.put("jbdw1", db.getJbdw1());
dataMap.put("jbdw2", db.getJbdw2());
dataMap.put("jbdw3", db.getJbdw3());
dataMap.put("sjfs1", db.getJbsjfs1().toString().substring(0, 19)+db.getJbsjfs1f());
dataMap.put("sjfs2", db.getJbsjfs2().toString().substring(0, 19)+db.getJbsjfs2f());
dataMap.put("sjfs3", db.getJbsjfs3().toString().substring(0, 19)+db.getJbsjfs3f());
dataMap.put("jbyxm1", db.getJbr1());
dataMap.put("jbyxm2", db.getJbr2());
dataMap.put("jbyxm3", db.getJbr3());
dataMap.put("sbpzr1", db.getSbpzr1());
dataMap.put("sbpzr2", db.getSbpzr2());
dataMap.put("sbpzr3", db.getSbpzr3());
dataMap.put("xxsbr1", db.getSbr1());
dataMap.put("xxsbr2", db.getSbr2());
dataMap.put("xxsbr3", db.getSbr3());
dataMap.put("sbsjfs1", db.getSbsjfs1().toString().substring(0, 19)+db.getSbsjfs1f());
dataMap.put("sbsjfs2", db.getSbsjfs2().toString().substring(0, 19)+db.getSbsjfs2f());
dataMap.put("sbsjfs3", db.getSbsjfs3().toString().substring(0, 19)+db.getSbsjfs3f());
dataMap.put("dcsw", db.getDcsw());
dataMap.put("szrs", db.getXlbm());
dataMap.put("qjwx", db.getQjwxsw());
dataMap.put("zsrs", db.getSs());
dataMap.put("jyqk", db.getJbqk());
dataMap.put("jbsj", db.getJbsj().toString().substring(0, 19));
dataMap.put("zby", db.getZby());
dataMap.put("sghsqk", db.getSgxxhsqk());
DateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
String string = dFormat.format(new Date());
dataMap.put("export", string);
}
// public static void main(String args[]){
// export_word word = new export_word();
// word.createDoc();
// }
}
@SuppressWarnings("unchecked")
private void getData(Map dataMap,Dljtsgjbxxb db) { //这里就是给模板的的Map赋值,通过接受的实体对象来获取所需的值。测试时建议直接用常量,如dataMap.put("jbdw1", "绵阳市二大队");
dataMap.put("jbdw1", db.getJbdw1());
dataMap.put("jbdw2", db.getJbdw2());
dataMap.put("jbdw3", db.getJbdw3());
dataMap.put("sjfs1", db.getJbsjfs1().toString().substring(0, 19)+db.getJbsjfs1f());
dataMap.put("sjfs2", db.getJbsjfs2().toString().substring(0, 19)+db.getJbsjfs2f());
dataMap.put("sjfs3", db.getJbsjfs3().toString().substring(0, 19)+db.getJbsjfs3f());
dataMap.put("jbyxm1", db.getJbr1());
dataMap.put("jbyxm2", db.getJbr2());
dataMap.put("jbyxm3", db.getJbr3());
dataMap.put("sbpzr1", db.getSbpzr1());
dataMap.put("sbpzr2", db.getSbpzr2());
dataMap.put("sbpzr3", db.getSbpzr3());
dataMap.put("xxsbr1", db.getSbr1());
dataMap.put("xxsbr2", db.getSbr2());
dataMap.put("xxsbr3", db.getSbr3());
dataMap.put("sbsjfs1", db.getSbsjfs1().toString().substring(0, 19)+db.getSbsjfs1f());
dataMap.put("sbsjfs2", db.getSbsjfs2().toString().substring(0, 19)+db.getSbsjfs2f());
dataMap.put("sbsjfs3", db.getSbsjfs3().toString().substring(0, 19)+db.getSbsjfs3f());
dataMap.put("dcsw", db.getDcsw());
dataMap.put("szrs", db.getXlbm());
dataMap.put("qjwx", db.getQjwxsw());
dataMap.put("zsrs", db.getSs());
dataMap.put("jyqk", db.getJbqk());
dataMap.put("jbsj", db.getJbsj().toString().substring(0, 19));
dataMap.put("zby", db.getZby());
dataMap.put("sghsqk", db.getSgxxhsqk());
DateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
String string = dFormat.format(new Date());
dataMap.put("export", string);
}
// public static void main(String args[]){
// export_word word = new export_word();
// word.createDoc();
// }
}
4.由于我使用的是SSH框架,所以struts处理Action部分如下:
(一下类由于内容较多只贴了有用的部分,个人觉得重点的部分的result注解中的设定)
@ParentPackage("json-default")
@Namespace("/struts/mainstat")
@Results({
@Result(name="word",type="stream",params={"contentDisposition","attachment;filename=${filename}","bufferSize","4096","contentType","application/octet-stream;charset=utf-8","inputName","inputStream"}),
@Result(name="msg",location="/bayonet_jsp/result.jsp"),
@Result(name="alltoll",type="json"),
@Result(name="repeat",type="json",params={"includeProperties","m_StringResult","noCache","true","ignoreHierarchy","false"}),
})
public class MainstartAction extends BasePageAction<Dljtsgjbxxb> {
@Namespace("/struts/mainstat")
@Results({
@Result(name="word",type="stream",params={"contentDisposition","attachment;filename=${filename}","bufferSize","4096","contentType","application/octet-stream;charset=utf-8","inputName","inputStream"}),
@Result(name="msg",location="/bayonet_jsp/result.jsp"),
@Result(name="alltoll",type="json"),
@Result(name="repeat",type="json",params={"includeProperties","m_StringResult","noCache","true","ignoreHierarchy","false"}),
})
public class MainstartAction extends BasePageAction<Dljtsgjbxxb> {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final Logger lr = LoggerFactory.getLogger(MainstartAction.class);
@Resource(name = "MainstartService")
private IMainstartService m_css;
private int cont_a;
private String cityString;
private Dljtsgjbxxb dlb;
private FileInputStream inputStream = null;
private String filename = "SGXXBG" + java.util.Calendar.getInstance().get(java.util.Calendar.MILLISECOND) +".doc";
*
*/
private static final long serialVersionUID = 1L;
private static final Logger lr = LoggerFactory.getLogger(MainstartAction.class);
@Resource(name = "MainstartService")
private IMainstartService m_css;
private int cont_a;
private String cityString;
private Dljtsgjbxxb dlb;
private FileInputStream inputStream = null;
private String filename = "SGXXBG" + java.util.Calendar.getInstance().get(java.util.Calendar.MILLISECOND) +".doc";
。。。。。。。。。。。。。。。。。。。。。。。。
/**
* WORD导出
* @return
*/
@Action("word_accident")
public String exportWord() {
try{
ServletContext sc = ServletActionContext.getServletContext();
String path = sc.getRealPath("/bayonet_file/word/");//获取服务器端,暂时存储路径
dlb = m_css.getEntity(dlb);
export_word word = new export_word();
File file = word.createDoc(dlb, path);//返回的是,已经使用模板生成的word文档的路径
if (file.exists()) {
this.inputStream = new FileInputStream(file);//Action需要返回的流
} else {
m_StringResult = Messages.MSG_FAIL;
* WORD导出
* @return
*/
@Action("word_accident")
public String exportWord() {
try{
ServletContext sc = ServletActionContext.getServletContext();
String path = sc.getRealPath("/bayonet_file/word/");//获取服务器端,暂时存储路径
dlb = m_css.getEntity(dlb);
export_word word = new export_word();
File file = word.createDoc(dlb, path);//返回的是,已经使用模板生成的word文档的路径
if (file.exists()) {
this.inputStream = new FileInputStream(file);//Action需要返回的流
} else {
m_StringResult = Messages.MSG_FAIL;
return "msg";
}
return "word";//通过上面对应的注解返回stream;客户端可以在线打开或者下载。
}catch(Exception ex){
m_StringResult = Messages.MSG_SEARCH_FAILTURE;
lr.error(ex.getMessage());
return "msg";
}
}
}
return "word";//通过上面对应的注解返回stream;客户端可以在线打开或者下载。
}catch(Exception ex){
m_StringResult = Messages.MSG_SEARCH_FAILTURE;
lr.error(ex.getMessage());
return "msg";
}
}
发表评论
-
信息系统项目管理师-九大知识域浅析
2012-10-15 10:15 3067因为最近要准备考试,找了些资料,觉得尤其这些是核心.和大家分享 ... -
Bootstrap, from Twitter
2012-07-16 16:29 1557前段时间,由于项目需要,(基于ios和android系统的大数 ... -
HTML5 type 新增的枚举值
2012-04-19 14:44 1323Keyword Data type h ... -
HTML5 标签Email等 (自动验证格式)
2012-04-19 14:28 12044谷歌Chrome浏览器。在Windows的【开始】--> ... -
javaScript向服务器请求的几种方式(转)
2012-04-19 09:07 3060javaScript javaScriptjavaScript ... -
Socket 类 客户端例子
2012-05-04 10:15 1238当客户程序需要和服务器通讯时,客户程序在客户机创 ... -
(转)java中四种XML解析技术
2011-12-29 14:27 1022在平时工作中,难免会遇到把 XML 作为数据存储格式。面对目前 ... -
java 抓取页面
2011-12-21 11:29 1057import java.io.BufferedRe ... -
转 JSTL标签使用
2011-12-02 09:37 1063JSTL 学习、应用记录 原来一直没有看过,我说过我是新手, ... -
FullCalendar 官方文档翻译(转)
2011-10-20 18:09 17651. 使用方式, 引入相关 ... -
(转载)FusionCharts参数的详细说明 中文乱码 字体大小
2011-10-20 17:53 5616功能特性animation ... -
转 jQuery 常用操作select、radio、checkbox
2011-09-28 10:57 1408jQuery获取Select选中的Text和Value(jqu ... -
java 持久化对象---hibernate核心接口
2011-09-28 10:50 1406Hibernate 核心接口 : Configurat ... -
Oracle 中like效率 正则表达式 浅析
2011-07-14 14:07 6393Oracle 中like常用但是其效率不是高。 特别是使用 ... -
编程命名规范(匈牙利命名法)C/C++
2011-07-08 16:09 2072变量属性 属性部分: 全局变量 g_ 常 ... -
java 将Excel(CSV)导入数据库(上传、读取文件)
2011-07-07 18:38 16444最近由于项目的需要,必须使用Excel导入数据。 ... -
JQuery 常用技巧 :jquery对象与dom对象的转换
2011-05-18 18:11 11831、关于页面元素的引用 ... -
JQuery 判断value选中checkbox 判断checkbox是否选中 修改、获取value值
2011-05-12 10:05 9809<html><head><scr ... -
setTimeout()/setInterval()
2011-04-19 13:19 1101JavaScript ******************** ...
相关推荐
Java 使用 FreeMarker 模板技术导出 Word 是一种常见的数据动态生成文档的方法,它结合了 Java 的编程能力和 FreeMarker 模板引擎的强大功能,能够帮助开发者高效地生成结构化的 Word 文档。FreeMarker 是一个开源的...
springboot 根据word模板,导出word,设置好word2003模板,利用 word2003->另存为 2003.xml->.ftl。然后根据ftl,填充数据导出word. 生成xml或者 flt文件后可以用 vs或者 IDEA 格式化代码,方便阅读
在Java开发中,有时我们需要将数据以Word文档的形式导出,尤其在报表生成、文档自动化等领域。本示例关注的是如何使用FreeMarker模板引擎来实现这个功能,并且包含在Word文档中插入图片的能力。FreeMarker是一个强大...
在Java应用中,使用FreeMarker导出Word文档可以提供灵活的文本和数据结合的方式,尤其适用于生成报告、合同等复杂格式的文档。本篇将详细介绍如何使用FreeMarker与Java结合来导出包含多张图片的Word文档。 1. **...
基于Java语言来导出Word文档的方式也有很多种,如Jacob,Apache POI,Freemarker,PageOffice,java2word 等等。。。。 在这里将通过Freemarker这个模板引擎来实现导出 Word,项目不限于Swing,SSH,SSM,Spring ...
Freemarker是一款强大的Java模板引擎,常用于动态生成HTML、XML等...这个教程包含了源码和详细步骤,确保你可以快速上手并实现Freemarker模板导出Word的功能。务必仔细阅读并理解每个部分,以便在实际项目中灵活应用。
本教程将探讨如何利用Java和特定的模板引擎,如Freemarker,来处理Word模板,生成doc和docx格式的个人简历文件。以下是相关知识点的详细说明: 1. **Freemarker模板引擎**: Freemarker是一个强大的、开源的模板...
在Java开发中,导出Word文档是一项常见的需求,特别是在企业级应用中,如报表生成、合同模板等。这里我们重点讨论使用FreeMarker模板引擎来实现这一功能。FreeMarker是一个强大的、开源的模板语言,它与Java无缝集成...
以上就是使用Java FreeMarker导出Word文档的基本流程。实际应用中,你可能需要处理更复杂的模板,包括表格、列表、图片等,以及更丰富的数据模型。FreeMarker的强大之处在于它的灵活性,可以根据具体需求定制模板,...
在Java开发中,导出Word文档是一项常见的任务,特别是在企业级应用中,如报表生成、数据导出等。本篇文章将深入探讨如何使用FreeMarker模板引擎来生成包含图片和动态数据表的Word文档,尤其注重动态行和动态列的处理...
java web+freemarker 导出word 单个字符串${name}, 列表<#list tail as item> ${item.id} ,附有源码,导出word的word模板 以及另存为的xml文件和 ftl模板,只需要改下里面的查询数据库即可
本篇文章将详细介绍如何使用Java结合FreeMarker来实现Word文档的导出。 1. **FreeMarker简介** FreeMarker是一个基于模板的开源Java库,用于生成文本输出,如HTML、XML或其他任何基于文本的格式。它的主要应用场景...
总结,FreeMarker导出Word表格的核心在于理解XML结构,创建FreeMarker模板,以及正确地绑定数据。这个方法的好处是可以将格式设计与数据分离,使得数据的更新和格式的维护变得更加灵活和高效。在处理大量数据的导出...
开发者首先需要准备XML模板,然后在Java代码中加载模板,创建数据模型,调用Freemarker的API进行模板处理,最后将生成的Word文档保存。通过这种方式,我们可以灵活地根据业务需求生成各种定制化的Word报告,而无需...
Java利用FreeMarker导出Word是一项常见的技术需求,尤其在企业级应用中,常常需要将动态数据生成为Word文档,例如报告、合同等。FreeMarker是一个模板引擎,它能将Java对象的数据绑定到模板上,生成HTML、XML或者如...
这个压缩包“Java通过word编辑为xml和ftl格式的模板创建导出word文档 .zip”提供了一个示例项目,用于演示如何使用Java编程语言来操作Word文档,并将其内容转化为XML和FTL(FreeMarker)模板格式。以下将详细介绍这...
`Java用freemarker导出word文档`这个主题涉及到的技术点主要包括Java的Freemarker模板引擎和处理Word文档的相关库。Freemarker是一个强大的、基于模板的生成器,广泛用于Web应用中的动态HTML生成。在这里,它被用来...
在Java开发中,导出Word文档是一项常见的任务,尤其在生成报表、报告或者合同等场合。本文将探讨如何使用Java高效地实现Word文档导出,主要聚焦于利用XDocReport和FreeMarker模板引擎的方式。 首先,Java中导出Word...