今天在搞那个用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. mxonline实战6 , 忘记用户密码时进行重置

        对应github地址:密码重置   原理:  1. 一个需要输入用户邮箱和注册码的密码忘记页面 2. 点击提交后,用户邮箱收到一个邮件,包含重置密码的链接 3. 点击链接进入密码重置页面   ...

  2. Haproxy搭建Web群集

    一.Haproxy与LVS LVS不支持正则处理,不能实现动静分离,对于大型网站,LVS的实施配置复杂,维护成本相对较高 Harpoxy是一款可提供高可用性,负载均衡.及基于TCP和HTTP应用的代理 ...

  3. mybaits中"#"和"$"的区别

    动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析.mybatis 为我们提供了两种支持动态 sql ...

  4. Objective-C Associated Objects 的实现原理

    我们知道,在 Objective-C 中可以通过 Category 给一个现有的类添加属性,但是却不能添加实例变量,这似乎成为了 Objective-C 的一个明显短板.然而值得庆幸的是,我们可以通过 ...

  5. python 全栈开发:逻辑运算

    基础运算符 逻辑运算: 优先级:()> not > and >or 数字转bool值,0为False,非零的数字为True. 1. print(2 > 1 and 1 < ...

  6. [Re:从零开始的分布式] 0.x——分布式锁概述

    为什么需要分布式锁 Martin Kleppmann是英国剑桥大学的分布式系统的研究员,Martin认为一般我们使用分布式锁有两个场景: 效率:使用分布式锁可以避免不同节点重复相同的工作,这些工作会浪 ...

  7. 【数据库】:关于DB2数据库错误提示说明

    SQLSTATE 消息 本节列示 SQLSTATE 及其含义.SQLSTATE 是按类代码进行分组的:对于子代码,请参阅相应的表. 表 2. SQLSTATE 类代码类 代码 含义 要获得子代码, 参 ...

  8. [转] 使用HTTPS在Nexus Repository Manager 3.0上搭建私有Docker仓库

    FROM: https://www.hifreud.com/2018/06/06/03-nexus-docker-repository-with-ssl/ 搭建方式 搭建SSL的Nexus官方提供两种 ...

  9. C# GDI+开发手记

    创建画布画字体文字区域内居中换行文字在整个画布中居中画直线画圆形头像压缩保存图片缩放旋转单位换算 创建画布 Bitmap image = new Bitmap(640, 1136, PixelForm ...

  10. css中奇怪的地方

    1.border-color      继承内部元素前景色(color:black.可能对元素本身没有效果) 2.border-style:none;//不仅样式没了,border-width也变为0 ...