Winny 发表于 2023-6-13 14:53:22

表格控件EMF图像展示处理方案

需求背景:
在工程领域相关的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图像。核心代码如下:
public static void testImg() throws IOException {
      Workbook workbook = new Workbook();
      workbook.open("复杂文档.xlsx");
      IWorksheet worksheet = workbook.getWorksheets().get("图片emf");
      IShapes shapes = worksheet.getShapes();
      for (IShape shape : shapes) {
            if (shape.getType().equals(ShapeType.Picture) && shape.getPictureFormat().getType().equals(ImageType.EMF)) {
                byte[] imgs = shape.getPictureFormat().getFill();
                FileOutputStream fos = new FileOutputStream(new File("转换.emf"));
                fos.write(imgs);
                fos.close();
                // 这里调用一个转换图片类型的返方法
                // https://blog.csdn.net/weixin_47512836/article/details/119835108
                double left = shape.getLeft();
                double top = shape.getTop();
                double width = shape.getWidth();
                double height = shape.getHeight();
                double widthInPixel = shape.getWidthInPixel();
                double heightInPixel = shape.getHeightInPixel();
                shape.delete();
                IShape picture = worksheet.getShapes().addPicture("开心果.png", left, top, width, height);
关于图片转化工具,代码中给了一个我自己搜索的转换工具,也可以根据自己的习惯,选择其它后端工具解决。

页: [1]
查看完整版本: 表格控件EMF图像展示处理方案