EasyPoi导出图片

27 篇文章 1 订阅

开发过程中遇到一个导出图片的需求,项目用的是easypoi插件,其官网写的实在太模糊,大概是为了避免菜鸟用easypoi拉低插件逼格。参考网上一位巨佬的文章,搞了半天终于出来,在此特意感谢那个巨佬。

Easypoi官方教程:http://doc.wupaas.com/docs/easypoi/easypoi-1c0u4mo8p4ro8

我的做法是根据图片的链接地址,将图片资源下载成二进制字节数组保存起来,然后导出Excel。

1. 前端

<!--HTML-->
<button type="button" id="excelOutBtn" class="btn btn-sm bg-orange">
    <i class="fa fa-cloud-download fa-btn"></i> 导出
</button>


<!--JS-->
<script type="text/javascript">
// 导出
$("#excelOutBtn").click(function () {
    window.location.href = "/projectName/aaa/bbb/excelOut";
});
</script>

2. 导出实体

@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
@ExcelTarget("ImageInfo")
public class ImageInfo{

    @Excel(name = "图片名称", width = 20)
    private String imgName;

    @Excel(name = "图片路径", width = 40)
    private String imgUrl;

    /** 
    type =2 该字段类型为图片
    imageType=1 (默认可以不填)表示从file读取,字段类型是个字符串类型,
可以用相对路径也可以用绝对路径、绝对路径优先依次获取。

    imageType=2 表示从数据库或者已经读取完毕,字段类型是个字节数组,直接使用,
同时image 类型的cell最好设置好宽和高,会百分百缩放到cell那么大,不是原尺寸。
    **/
    @TableField(exist = false)
    @Excel(name = "图片", type = 2, width = 60, height = 60, imageType = 2)
    private byte[] imgFile;

}

3. 根据URL下载图片工具 HttpImgUtils

/**
 * @author gmd
 * @description 网络图片下载工具
 * @date 2020年9月18日09:34:41
 */
@Slf4j
public class HttpImgUtils {

