解决使用EasyPoi的ExcelExportEntity自定义字段导出Excel时,导出图片相关的问题

在开发一个动态导出Excel的功能时,由于原功能使用了EasyPoi,所以直接在这个基础上修改,导出图片时遇到NullPointerException,原代码如下:

List<ExcelExportEntity> exportFields = new ArrayList<>();

//省略

ExcelExportEntity excelExportEntity = new ExcelExportEntity(key, value); //key为表格字段名,value为类的属性名
excelExportEntity.setType(2); //2代表图片
excelExportEntity.setExportImageType(2); //2代表值类型为byte[]
exportFields.add(excelExportEntity);

//省略

Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportFields, temp);

由于业务要求,图片不能使用url地址,于是取了图片的字节流。

网上找了一圈,甚至连用同样方法的例子都没有,于是乎只能自己慢慢检查。

一步步进入方法,最后出问题的地方在这里:

public void createImageCell(Drawing patriarch, ExcelExportEntity entity, Row row, int i,         
    String imagePath, Object obj) throws Exception {
    Cell cell = row.createCell(i);
    byte[] value = null;
    if (entity.getExportImageType() != 1) {
        value = (byte[])((byte[])(entity.getMethods() != null ? 
        this.getFieldBySomeMethod(entity.getMethods(), obj) : 
        entity.getMethod().invoke(obj)));
    }
    this.createImageCell(cell, 50.0 * entity.getHeight(), entity.getExportImageType() == 1 
    ? imagePath : null, value);
}

可以看到,如果选择的是字节流导出,则会使用entity的getMethod()反射获取obj中的属性值,此处的obj就是excel的行内容,由于entity的method为null,导致报错。

这里就有个坑,明明在构建ExcelExportEntity时指定了属性名,但是EasyPoi不会自动通过这个方法设置method(当然,由于没有指定类,它也没办法获取),所以在构建时,需要手动设置method为图片属性的get方法。

修改后如下:

excelExportEntity.setMethod(ExportExcel.class.getMethod("getImgByte"));
excelExportEntity.setType(2);
excelExportEntity.setExportImageType(2);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值