`

FreeMarker + xml 导出word

    博客分类:
  • java
阅读更多

首先介绍几种java导出word方案 

1、Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁。使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用。DLL动态链接库的生成需要windows平台的支持。

 

2、 Apache POI包括一系列的API,它们可以操作基于MicroSoft OLE 2 Compound Document Format的各种格式文件,可以通过这些API在Java中读写Excel、Word等文件。他的excel处理很强大,对于word还局限于读取,目前只能实现一些简单文件的操作,不能设置样式。

 

3、 Java2word是一个在java程序中调用 MS Office Word 文档的组件(类库)。该组件提供了一组简单的接口,以便java程序调用他的服务操作Word 文档。
这些服务包括: 打开文档、新建文档、查找文字、替换文字,插入文字、插入图片、插入表格,在书签处插入文字、插入图片、插入表格等。填充数据到表格中读取表格数据 ,1.1版增强的功能: 指定文本样式,指定表格样式。如此,则可动态排版word文档。

 

4、 iText操作Excel还行。对于复杂的大量的word也是噩梦。用法很简单, 但是功能很少, 不能设置打印方向等问题。

 

5、 JSP输出样式基本不达标,而且要打印出来就更是惨不忍睹。

 

6、 用XML做就很简单了。Word从2003开始支持XML格式,大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。经测试这样方式生成的word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。


看过方案后就知道了 第 6 种方案效果好点,下面我们就举个例子介绍下这个方案

首先要制作模板 模板里的需要传入的数据用${data} 填充,在代码里给其赋值即可

模板制作好后 ,点击另存为  xml  文件  如:data.xml

如果xml需要动态填充  可以用

<!-- 循环开始 -->
<#list personnelView as e>

</#list>

<!-- 循环结束 -->

<!-- 循环开始 -->
<#list personnelView as e>  // personnelView为循环集合
<w:tr wsp:rsidR="001E023B" wsp:rsidTr="004E45BD">
<w:tblPrEx>
<w:tblCellMar>
<w:top w:w="0" w:type="dxa"/>
<w:bottom w:w="0" w:type="dxa"/>
</w:tblCellMar>
</w:tblPrEx>
<w:trPr>
<w:trHeight w:val="405"/>
</w:trPr>
<w:tc>
<w:tcPr>
<w:tcW w:w="1920" w:type="dxa"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p wsp:rsidR="001E023B" wsp:rsidRDefault="001D2E3B" wsp:rsidP="004E45BD">
<w:pPr>
<w:jc w:val="center"/>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:hint="fareast"/>
</w:rPr>
<w:t>${e_index +1}</w:t> //e_index 为索引从0 开始
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="1083" w:type="dxa"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p wsp:rsidR="001E023B" wsp:rsidRDefault="001D2E3B" wsp:rsidP="004E45BD">
<w:r>
<w:rPr>
<w:rFonts w:hint="fareast"/>
</w:rPr>
<w:t>${e.COLUMN_1}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="1142" w:type="dxa"/>
<w:gridSpan w:val="3"/>
</w:tcPr>
<w:p wsp:rsidR="001E023B" wsp:rsidRDefault="001D2E3B" wsp:rsidP="004E45BD">
<w:pPr>
<w:rPr>
<w:rFonts w:hint="fareast"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:hint="fareast"/>
</w:rPr>
<w:t>${e.COLUMN_2}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="1578" w:type="dxa"/>
<w:gridSpan w:val="3"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p wsp:rsidR="001E023B" wsp:rsidRDefault="001D2E3B" wsp:rsidP="004E45BD">
<w:r>
<w:rPr>
<w:rFonts w:hint="fareast"/>
</w:rPr>
<w:t>${e.COLUMN_3}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="1168" w:type="dxa"/>
<w:gridSpan w:val="2"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p wsp:rsidR="001E023B" wsp:rsidRDefault="001D2E3B" wsp:rsidP="004E45BD">
<w:r>
<w:rPr>
<w:rFonts w:hint="fareast"/>
</w:rPr>
<w:t>${e.COLUMN_4}</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="2181" w:type="dxa"/>
<w:gridSpan w:val="3"/>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p wsp:rsidR="001E023B" wsp:rsidRDefault="001D2E3B" wsp:rsidP="004E45BD">
<w:r>
<w:rPr>
<w:rFonts w:hint="fareast"/>
</w:rPr>
<w:t>${e.COLUMN_5}</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</#list>
<!-- 循环结束 -->

下面是代码

package com.asiainfo.boms.machineroom.action;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;


import org.apache.struts2.ServletActionContext;


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 Template getTemplate(){
configuration.setClassForTemplateLoading(this.getClass(),
"/com/asiainfo/boms/machineroom/template");
Template t = null;
try {
// test.ftl为要装载的模板
t = configuration.getTemplate("sg.xml");
t.setEncoding("utf-8");
} catch (IOException e) {
e.printStackTrace();
}
return t;
}

public Writer getWriter(String jobId){
// 输出文档路径及名称
String savePath = ServletActionContext.getServletContext().getRealPath("/");
File file = new File(savePath+"upload");
if(!file.exists()){
file.mkdirs();
}
File outFile = new File(savePath+"upload/machine"+jobId+".doc");
Writer out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outFile), "utf-8"));
} catch (Exception e1) {
e1.printStackTrace();
}
return out;
}


public void createDoc(Template t,Map dataMap,Writer out) {
try {
t.process(dataMap, out);
out.close();
} catch (TemplateException e) {
e.printStackTrace();


} catch (IOException e) {


e.printStackTrace();
}


}


// private void getData(Map dataMap) {
//
// dataMap.put("title_name", "用户信息");
//
// dataMap.put("user_name", "李四");
//
// dataMap.put("org_name", "微软公司");
//
// dataMap.put("dept_name", "事业部");
//
// }


}


public String personnelImportWord() throws Exception{
String path = ServletActionContext.getServletContext().getRealPath("/");
String jobId = getStringParameter("job_id");
Map<String, Object> paraMap = new HashMap<String, Object>();
Map dataMap = new HashMap();
paraMap.put("jobId", jobId);
DocumentHandler dh = new DocumentHandler();
Template t = dh.getTemplate();
Writer out = dh.getWriter(jobId);
Map queryWFjobObj = .............
dataMap.put("COLUMN_1", queryWFjobObj.get("COLUMN_1"));
dataMap.put("COLUMN_2", queryWFjobObj.get("COLUMN_2"));
dataMap.put("COLUMN_3", queryWFjobObj.get("COLUMN_3"));
dataMap.put("CLOB_1", queryWFjobObj.get("CLOB_1"));
dataMap.put("DATE_1", queryWFjobObj.get("DATE_1"));
dataMap.put("DATE_2", queryWFjobObj.get("DATE_2"));
dataMap.put("COLUMN_4", queryWFjobObj.get("COLUMN_4"));
Map mobileObj = .................
dataMap.put("CALLER", mobileObj.get("CALLER"));
dataMap.put("STARTDATE", mobileObj.get("STARTDATE"));
dataMap.put("MSISDN", mobileObj.get("MSISDN"));
Map machineroomObj = .......................
dataMap.put("CALLER1", machineroomObj.get("CALLER"));
dataMap.put("STARTDATE1", machineroomObj.get("STARTDATE"));
dataMap.put("MSISDN1", machineroomObj.get("MSISDN"));
List<Map> personnelView = .........................
dataMap.put("personnelView", personnelView);
dh.createDoc(t, dataMap, out);
fileName = "machine"+jobId+".doc";

return "personnelImportWord";
}

public InputStream getInputStream() throws Exception
     {
String path = ServletActionContext.getServletContext().getRealPath("/");
File file = new File(path+"upload");
if(!file.exists()){
file.mkdirs();
}
        return new FileInputStream(path+"upload/"+fileName);
     }


下面再说几种导出pdf 的方案

java生成pdf方案总结

1Jasper Report生成pdf:设计思路是先生成模板,然后得到数据,最后将两者整合得到结果。但是Jasper Report的问题在于,其生成模板的方式过于复杂,即使有IDE的帮助,我们还是需要对其中的众多规则有所了解才行,否则就会给调试带来极大的麻烦。

2. openoffice生成pdf:openoffice是开源软件且能在windows和linux平台下运行。

3. itext + flying saucer生成pdf:itext和flying saucer都是免费开源的,且与平台无关,结合css和velocity技术,可以很好的实现。

 

一般使用第三种方案比较多,它实现的步骤是非常简单的。

JAVA生成word优缺点对比

所用技术

优点

缺点

Jacob

功能强大

代码量大,设置样式繁琐;需要windows平台支持,无法跨平台

Apache POI

读写excel功能强大、操作简单

一般只用它读取word,能够创建简单的word,不能设置样式,功能太少

Java2word

功能强大,操作简单

能满足一般要求,不支持07格式,国人开发的,参考资料较多,需要windows平台支持

iText

功能全,能满足一般要求

不能直接生成或操作doc文档,只能生成rtf格式的文档,rtf也可以用word打开

JSP

操作简单,代码量少

能把当前页面导出简单的word,不能设置样式,美观性差,无法操作word

XML(最佳)

代码量少,样式、内容容易控制,打印不变形,完全符合office标准

需要提前设计好word模板,把需要替换的地方用特殊标记标出来

 

JAVA生成pdf优缺点对比

所用技术

优点

缺点

openoffice

本身就是office软件,很容易设计一些文档模板,支持java调用实现word转换成pdf

需要先安装,设计好pdf模板样式,然后用程序来填充那些预留好的变量

itext 

能满足要求,本身提供了一些api

无法识别很多html的tag和attribute,无法识别css,需要用其api函数来设置样式

Jasper Report

能满足要求,市面上使用的比较多,相关文档多

复杂,很难完全掌握,需要先设计模板,强依赖于IDE进行可视化编辑

flying sauser(最佳)

能解析html和css输出成image、pdf等格式,操作简单,api强大

需要编写freemarker或velocity模板,打造html,勾画pdf的样式

 


18
8
分享到:
评论
4 楼 di1984HIT 2014-10-09  
学习了,写的好~
3 楼 无象心 2012-08-17  
有没有考虑过word xml转换成真正的word,求教!
2 楼 aijuans 2012-08-16  
  这个不错,值得参考
1 楼 lucky16 2012-08-15  
最後那個優缺點對比可以留做參考

相关推荐

    java web+freemarker导出word

    java web+freemarker 导出word 单个字符串${name}, 列表&lt;#list tail as item&gt; ${item.id} ,附有源码,导出word的word模板 以及另存为的xml文件和 ftl模板,只需要改下里面的查询数据库即可

    freemarker+action+word

    对于Word文档生成,Freemarker模板会被转化为符合Word格式的XML,再由Apache POI解析并写入到Word文件中。 例如,一个常见的应用场景可能是企业报表系统:用户在网页上选择特定条件后,后台Action处理查询请求,...

    java使用freemarker模板技术导出word

    Java 使用 FreeMarker 模板技术导出 Word 是一种常见的数据动态生成文档的方法,它结合了 Java 的编程能力和 FreeMarker 模板引擎的强大功能,能够帮助开发者高效地生成结构化的 Word 文档。FreeMarker 是一个开源的...

    freemarker模板导出word循环图片表格源码和详细教程

    在本教程中,我们将探讨如何利用Freemarker模板来导出Word文档,并实现循环插入图片和表格的功能。这对于需要批量生成定制化报告或者文档的应用场景非常有用。 首先,我们需要了解Freemarker的基本语法。在...

    freemarker 导出word表格

    总结,FreeMarker导出Word表格的核心在于理解XML结构,创建FreeMarker模板,以及正确地绑定数据。这个方法的好处是可以将格式设计与数据分离,使得数据的更新和格式的维护变得更加灵活和高效。在处理大量数据的导出...

    Java项目中利用Freemarker模板引擎导出--生成Word文档

    基于Java语言来导出Word文档的方式也有很多种,如Jacob,Apache POI,Freemarker,PageOffice,java2word 等等。。。。 在这里将通过Freemarker这个模板引擎来实现导出 Word,项目不限于Swing,SSH,SSM,Spring ...

    java freemarker导出word -包含多张图片导出

    在Java应用中,使用FreeMarker导出Word文档可以提供灵活的文本和数据结合的方式,尤其适用于生成报告、合同等复杂格式的文档。本篇将详细介绍如何使用FreeMarker与Java结合来导出包含多张图片的Word文档。 1. **...

    Java freemarker 根据模板 导出word.rar

    springboot 根据word模板,导出word,设置好word2003模板,利用 word2003-&gt;另存为 2003.xml-&gt;.ftl。然后根据ftl,填充数据导出word. 生成xml或者 flt文件后可以用 vs或者 IDEA 格式化代码,方便阅读

    java利用FreeMarker导出word

    Java利用FreeMarker导出Word是一项常见的技术需求,尤其在企业级应用中,常常需要将动态数据生成为Word文档,例如报告、合同等。FreeMarker是一个模板引擎,它能将Java对象的数据绑定到模板上,生成HTML、XML或者如...

    使用FreeMarker实现导出word实例

    在本例中,我们将探讨如何利用FreeMarker来实现Word文档的导出。FreeMarker的工作原理是,它将数据模型与模板结合,生成最终的输出文档。在Java应用中,这通常涉及创建一个FreeMarker配置对象,加载模板文件,设置...

    freemarker导出Excel、Word、HTMLdemo

    - 导出Word文件可以借助于Apache POI或OpenOffice API。流程与导出Excel相似,只是模板需要按照Word文档的结构设计。 - 模板设计上,可以使用Freemarker的文本、段落、列表等指令创建Word文档的结构,用`&lt;#assign&gt;...

    Java 用Freemarker导出word文档总结

    在Java中利用FreeMarker导出Word文档,可以极大地提高代码的可维护性和灵活性。 首先,我们需要了解FreeMarker的基础知识。FreeMarker是一个基于模板的视图技术,它将数据模型和视图模板分离,使得开发者可以专注于...

    freeMarker导出word两种方式最全代码样例.rar

    本示例主要探讨了使用FreeMarker导出Word的两种方法:通过生成XML模板和通过HTML模板直接导出。 1. **生成XML方式模板并附带图片导出** 在这种方法中,首先我们需要创建一个XML模板,该模板定义了Word文档的结构和...

    Java用freemarker导出word例子

    在Java中,我们需要以下步骤来使用`Freemarker`导出Word: 1. **配置Freemarker**: 首先,你需要添加`freemarker`的依赖到项目中,通常是在`pom.xml`中添加Maven依赖或在`build.gradle`中添加Gradle依赖。然后,...

    Java用freemarker导出word文档

    `Java用freemarker导出word文档`这个主题涉及到的技术点主要包括Java的Freemarker模板引擎和处理Word文档的相关库。Freemarker是一个强大的、基于模板的生成器,广泛用于Web应用中的动态HTML生成。在这里,它被用来...

    基于Freemarker和xml实现Java导出word

    基于Freemarker和xml实现Java导出word Freemarker是一种基于模板的Java模板引擎,它可以将数据和模板结合,生成最终的文档。在这里,我们主要介绍了基于Freemarker和xml实现Java导出word的方法。 Freemarker的优点...

    生成WORD freemarker导出WORD

    本项目“生成WORD freemarker导出WORD”正是这样一个解决方案,它允许开发者使用FreeMarker模板来创建和导出Microsoft Word文件。 首先,我们要理解FreeMarker的工作原理。FreeMarker是一个基于Java的模板语言,它...

    freemarker-2.3.30模板word导出.zip

    压缩包可能包含一份指南,详细说明如何配置和使用提供的Java代码和模板来导出Word文档。这可能涵盖模板的编写规则,数据模型的设计,以及执行导出的步骤。 6. **模板设计**: 在Freemarker中,模板通常包含文本和...

Global site tag (gtag.js) - Google Analytics