今天在搞那个用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就引进来了,我们可以做测试了

 import com.aspose.words.Document;
import com.aspose.words.License;
import com.bns.modules.pr.utils.MapMailMergeDataSource;
import org.aspectj.weaver.ast.Test; import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class WordExportUtilTest {
public static boolean getLicense() {
boolean result = false;
try {
InputStream is = Test.class.getClassLoader().getResourceAsStream("license.xml");
License aposeLic = new License();
aposeLic.setLicense(is);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
} public void savedocx() throws Exception {
//这里需要注册一下,不注册的话,到时候word就会出现水印了
if (!getLicense()) {
return;
}
//载入模板
Document doc = new Document("D:\\Template.docx");
List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>(); String imagePath = "D:\\employees.jpg";
//读取一个二进制图片
FileInputStream fis = new FileInputStream(imagePath);
byte[] image = new byte[fis.available()];
fis.read(image);
fis.close(); for (int i = 0; i < 5; i++) {
Map<String, Object> record = new HashMap<String, Object>();
//这里的key要与模板中的<<xxxxx>>对应
record.put("FirstName", "欧阳");
record.put("LastName", "夏丹");
record.put("Time", "2018/12/20测试");
record.put("Title", "个人简历导出Word PDF");
record.put("Address", "中国 北京市 东城区");
record.put("City", "北京");
record.put("Country", "辽宁沈阳");
record.put("PhotoBLOB", image);
dataList.add(record);
}
//填充数据源
doc.getMailMerge().executeWithRegions(new MapMailMergeDataSource(dataList, "UserList"));
//保存合并后的文档
doc.save("D:\\Template1.docx");
} }

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

 import com.aspose.words.IMailMergeDataSource;
import com.aspose.words.ref.Ref; import java.util.ArrayList;
import java.util.List;
import java.util.Map; /**
* 因为Aspose.Words for Java不支持HashMap的数据格式,所以这个类是为了实现对HashMap的支持
* */
public class MapMailMergeDataSource implements IMailMergeDataSource {
private List<Map<String, Object>> dataList;
private int index; //word模板中的«TableStart:tableName»«TableEnd:tableName»对应
private String tableName = null; /**
* @param dataList 数据集
* @param tableName 与模板中的Name对应
*/
public MapMailMergeDataSource(List<Map<String, Object>> dataList, String tableName) {
this.dataList = dataList;
this.tableName = tableName;
index = -1;
} /**
* @param data 单个数据集
* @param tableName 与模板中的Name对应
*/
public MapMailMergeDataSource(Map<String, Object> data, String tableName) {
if (this.dataList == null) {
this.dataList = new ArrayList<Map<String, Object>>();
this.dataList.add(data);
}
this.tableName = tableName;
index = -1;
} /**
* 获取结果集总数
*
* @return
*/
private int getCount() {
return this.dataList.size();
} @Override
public IMailMergeDataSource getChildDataSource(String arg0)
throws Exception {
return null;
} @Override
public String getTableName() throws Exception {
return this.tableName;
} /**
* 实现接口
* 判断是否还有下一条记录
*/
@Override
public boolean moveNext() throws Exception {
index += 1;
if (index >= this.getCount()) {
return false;
}
return true;
} /**
* 实现接口
* 获取当前index指向数据行的数据
* 将数据存入args数组中即可
*
* @return ***返回false则不绑定数据***
*/
@Override
public boolean getValue(String key, Ref<Object> args) throws Exception {
if (index < 0 || index >= this.getCount()) {
return false;
}
if (args != null) {
args.set(this.dataList.get(index).get(key));
return true;
} else {
return false;
}
}
}

这里大家要开始注意了

​​

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

​​

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

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

 public boolean getValue(String key, Object[] args ) throws Exception {
if (index < 0 || index >= this.getCount()) {
return false;
}
if (args != null && args.length > 0) {
//args.set(this.dataList.get(index).get(key));
args[0] = this.dataList.get(index).get(key);
return true;
} else {
return false;
}
}

​​
上面的代码和图是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

简单介绍aspose-words-18.10-jdk16做导出word的更多相关文章

  1. 简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值(转)

    本文将简单介绍如何使用PowerMock和Mockito来mock1. 构造函数2. 静态函数3. 枚举实现的单例4. 选择参数值做为函数的返回值5. 在调用mock出来的方法中,改变方法参数的值 一 ...

  2. Spring进阶之路(10)-Advice简单介绍以及通过cglib生成AOP代理对象

    Advice简单介绍 1. Before:在目标方法运行之前运行织入.假设Before的处理中没有进行特殊的处理.那么目标方法终于会运行,可是假设想要阻止目标方法运行时.能够通过抛出一个异常来实现.B ...

  3. Android发展简单介绍

    Android一词的本义指“机器人”,同一时候也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统.中间件.用户界面和应用软件组成,号称是首个为移动 ...

  4. HTML简单介绍及举例

    超文本标记语言(Hyper Text Markup Language,简称HTML)是为"网页创建和其他可在网页浏览器中看到的信息"设计的一种标记语言.HTML被用来结构化信息,也 ...

  5. Docker的简单介绍及使用

    Docker介绍 Docker是Docker.Inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源. Doc ...

  6. SQLite简单介绍

    一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1)归档:NSCodeing.NSKeyed ...

  7. Junit使用的超简单介绍

    Junit使用的超简单介绍 前言:我对Junit了解的并不多,只是今天突然听到有人提到了它,而且现在时间还早,所以我觉得我不妨更一篇关于Junit4的超级超级简单的用法,全当是为了省去看官网demo的 ...

  8. AudioToolKit的简单介绍及教程

    AudioToolKit的简单介绍及教程 (2013-02-21 09:29:18) 转载▼ 标签: 游戏开发 unity3d教程 unity3d unity it 分类: Unity3d之插件篇 原 ...

  9. XML简单介绍及举例

    可扩展标记语言(eXtensibleMarkup Language,简称XML).是一种标记语言.标记指计算机所能理解的信息符号.通过此种标记,计算机之间能够处理包括各种信息的文章等. 怎样定义这些标 ...

