你的位置:首页 > Java教程

[Java教程]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 文档保存为

3.用 Firstobject free

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

Firstobject free

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

4.将

 

需要注意的问题:

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

b.用 Firstobject free

 

实现的代码如下:

 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 }

 a. 代码数据库为 mysql ,将查询到的数据,动态填入到wod 中;

 b.template.process(),接受一个 Map 和 输入流做为入参,Map 既是你需要动态生成到 doc 里面的数据,字段名必须与你在 .ftl 里面定义的一致;

 c. 我觉得数据的来源可以很多,程序计算的结果,数据库存储的数据,页面点击的数据.........

 d. 如果你想利用这段代码,需要有一个 .ftl 文件,并且在你的项目 src 目录下面新建 template 目录;

 e.我不知道怎样把 .ftl 文件上传上来,如果需要做例子的,请在下面留言,我发给你。