2013-08-19 4 views
0

5i необходимо преобразовать HSSFWorkbook (POI Apache) в ByteArray, а затем преобразовать ByteArray обратно в HSSFWorkbook. Следующий TestCase иллюстрирует мою проблему:Невозможно записать HSSFWorkbook в 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); 
     } 
    } 

TestCase терпит неудачу за исключением: java.io.IOException: Invalid подпись заголовка; прочитать 0x0005060000100809, ожидаемый 0xE11AB1A1E011CFD0

(я использую апачей POI 3.5-Beta3)

Я надеюсь, что кто-то может мне помочь ... как я могу заставить его работать ?!

+0

Почему вы используете такую ​​старую версию POI? Хотя я не уверен, я бы сказал, что обновление по крайней мере поможет. Самая последняя стабильная версия - 3.9. – akokskis

+0

, потому что я также использую старую версию прайс-листов: (... обновление было бы очень много работы и не может быть выполнено к настоящему времени –

ответ

2

Вы не правильно пишете книгу! Вы должны использовать вызов 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.

Смежные вопросы