当前位置: 首页 > news >正文

Java 动态生成复杂 Word

阅读目录

  • 1. 制作 Word 模版
  • 2. 将 Word文档保存为 xml 
  • 3. freemarker 标签语言替换字段
  • 4. 引入项目

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

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

参照过的博客链接:

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

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

回到顶部

1. 制作 Word 模版

 

回到顶部

2. 将 Word文档保存为 xml 

回到顶部

3. freemarker 标签语言替换字段

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

  FreeMarker 还支持需要丰富的标记,如果你想展示更复杂和丰富的内容,都可以实现,具体遇到需求时问度娘即可。

回到顶部

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 }
复制代码

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

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

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

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

FreeMarker.jar 、实例项目的.ftl 、XMl编辑工具百度云地址:

链接: http://pan.baidu.com/s/1qXhD5N2 密码: 876j

作者:Orson 
出处:http://www.cnblogs.com/java-class/ 
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】 
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】 
如果,您对我的博客内容感兴趣,请继续关注我的后续博客,我是【Orson】 

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段 声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 

转载:http://www.cnblogs.com/java-class/p/4686325.html

相关文章:

  • Competition-based User Expertise Score Estimation-20160520
  • 地址转换协议ARP
  • netstat -aon|findstr 8888 终止进程
  • 判断jQuery元素是否隐藏
  • 第二阶段—个人工作总结01
  • IO流的操作规律
  • C#创建https请求并使用pfx证书
  • Xcode 7 缺少 *.dylib库的解决方法
  • [C#基础]说说lock到底锁谁?
  • Shell学习笔记---重定向输入、输出(原创)
  • 堆的一些简单应用
  • dtrace4linux_Example
  • jQuery.extend 函数详解
  • Shiro安全框架入门篇(登录验证实例详解与源码)
  • goldengate一些参数整理
  • 10个确保微服务与容器安全的最佳实践
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Codepen 每日精选(2018-3-25)
  • export和import的用法总结
  • vue学习系列(二)vue-cli
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • Android开发者必备:推荐一款助力开发的开源APP
  • Spring第一个helloWorld
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #stm32驱动外设模块总结w5500模块
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (笔试题)合法字符串
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (状压dp)uva 10817 Headmaster's Headache
  • *1 计算机基础和操作系统基础及几大协议
  • .htaccess 强制https 单独排除某个目录
  • .NET gRPC 和RESTful简单对比
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET委托:一个关于C#的睡前故事
  • @Autowired标签与 @Resource标签 的区别
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @Transactional 竟也能解决分布式事务?
  • [ solr入门 ] - 利用solrJ进行检索
  • [ 蓝桥杯Web真题 ]-布局切换
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [acm算法学习] 后缀数组SA
  • [ActionScript][AS3]小小笔记
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [BZOJ1060][ZJOI2007]时态同步 树形dp