Java 动态生成 复杂 .doc文件

项目中需要用 java 程序生成doc 文件,百度一番,FreeMarker 的评价比较高,FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出,至于想详细了解 FreeMarker 的请去问百度.....

这篇博文主要是总结自己在用网上例子时遇到的坑。吃水不忘挖井人,还是要感谢分享技术的前辈;

原文链接:

http://www.360doc.com/content/13/0731/10/13247663_303740756.shtml [博主博客很漂亮,赞一个]

参照过的例子链接:

1.http://www.360doc.com/content/13/0731/10/13247663_303740756.shtml

2.http://blog.csdn.net/zhanwentao2/article/details/7255432

FreeMarker.jar 下载地址:

1.http://download.csdn.net/detail/pc159321/7077059

2.http://download.csdn.net/detail/zhaoshe/3153176

主要思路如下:

1.word 里面调整好排版,包括你想生成的动态部分,还有一些不用生成的规则性的文字:

2. 将 word 文档保存为 xml ;

3.用 Firstobject free XML edito 打开,将你需要动态生成的字段打上标记,${} 这样就可以;

FreeMarker 还支持需要丰富的标记,如果你想展示更复杂和丰富的内容,都可以实现;

Firstobject free XML edito 友情下载链接:

http://www.cnblogs.com/know-life-death/archive/2012/02/01/2334742.html

4.将 xml 文件更改后缀名 为 .ftl, 然后引用到你的项目中;

需要注意的问题:

a. word 版本不能低于 2003 ,因为 2003 才开始支持 xml;

b.用 Firstobject free XML edito 打开 要编辑的 xml 文件时,记得xml 不要放在含有中文路径的目录中【编辑器会无响应,然后你知道的.....】;

实现的代码如下:

 1 import java.io.BufferedWriter;
 2 import java.io.File;
 3 import java.io.FileOutputStream;
 4 import java.io.OutputStreamWriter;
 5 import java.io.Writer;
 6 import java.sql.Connection;
 7 import java.sql.ResultSet;
 8 import java.util.HashMap;
 9 import java.util.Map;
10
11 import cn.sina.ttjava_13.database.DB;
12 import freemarker.template.Configuration;
13 import freemarker.template.Template;
14
15 public class WordTest {
16
17     private Configuration configuration = null;
18     private Connection conn;
19     private ResultSet res;
20
21     public WordTest() {
22         configuration = new Configuration();
23         configuration.setDefaultEncoding("UTF-8");
24     }
25
26     public void createWord() {
27         Map<String, Object> dataMap = new HashMap<String, Object>();
28         try {
29             String selectSql = "SELECT ID,NAME,NORMALPRICE,MEMBERPRICE FROM T_PRODUCT WHERE 1 LIMIT 10";
30             conn = DB.getConn();
31             res = DB.getRs(conn, selectSql);
32             while(res.next()){
33                 dataMap.put("id", res.getString("id").trim());
34                 dataMap.put("name", res.getString("name").trim());
35                 dataMap.put("normalprice", res.getString("normalprice").trim());
36                 dataMap.put("memberprice", res.getString("memberprice").trim());
37
38                 configuration.setClassForTemplateLoading(this.getClass(), "/template"); // FTL文件所存在的位置
39                 Template template = configuration.getTemplate("Product.ftl");
40
41                 File outFile = new File("D:/temp/"+ res.getString("name").trim().replaceAll("/", "") +".doc");
42                 Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
43                 template.process(dataMap, out);
44                 out.close();
45             }
46             DB.close(res);
47             DB.close(conn);
48         } catch (Exception e) {
49             e.printStackTrace();
50         }
51     }
52
53     public static void main(String[] args) {
54         WordTest test = new WordTest();
55         test.createWord();
56     }
57 }
时间: 2025-01-07 06:52:07

Java 动态生成 复杂 .doc文件的相关文章

Java中动态生成当前日期的文件

1.Java中动态生成当前日期的文件名称并且将控制台的输出信息输入到文件中     public static void SaveClonseToFile() throws IOException, FileNotFoundException {         File f = new File(getCurrentDateFileName() + ".txt");         f.createNewFile();         FileOutputStream fileOut

利用Java动态生成 PDF 文档

利用Java动态生成 PDF 文档,则需要开源的API.首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档.那么目前最佳的解决方案,你可能会想到 iText ,对没错... iText+(Velocity / Freemarker)可以实现.不过据我熟悉,iText本身提供的HTML解析器还是不够强大,许多HTML标签和属性无法识别,更悲催的是简单的CSS它不认识,排版调整样式会让你头大的.不要失望,接下来

java后台生成zip打包文件

/** * * @param zipFile 压缩包文件对象 * @param listKey 压缩的图片物理地址 * @return */ public static boolean packageZip(File zipFile,List<String> listKey){ //图片打包操作 ZipOutputStream zipStream = null; FileInputStream zipSource = null; BufferedInputStream bufferStream

构建施耐德楼控系统数据库后台服务器示例工程五(JAVA动态生成类)

在做数据库简易工具的过程中遇到了这么一个问题,即程序部署在tomcat下启动运行后,我们无法事先定义数据库中后续创建的表结构的Hibernate Bean对象,这样就需要我们在服务器运行起来后动态创建bean对象.cglib这个开源库即可解决我们的问题,动态创建JAVA对象. 1.cglib开源库简介 CGLIB(Code Generation Library)是一个开源项目,是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口. 反编译后CGLIB结构

java动态生成验证码图片

package cn.lijun.checkimg; import java.awt.image.BufferedImage;import java.io.BufferedReader; import java.awt.Color;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.Random; import

java直接生成zip压缩文件精简代码(跳过txt文件)

/** * @param args */ public static void main(String[] args) throws Exception{ ZipOutputStream zos = null; zos = new ZipOutputStream(new FileOutputStream("c:\\temp7.zip")); String ss = "cName\t\tcCode\t\tcreateDate\n"; ss += "dbc券9

动态生成修改aspx文件

using System.IO; using System.Text;/// <summary>/// SCPage 的摘要说明 修改 aspx 和aspx.cs文件/// </summary>public class SCPage{    public SCPage() { } System.Web.UI.Page p = new Page(); /// <summary>    /// 生成aspx文件    /// </summary>    ///

java 动态生成类再编译最后代理

package spring.vhostall.com.proxy; public interface Store { public void sell(); } -------------------------------------------- package spring.vhostall.com.proxy; public class Supermarket implements Store { @Override public void sell() { System.out.pr

Java动态加载属性文件.properties

问题: 当我们使用如下语句加载.properties时: ClassLoader classLoader = this.getClass().getClassLoader(); Properties prop = new Properties(); prop.load(classLoader.getResourceAsStream("/Application.properties")); 会发现修改了.properties后,即使重新执行,读入的仍为修改前的参数.此问题的原因在于Cla