今天在搞那个用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