找回密码
 立即注册

QQ登录

只需一步,快速开始

Winny

超级版主

141

主题

261

帖子

1682

积分

超级版主

Rank: 8Rank: 8

积分
1682
Winny
超级版主   /  发表于:2023-6-13 14:53  /   查看:1593  /  回复:0
需求背景:
在工程领域相关的Excel文件中,会涉及一些emf格式的图片。如果需要将这些文件转移到线上,在浏览器端展示时,会发现这些图片无法正常显示。这是因为浏览器只能识别web端支持的图片类型。目前浏览器主要支持的图片有7中,分别是:jpg、png、gif、svg、bmp、ico、webp。 webp 已在多种主流浏览器上获得支持。 avif 目前Chrome和Firefox已支持,但Edge还不支持。

解决方案:
如果想在web端正常的展示emf图片,就需要将emf图片转化成浏览器能支持的图片类型。在这里,比较建议通过批量处理的方式,选择GCExcel来识别文件中的emf图片,之后调用其它三方的emf图像转化工具,将emf转化为其它web端能够支持的图片,并替换原来的emf图像。核心代码如下:
  1. public static void testImg() throws IOException {
  2.         Workbook workbook = new Workbook();
  3.         workbook.open("复杂文档.xlsx");
  4.         IWorksheet worksheet = workbook.getWorksheets().get("图片emf");
  5.         IShapes shapes = worksheet.getShapes();
  6.         for (IShape shape : shapes) {
  7.             if (shape.getType().equals(ShapeType.Picture) && shape.getPictureFormat().getType().equals(ImageType.EMF)) {
  8.                 byte[] imgs = shape.getPictureFormat().getFill();
  9.                 FileOutputStream fos = new FileOutputStream(new File("转换.emf"));
  10.                 fos.write(imgs);
  11.                 fos.close();
  12.                 // 这里调用一个转换图片类型的返方法
  13.                 // https://blog.csdn.net/weixin_47512836/article/details/119835108
  14.                 double left = shape.getLeft();
  15.                 double top = shape.getTop();
  16.                 double width = shape.getWidth();
  17.                 double height = shape.getHeight();
  18.                 double widthInPixel = shape.getWidthInPixel();
  19.                 double heightInPixel = shape.getHeightInPixel();
  20.                 shape.delete();
  21.                 IShape picture = worksheet.getShapes().addPicture("开心果.png", left, top, width, height);
复制代码

关于图片转化工具,代码中给了一个我自己搜索的转换工具,也可以根据自己的习惯,选择其它后端工具解决。

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部