2012-06-21 2 views
2

Я новичок как официальный пользователь, я всегда находил здесь свои ответы, но теперь я должен спросить.Как скопировать целые листы из больших файлов excel без разбора их с помощью Apache POI?

Я работаю с последней версией apache-poi 3.8 (с 2012/03/26), и мне нужно манипулировать одним файлом с несколькими листами, в которых только один содержит большой объем данных (более 1000 столбцов и 10 000 строк).

Мне нужно иметь больше столбцов на большом листе. Поэтому, с существующими существующими инструментами, я должен использовать SAX для его чтения и SXSSF, чтобы переписать его.

Файл Excel уже предварительно отформатирован с различными стилями и изображениями на каждом листе, поэтому будет полезно сделать копию файла без большого листа.

У меня есть вопрос: Как я могу сделать копию листа с SAX (из входного потока в) без его разбора? Я пытался сделать как в here, но в поле sheets в XSSFWorkbook есть набор видимости для личного пользования.

Удивительная вещь - иметь что-то вроде SXSSFWriter.SheetIterator, если она будет в будущих планах для разработчиков POI.

Спасибо за чтение,

Артур

** Обновление * *

Файл слишком велик, чтобы быть в состоянии открыть его в качестве общей XSSFWorkbook (OutOfMemoryException) , Возможно ли создать и XSSFSheet из InputStream? Как и в следующем:

XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader 
      .getSheetsData(); 
    int index = 0; 
    while (iter.hasNext()) { 
     InputStream stream = iter.next(); 
     String sheetName = iter.getSheetName(); 
     if (!sheetName.equalsIgnoreCase("BigSheetThatIDontWant")) { 
      Sheet newSheet = new XSSFSheet(stream); 
      stream.close(); 
     } 
     ++index; 
    } 

Большое спасибо за ваши ответы.

ответ

2

я понял, на протяжении всего моего опыта работы с POI и операций копирования, что, насколько производительность не важна, для того, чтобы скопировать один или несколько листов безопаснее и проще загрузить всю книгу, удалить ненужные листы и затем сохранить результат в другом файле.

И +1 для Энди для итератора.

+0

* И +1 для Энди для итератора. * Но у Энди все еще есть 0 upvotes. –

+0

OMG вы правы :) Вы знаете, что они говорят о многозадачных и старых процессорах ... –