    /**
     * 获取网络图片转成字节流
     * @param strUrl 完整图片地址
     * @return 图片资源数组
     */
    public static byte[] getNetImgByUrl(String strUrl) {
        try {
            URL url = new URL(strUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(2 * 1000);
            // 通过输入流获取图片数据
            InputStream inStream = conn.getInputStream();
            // 得到图片的二进制数据
            byte[] btImg = readInputStream(inStream);
            return btImg;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 从输入流中获取字节流数据
     * @param inStream 输入流
     * @return  图片流
     */
    private static byte[] readInputStream(InputStream inStream) throws Exception {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        // 设置每次读取缓存区大小
        byte[] buffer = new byte[1024*10];
        int len = 0;
        while ((len = inStream.read(buffer)) != -1) {
            outStream.write(buffer, 0, len);
        }
        inStream.close();
        return outStream.toByteArray();
    }

    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        String url = "https://www.baidu.com/img/flexible/logo/pc/result.png";
        System.out.println(getNetImgByUrl(url));
    }

}

4. Controller层实现


@GetMapping("aaa/bbb/excelOut")
public void excelOut(HttpServletResponse response, @RequestParam Map para) {
	List<ImageInfo> result = imgService.selectExcelList(para);
	for (ImageInfo img : result) {
		try {
			img.setImgFile(HttpImgUtils.getNetImgByUrl(img.getImgUrl()));
			// 路径无效则无法下载图片资源,导致该字段为NULL
			if (img.getImgFile() == null) {
				// 如果该图片资源不存在,则给默认的图片资源
				Img.setImgFile(HttpImgUtils.getNetImgByUrl("https://www.baidu.com/img/logo.jpg"));
			}
		} catch (Exception e) {
			log.error("导出文件_图片资源获取失败 url = "+img.getImgUrl);
			continue;
		}
	}
	String fileName = "图片信息表.xls";
	Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("图片信息", "图片信息"), ImageInfo.class, result);
	ServletOutputStream outputStream = null;
	try {
		outputStream = response.getOutputStream();
		response.setCharacterEncoding("UTF-8");
		response.setHeader("content-Type", "application/vnd.ms-excel");
		response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
		workbook.write(outputStream);
	} catch (IOException e) {
		log.error("导出图片失败");
		throw new RuntimeException(e);
	} finally {
		if (outputStream != null) {
			try {
				outputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

至此,导出功能就完成了。

### 回答1: easypoi是一款Java的开源库,用于将数据以Excel或Word的形式导出。虽然easypoi本身并不直接支持导出图片,但我们可以通过一些技巧来实现将图片导出到Excel或Word中。 首先,我们需要将图片以二进制的形式保存到数据库或文件系统中,然后在导出时通过easypoi将二进制数据读取出来,并将其插入到Excel或Word的对应单元格中。 对于Excel导出,我们可以使用easypoi提供的注解`@ExcelImage`来实现图片导出。我们需要在实体类中添加一个对应图片字段,并在该字段上添加`@ExcelImage`注解。同时,在导出时,我们需要使用`ImageBaseTypeHandler`来读取二进制数据,并将其转换为BufferedImage对象,最后通过`ExcelExportUtil.exportExcel`方法导出Excel。 对于Word导出,由于easypoi不支持直接导出图片到Word中,我们可以使用poi的相关类来实现。我们可以通过`XWPFRun`类的`addPicture`方法将图片插入到Word文档中的指定位置。 总结来说,虽然easypoi本身不直接支持导出图片,但我们可以通过一些技巧来实现将图片导出到Excel或Word中。对于Excel导出,可以使用easypoi提供的注解和相关类实现;对于Word导出,则需要借助poi的相关类来实现。 ### 回答2: Easypoi是一个Java的开源库,可用于导出Excel、Word等文档。虽然Easypoi主要用于导出表格数据,但是也可以借助其强大的特性来导出图片。 要使用Easypoi导出图片,需要按照以下步骤进行操作: 1. 导入相关的Easypoi的依赖包,例如easypoi、poi-ooxml、poi。 2. 创建一个实体类,用于存储要导出图片的相关信息,例如图片路径、图片名称等。 3. 创建一个Excel导出的模板,包括要显示图片的单元格。可以使用Excel工具创建一个模板文件,然后在需要显示图片的单元格中插入图片。 4. 在Java代码中,使用Easypoi提供的API,读取模板文件,并根据实体类中的数据,将图片路径、名称等信息写入到Excel模板中。 5. 调用Easypoi导出功能,将生成好的Excel文件导出,即可得到包含图片的Excel文件。 需要注意的是,Easypoi导出图片的原理是将图片的路径保存在Excel文件中,而不是将实际的图片数据存储在Excel中。所以在查看Excel文件时,需要保证图片文件的路径和名称是正确的,以确保能够正确显示图片。 总体而言,Easypoi提供了简便易用的功能,使得导出图片变得更加方便。无论是导出单个图片,还是在表格中显示多个图片,都可以通过Easypoi实现。不仅如此,Easypoi还提供了丰富的样式、格式、动态数据处理等功能,使得导出图片的过程更加灵活和可定制。 ### 回答3: easypoi是一款Java的POI扩展工具,可以用于导出Excel、Word、PDF等文档。在easypoi中,可以通过设置字段属性来实现导出图片的功能。 首先,需要在实体类中定义一个图片类型的字段,使用easypoi提供的@Excel注解来标注该字段需要导出图片。例如: ```java public class MyEntity { @Excel(name = "图片", type = 2, savePath = "\\images\\", width = 40, height = 60) private String image; //其他字段... } ``` 其中,@Excel注解的type属性设置为2,表示导出图片类型;savePath属性指定图片保存的路径;width和height属性设置导出图片的宽度和高度。 接下来,在导出Excel时,需要将包含图片字段的实体类列表传递给easypoi的ExcelExportUtil工具类。例如: ```java public class ExportTest { public static void main(String[] args) { List<MyEntity> list = new ArrayList<>(); //添加数据到list... Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), MyEntity.class, list); try { FileOutputStream fos = new FileOutputStream("output.xlsx"); workbook.write(fos); fos.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 执行上述代码后,会在指定路径下生成output.xlsx文件,该文件中包含了导出图片。 需要注意的是,图片的路径应该是相对于项目根目录的相对路径,而不是绝对路径。另外,导出图片的格式目前只支持jpg和png两种格式。 通过上述步骤,就可以使用easypoi导出带有图片的Excel文档了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值