java - 无法将 HSSFWorkbook 写入 ByteArray,然后将其读取到 HSSFWorkbook

标签 java stream arrays apache-poi

5i 需要将 HSSFWorkbook(Apache 的 POI)转换为 ByteArray,然后将 ByteArray 转换回 HSSFWorkbook。以下测试用例说明了我的问题:

   @Test
   public void testXLSExportImport(){
      try {
         InputStream is = new FileInputStream(FILEPATH);
         HSSFWorkbook wb = new HSSFWorkbook(is);
         byte[] exported = wb.getBytes();
         HSSFWorkbook wb2 = new HSSFWorkbook(new ByteArrayInputStream(exported)); 
         //in the line above the exception is thrown
      } catch (Exception e) {
         assertTrue(false);
      }
   }

测试用例失败并出现异常:java.io.IOException:无效的 header 签名;读取 0x0005060000100809,预期为 0xE11AB1A1E011CFD0

(我正在使用 Apache POI 3.5-beta3)

我希望有人能帮助我...我怎样才能让它工作?!

最佳答案

您没有正确编写作业簿!您需要使用 write(Outputstream)打电话。

various examples on the website所示,您的代码应该是:

     InputStream is = new FileInputStream(FILEPATH);
     HSSFWorkbook wb = new HSSFWorkbook(is);
     ByteArrayOutputStream out = new ByteArrayOutputStream();
     wb.write(out);
     HSSFWorkbook wb2 = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); 

此外,如果您有直接使用的文件,请不要从 FileInputStream 打开工作簿。从文件打开 uses less memory than from a Stream .

关于java - 无法将 HSSFWorkbook 写入 ByteArray,然后将其读取到 HSSFWorkbook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18321201/

相关文章:

java - Intellij Idea 不断给出 JDOMParseException 错误

c++ - 删除指向流的类成员指针的段错误

c# - CanSeek = false 时 Stream 的 Length 属性行为

java - 如何在数组中使用 get 方法?

java - socket.accept() 不执行

java - Android ACRA 自定义 ReportSender 发送方法调用两次

java - 我可以在没有 Bouncy CaSTLe 的情况下使用 PKCS#7 加密、解密、签名或验证数据吗?

c# - 为什么我的 StreamWriter 不写入 .txt 文件?

javascript - 如何检查字段是否包含数字字符串或数组

c++ - 比较C中的两个int数组