EasyPoi导出图片 您所在的位置:网站首页 excel的链接导出图片 EasyPoi导出图片

EasyPoi导出图片

2023-11-12 03:16| 来源: 网络整理| 查看: 265

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

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

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

1. 前端 导出 // 导出 $("#excelOutBtn").click(function () { window.location.href = "/projectName/aaa/bbb/excelOut"; }); 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 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(); } } } }

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有