随机推荐

  1. [agc006f] Blackout 神题

    Description ​ 给你一个NN行NN列的网格,第ii行第jj列的格子用(i,j)(i,j)表示 一开始的时候有MM个格子被涂成黑色,其他的格子都是白色,具体一点,涂成黑色的格子为(a1,b1 ...

  2. 【文文殿下】对后缀自动机(SAM)的理解

    后缀自动机,是一种数据结构,是由状态和转移关系构成的.它虽然叫做后缀自动机,可是他却与后缀并没有什么太大的联系. 后缀自动机的每一种状态都是原串的一些子串的集合,每个子串只唯一存在于某个状态中,对每一 ...

  3. Spring-解决请求中文乱码问题

    解决spring请求中文乱码问题 1.web.xml添加编码拦截器 <filter> <filter-name>CharacterEncoding</filter-nam ...

  4. SpringData JPA复合主键

    上一篇博客简单介绍了SpringData JPA实现简单的CRUD,分页与多条件的排序,那里的主键类型是Long,有时我们会遇到主键不是一个的,复合主键,经过调研如下.确定一个人,不能只根据他的姓名来 ...

  5. collections 模块常用方法学习

    前情提要: 1:模块介绍 个人认为就是 python自带的骚操作模块.如果基础能力够给力的话,完全用不到 个人认为解析式才是装逼神奇,用模块的都是伪娘 2:deque   双向列表 from coll ...

  6. leetcode-6-Z字形变换

    题目描述:  将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: P A H N A P L S I I G Y I R 之后从左往右,逐行读取字符:" ...

  7. Python unittest第二篇:测试夹具

    关于测试夹具,我们知道,以类为对象的话,在python里对应的方法分别是test_isupper.test_upper, 那么以测试case为单位呢? 这时候,就要提到我们的setup()和tearD ...

  8. Mac 10.12安装7zip/rar解压/压缩工具7zip-Keka

    说明:Keka支持解压和压缩,基本这个软件全部格式都搞定. 下载: (链接: https://pan.baidu.com/s/1kVmsj8z 密码: pydh)

  9. Linux/Mac安装oh-my-zsh后不执行~/.bash_profile、~/.bashrc解决办法

    安装了zsh之后默认启动执行脚本变为了-/.zshrc. 解决办法: Mac: 修改-/.zshrc文件,在其中添加:source -/.bash_profile.source -/.bashrc:注 ...

  10. (转)Heartbeat+DRBD+MySQL高可用方案

    原文:http://www.cnblogs.com/gomysql/p/3674030.html 1.方案简介 本方案采用Heartbeat双机热备软件来保证数据库的高稳定性和连续性,数据的一致性由D ...