【问题标题】:Apache POI All Image Insert to Excel failing due to one corrupt image由于一个损坏的图像,Apache POI 所有图像插入到 Excel 失败
【发布时间】:2016-10-25 13:14:21
【问题描述】:

我准备了一个代码,它从数据库字段中获取字节,将图像存储为 BLOB,并使用 apache poi 3.9 版

将其插入到 excel 文件中

此代码运行良好,并且在大多数情况下,图像被拉出并锚定到指定的列和行。

代码如下:

Blob img = ads.getPhoto();
      byte[] imageByte = ads.getPhoto().getBytes(1, (int) img.length());
      if (imageByte.length > 10) {
      try {
       int picId = workbook.addPicture(imageByte, workbook.PICTURE_TYPE_JPEG);
       CreationHelper helper = workbook.getCreationHelper();
       Drawing drawing = sheet.createDrawingPatriarch();
       ClientAnchor anchor = helper.createClientAnchor();
       anchor.setCol1(2);
       anchor.setCol2(3);
       anchor.setRow1(rowId);
       anchor.setRow2(rowId + 1);
       Picture pict = drawing.createPicture(anchor, picId);
       System.out.println("TEST PRINT");
     } catch (Exception ex) {
        ex.printStackTrace();
     }

现在我已将范围缩小到导致问题的一张图片。对我来说,blob 看起来不错。但是,当插入所有图像以及该特定图像时,所有图像都会被删除,并且 excel 打开并显示错误消息:“文件错误:数据可能已丢失”

Drawing Patriarch 中的所有图像均未显示在 excel 中。 如果我跳过这个特定的行,图像在 excel 中显示得很好。它只是与这个特定的图像。

任何人都可以帮助我检查其中一个图纸是否有错误,如果发现则跳过它,以便保留其余图像并且仅删除此图像。

任何与此相关的建议都会有很大帮助。 提前致谢。

【问题讨论】:

  • 尝试升级到最新版本的 Apache POI?
  • 升级到 poi-3.14。结果是一样的。我相信问题不在于代码,而在于插入的图像。有没有提前知道这样的问题并避免这样的图像。
  • Workbook.addPicture 不会检查字节数组是否包含有效的图片数据。它只是将给定的字节写入 Excel 文件。似乎 Excel 在将字节呈现为 PICTURE_TYPE_JPEG 时出现问题。也许你可以先检查一下:stackoverflow.com/questions/4550296/…
  • 我在最终放弃并在这里询问之前已经验证了相同的内容。字节以 FFD8 开始,以 FFD9 结束。与数据库中的其他图像非常相似。此外,该图像正在由 HTML 呈现,但在 excel 中出现问题。
  • 此外,如果我从字节下载 jpeg 并将其保存在本地,则可以查看图像但是在手动尝试使用 Insert>Picture from file excel 将其插入 excel 时会出错。所以我认为该特定文件的字节应该存在一些基本问题。

标签: java apache-poi


【解决方案1】:

切换到 XSSF 适用于这种情况。损坏的图像显示为无效的图像图标。 所有其他人仍然正确填充。

但是使用 poi.3.15 的 XSSF 性能很差..

【讨论】:

  • 使用 SXSSFWorkbook 将进一步加快速度,因为它将流保存到文件而不是保存在内存中。 SXSSF(包:org.apache.poi.xssf.streaming)是 XSSF 的 API 兼容的流式扩展,可在必须生成非常大的电子表格且堆空间有限时使用。 SXSSF 通过限制对滑动窗口内行的访问来实现其低内存占用,而 XSSF 允许访问文档中的所有行。不再在窗口中的旧行在写入磁盘时变得不可访问。
猜你喜欢
  • 2014-03-26
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多