转载自:http://hongqiang.iteye.com/blog/1632998

首先介绍几种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方案总结

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

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

. 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的样式

FreeMarker + xml 导出word的更多相关文章

  1. Java 用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  2. 【Java】用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  3. java使用freemarker模板导出word(带有合并单元格)文档

    来自:https://blog.csdn.net/qq_33195578/article/details/73790283 前言:最近要做一个导出word功能,其实网上有很多的例子,但是我需要的是合并 ...

  4. majingwei 利用xml导出word文件---换行

    xml不能识别<br>,需要将换行标记转换成<w:br/>

  5. spring boot freemarker 导出word 带echarts图形报表

    创建word文件内容如下 将word导出为xml格式 将文件后缀名改为 .ftl 在springboot项目中添加freemarker依赖 <!-- 导出word文档--> <dep ...

  6. 使用Freemarker导出Word文档(包含图片)代码实现及总结

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  7. java导出2007版word(docx格式)freemarker + xml 实现

    http://blog.csdn.net/yigehui12/article/details/52840121 Freemarker+xml生成docx 原理概述:word从2003版就支持xml格式 ...

  8. Freemarker + xml 实现Java导出word

    前言 最近做了一个调查问卷导出的功能,需求是将维护的题目,答案,导出成word,参考了几种方案之后,选择功能强大的freemarker+固定格式之后的wordxml实现导出功能.导出word的代码是可 ...

  9. freemarker导出word带图片

    导出word带图片 如果你需要在word中添加图片,那你就在第一步制作模板时,加入一张图片占位,然后打开xml文档,可以看到如下的一片base64编码后的代码: <w:binData w:nam ...

随机推荐

  1. 完全背包问题 :背包dp

    题目描述: 有 N种物品和一个容量是 V 的背包,每种物品都有无限件可用.第 i 种物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大.输出最 ...

  2. Solidity中的基本类型转换

    Solidity中的基本类型转换(十四)|入门系列 2017/4/29 posted in Solidity入门系列 点击查看原文,获得优化的排版. 隐式转换 如果一个运算符能支持不同类型.编译器会隐 ...

  3. 20145214 《Java程序设计》第8周学习总结

    20145214 <Java程序设计>第8周学习总结 教材学习内容总结 日志API 使用日志的起点是Logger类,Logger类的构造函数标示为protected,不是java.util ...

  4. Android 平台 HTTP网速测试 案例 API 分析

    作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/25996817 工信部规定的网速测试标准 : 除普通网页测速 ...

  5. LintCode-373.奇偶分割数组

    奇偶分割数组 分割一个整数数组,使得奇数在前偶数在后. 样例 给定 [1, 2, 3, 4],返回 [1, 3, 2, 4]. 挑战 在原数组中完成,不使用额外空间. 标签 数组 两根指针 code ...

  6. Spring Boot(七)扩展分析

    前面的章节在分析SpringBoot启动过程中,我们发现SpringBoot使用Spring框架提供的SpringFactoriesLoader这个类,实现检索META-INF/spring.fact ...

  7. 【.NET】- Task.Run 和 Task.Factory.StartNew 区别

    Task.Run 是在 dotnet framework 4.5 之后才可以使用, Task.Factory.StartNew 可以使用比 Task.Run 更多的参数,可以做到更多的定制. 可以认为 ...

  8. ASP.NET MVC 多语言解决方案

    1:打开VS,新建ASP.NET MVC4项目 2:创建一个放本地化资源的文件夹并命名为"Language",右键选择添加新项,选择资源文件并命名为"Com" ...

  9. 安装多个版本JDK相关问题

    一.前言 因敝人计算器上面安装了多个版本的JDK,其中包括JDK1.6.JDK1.7.JDK1.8,想通过变换环境变量(JAVA_HOME)的形式切换不同的JDK,但是我在安装了JDK1.7并且配置了 ...

  10. Android基础------通知栏

    前言:Android通知栏提示笔记 通知几乎是每一款app都拥有的功能 1.发送通知 发送一个通知栏必须用到两个类:  NotificationManager . Notification. Noti ...