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

java 同时被 2 个专栏收录
36 篇文章 0 订阅

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

求大佬赏赐几个积分留下了没钱的泪水,我想在csdn上下载一些需要的东西

  • 1
    点赞
  • 0
    评论
  • 2
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页

打赏作者

名字只是一个称呼

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值