简单介绍aspose-words-18.10-jdk16做导出word

时间:2024-01-22 14:31:28

今天在搞那个用aspose words for java做导出word的功能,顺便简单介绍这个怎么用,我有两个版本的破解版,就都做简单介绍怎么用

警告:请勿用于商业用途,仅供学习研究使用,如有任何版权纠纷,本人概不负责!

由于aspose比较吃内存,操作大一点的文件就会堆溢出,所以请先设置好java虚拟机参数:-Xms1024m -Xmx1024m(参考值)

首先你可以去官网下载jar包也可以,我的是用jar包引进的

 

顺带一提,这两个版本都是pojieban的,15.8.0需要加那个aspechweaver-1.9.1的jar,18.10就不用,然后都需要license.xml这个配置文件用于注册的,主要是这个文件

 

jar包放到webapp下面的WEB_INF里面的lib文件夹下面,记得将包引进来(project Structrue——Modeules——右边的Dependecies)看图吧

这样这个jar就引进来了,我们可以做测试了

 1 import com.aspose.words.Document;
 2 import com.aspose.words.License;
 3 import com.bns.modules.pr.utils.MapMailMergeDataSource;
 4 import org.aspectj.weaver.ast.Test;
 5 
 6 import java.io.FileInputStream;
 7 import java.io.InputStream;
 8 import java.util.ArrayList;
 9 import java.util.HashMap;
10 import java.util.List;
11 import java.util.Map;
12 
13 public class WordExportUtilTest {
14 public static boolean getLicense() {
15 boolean result = false;
16 try {
17 InputStream is = Test.class.getClassLoader().getResourceAsStream("license.xml");
18 License aposeLic = new License();
19 aposeLic.setLicense(is);
20 result = true;
21 } catch (Exception e) {
22 e.printStackTrace();
23 }
24 return result;
25 }
26 
27 
28 public void savedocx() throws Exception {
29 //这里需要注册一下,不注册的话,到时候word就会出现水印了
30 if (!getLicense()) {
31 return;
32 }
33 //载入模板
34 Document doc = new Document("D:\\Template.docx");
35 List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
36 
37 String imagePath = "D:\\employees.jpg";
38 //读取一个二进制图片 
39 FileInputStream fis = new FileInputStream(imagePath);
40 byte[] image = new byte[fis.available()];
41 fis.read(image);
42 fis.close();
43 
44 for (int i = 0; i < 5; i++) {
45 Map<String, Object> record = new HashMap<String, Object>();
46 //这里的key要与模板中的<<xxxxx>>对应
47 record.put("FirstName", "欧阳");
48 record.put("LastName", "夏丹");
49 record.put("Time", "2018/12/20测试");
50 record.put("Title", "个人简历导出Word PDF");
51 record.put("Address", "中国 北京市 东城区");
52 record.put("City", "北京");
53 record.put("Country", "辽宁沈阳");
54 record.put("PhotoBLOB", image);
55 dataList.add(record);
56 }
57 //填充数据源
58 doc.getMailMerge().executeWithRegions(new MapMailMergeDataSource(dataList, "UserList"));
59 //保存合并后的文档
60 doc.save("D:\\Template1.docx");
61 }
62 
63 }

上面的测试的代码,不过因为Aspose.Words for Java不支持HashMap的数据格式,需要我们自己实现 
好在它提供了IMailMergeDataSource接口 

 1 import com.aspose.words.IMailMergeDataSource;
 2 import com.aspose.words.ref.Ref;
 3 
 4 
 5 import java.util.ArrayList;
 6 import java.util.List;
 7 import java.util.Map;
 8 
 9 /**
10 * 因为Aspose.Words for Java不支持HashMap的数据格式,所以这个类是为了实现对HashMap的支持
11 * */
12 public class MapMailMergeDataSource implements IMailMergeDataSource {
13 private List<Map<String, Object>> dataList;
14 private int index;
15 
16 //word模板中的«TableStart:tableName»«TableEnd:tableName»对应
17 private String tableName = null;
18 
19 /**
20 * @param dataList 数据集
21 * @param tableName 与模板中的Name对应
22 */
23 public MapMailMergeDataSource(List<Map<String, Object>> dataList, String tableName) {
24 this.dataList = dataList;
25 this.tableName = tableName;
26 index = -1;
27 }
28 
29 /**
30 * @param data 单个数据集
31 * @param tableName 与模板中的Name对应
32 */
33 public MapMailMergeDataSource(Map<String, Object> data, String tableName) {
34 if (this.dataList == null) {
35 this.dataList = new ArrayList<Map<String, Object>>();
36 this.dataList.add(data);
37 }
38 this.tableName = tableName;
39 index = -1;
40 }
41 
42 /**
43 * 获取结果集总数
44 *
45 * @return
46 */
47 private int getCount() {
48 return this.dataList.size();
49 }
50 
51 @Override
52 public IMailMergeDataSource getChildDataSource(String arg0)
53 throws Exception {
54 return null;
55 }
56 
57 @Override
58 public String getTableName() throws Exception {
59 return this.tableName;
60 }
61 
62 /**
63 * 实现接口
64 * 判断是否还有下一条记录
65 */
66 @Override
67 public boolean moveNext() throws Exception {
68 index += 1;
69 if (index >= this.getCount()) {
70 return false;
71 }
72 return true;
73 }
74 
75 /**
76 * 实现接口
77 * 获取当前index指向数据行的数据
78 * 将数据存入args数组中即可
79 *
80 * @return ***返回false则不绑定数据***
81 */
82 @Override
83 public boolean getValue(String key, Ref<Object> args) throws Exception {
84 if (index < 0 || index >= this.getCount()) {
85 return false;
86 }
87 if (args != null) {
88 args.set(this.dataList.get(index).get(key));
89 return true;
90 } else {
91 return false;
92 }
93 }
94 }

这里大家要开始注意了

 

我上面用的是18.10版本的是可以支持这个Ref<object> 的写法的,而且Ref里面实现了set的方法

我们才可以调用set的方法,好像18.6以后的版本都可以,之前的版本我没试过15.8的版本是不行的,所以15.8以下的版本都是不行的

如果使用15.8版本的话,需要改成这样

 1 public boolean getValue(String key, Object[] args ) throws Exception {
 2 if (index < 0 || index >= this.getCount()) {
 3 return false;
 4 }
 5 if (args != null && args.length > 0) {
 6 //args.set(this.dataList.get(index).get(key));
 7 args[0] = this.dataList.get(index).get(key);
 8 return true;
 9 } else {
10 return false;
11 }
12 }


上面的代码和图是aspose words-15.8才需要的改的

还要一个重要的事,就是模板,这个工具是需要模板来导出的,

上面需要注意的是《》里面不是手写的而是插入的,看图吧

而且还需要《TableStart:UserList》***《TableEnd:UserList》这两个对应的域,相当于循环***,就是要循环的内容

要跟代码对应哦,如果你那个写成abc,你就要写成《TableStart:abc》***《TableEnd:abc》

第一个是模板,第二个是图片的,第三个才是生成的word

这样就是结果了

上面说的jdk1.8的,我觉得用aspose words18.10的吧,比较版本比较新,兼容1.8,而且支持ref<object>的使用,而15.8的只能用Object[] ,这就是我上面提到的区别

我已经把打包好了,15.8一个包,18.10一个包

15.8的链接:https://download.csdn.net/download/qq_32003379/10868410

18.10的链接:https://download.csdn.net/download/qq_32003379/10868413