简单介绍aspose-words-18.10-jdk16做导出word
今天在搞那个用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的更多相关文章
- 简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值(转)
本文将简单介绍如何使用PowerMock和Mockito来mock1. 构造函数2. 静态函数3. 枚举实现的单例4. 选择参数值做为函数的返回值5. 在调用mock出来的方法中,改变方法参数的值 一 ...
- Spring进阶之路(10)-Advice简单介绍以及通过cglib生成AOP代理对象
Advice简单介绍 1. Before:在目标方法运行之前运行织入.假设Before的处理中没有进行特殊的处理.那么目标方法终于会运行,可是假设想要阻止目标方法运行时.能够通过抛出一个异常来实现.B ...
- Android发展简单介绍
Android一词的本义指“机器人”,同一时候也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统.中间件.用户界面和应用软件组成,号称是首个为移动 ...
- HTML简单介绍及举例
超文本标记语言(Hyper Text Markup Language,简称HTML)是为"网页创建和其他可在网页浏览器中看到的信息"设计的一种标记语言.HTML被用来结构化信息,也 ...
- Docker的简单介绍及使用
Docker介绍 Docker是Docker.Inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源. Doc ...
- SQLite简单介绍
一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1)归档:NSCodeing.NSKeyed ...
- Junit使用的超简单介绍
Junit使用的超简单介绍 前言:我对Junit了解的并不多,只是今天突然听到有人提到了它,而且现在时间还早,所以我觉得我不妨更一篇关于Junit4的超级超级简单的用法,全当是为了省去看官网demo的 ...
- AudioToolKit的简单介绍及教程
AudioToolKit的简单介绍及教程 (2013-02-21 09:29:18) 转载▼ 标签: 游戏开发 unity3d教程 unity3d unity it 分类: Unity3d之插件篇 原 ...
- XML简单介绍及举例
可扩展标记语言(eXtensibleMarkup Language,简称XML).是一种标记语言.标记指计算机所能理解的信息符号.通过此种标记,计算机之间能够处理包括各种信息的文章等. 怎样定义这些标 ...
随机推荐
- Linux Kill 无法关闭进程
Kill -signal Process# signal 表示kill命令给进程发送的信号 Kill命令实际上执行的动作,是给进程发送信号,常用: INT 2 这个就是你在bash下面用Ctrl+C ...
- 0基础浅谈反射型xss (1)
0X1:在学习xss之前,先快速学习相关的HTML代码 1. <input>标签 文本域用法: <input type="text" /> Type的作 ...
- scrapy之 downloader middleware
一. 功能说明 Downloader Middleware有三个核心的方法 process_request(request, spider) process_response(request, res ...
- Java性能优化技巧及实战
关于Java代码的性能优化,是每个javaer都渴望掌握的本领,进而晋升为大牛的必经之路,但是对java的调优需要了解整个java的运行机制及底层调用细节,需要多看多读多写多试,并非一朝一夕之功.本文 ...
- Ubuntu下增加eclipse菜单图标并配置java path(解决点击图标不能启动eclipse的问题)
Ubuntu下增加eclipse菜单图标 Ubuntu的菜单图标在/usr/share/applications目录下. 1. 在/usr/share/applications目录下新建eclipse ...
- Django中的Session--实现登录
Django中的Session--实现登录 Django Session Session Session 是什么 Session保存在服务端的键值对. 为什么要有 Session Cookie 虽然 ...
- 插播一条 QQ头像无法正常显示问题
问题背景 不知道啥什么,QQ群的头像有些显示不全直接是默认的头像.想一想最近也没做啥,怎么就出问题了. 后来想一想,大概是个人文件夹的文件出问题了 解决办法 好友头像显示问题的删除 MiscHead. ...
- 利用setTimeout来实现setInterval
在Js中,当我们要在一定间隔时间内不断执行同一函数,我们可以使用setInterval函数,但setInterval在某些情况下使用时也存在一定问题. 1.不去关心回调函数是否还在运行 在某些情况下, ...
- java的instanceof简单使用
instanceof:是java中用来判断一个对象属于哪个类型的关键字 (instanceof是instance和of两个单词组成,但of并没有大写) eg: public class Test{ ...
- IntelliJ IDEA 转移 C盘.IntelliJIdea 索引目录
IntelliJ IDEA 索引目录默认路径是 C:\Users\用户\.IntelliJIdea 转移步骤 1. 将 C:\Users\用户\.IntelliJIdea 索引目录剪切到要移动到的 ...