2016-04-10 2 views
-4

Я использую Apache POI Streaming API-SXSSFWorkbook для записи данных в файл excel. Но файл Excel поврежден более чем для 100 000 записей с 300 столбцами, если размер больше 100 МБ. Есть ли способ записи огромных данных в файл excel.Запись 1 миллиона записей в файл Excel с 300 столбцами

class Test1 { 
    public static void main(String[] args) throws FileNotFoundException, { 


    SXSSFWorkbook workbook = new SXSSFWorkbook(100); 

    workbook.setCompressTempFiles(true); 
    Sheet sheet = null; 
    Row row = null; 
    Cell cell = null; 
    sheet = workbook.createSheet("Demo1"); 
    FileOutputStream outStream = new FileOutputStream("D:\\Test1.xlsx"); 
    try { 

     for (int i = 0; i < 100000; i++) { 
      row = sheet.createRow(i); 
      for (int j = 0; j < 300; j++) { 
       cell = row.createCell(j); 
       cell.setCellValue(" row : "+i +" col: "+ j); 
      } 
     } 


     workbook.write(outStream); 

    } catch (Exception exception) { 
     exception.printStackTrace(); 
    } finally { 
     workbook.dispose(); 
     try { 
      outStream.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

Edit 1:

Я обнаружил, что это не проблема с Apache POI Streaming Api.It генерирует файл с 1 миллиона записей. Но Excel не загружает этот файл. Он дает сообщение «Недостаточно памяти для завершения этого действия».

Я использую 32-разрядную версию Excel 2013, которая может использовать только до 2 ГБ памяти. Файл excel, который я создал с 100 тыс. Записей и 300 столбцов, имеет размер файла 108 МБ. Когда я пытаюсь открыть этот файл в Excel, он занимает много системной памяти. Как только потребление памяти достигнет 1,7 МБ, Excel дает ошибку.

Какова минимальная конфигурация для загрузки 1 миллиона строк, созданных с использованием Apache Streaming API? Любая помощь будет оценена по достоинству.

Спасибо.

Редактировать 2: Если я открываю файл Excel, созданный с использованием Apache Streaming Api в формате zip (путем переименования .xlsx в .zip), размер файла xml в папке xl-> worksheets составляет около 2 ГБ для записей 100 тыс. И 300 колонны. Есть ли способ уменьшить размер этого xml-файла.

+1

В чем проблема? Я пишу большие файлы XLSX с использованием потоковой передачи SXSSF и не испытывал проблем. (Помимо наличия достаточного дискового пространства с выходными и tmp-областями). – rpy

+0

Когда я пытаюсь открыть файл с помощью Excel 2007, он показывает, что «Excel нашел нечитаемый контент». Любая помощь могла бы быть полезна. – teja

+0

Вы проверили, достаточно ли свободного места на диске? Это тот же код, генерирующий рабочий файл Excel, который генерирует только некоторые строки (например, <100k)? Работает ли оно с меньшим количеством столбцов (например, <256)? – rpy

ответ

1

Никогда не пробовал самостоятельно генерировать более 100-120 столбцов. Но ограничение на 255 столбцов max не удивительно (так было со старыми форматами Excel). Ваше наблюдение, что строки 100k с 200 столбцами работают нормально, а строки 100k с 300 столбцами терпят неудачу, является сильным индикатором такого ограничения.

Затем вы сможете создать лист строк размером 1 миллион (ровно 1048576) с числом столбцов до 255. Для любых дополнительных строк и дополнительных столбцов вам необходимо создать дополнительные листы.

Итак, с целевым значением в 300 столбцов вы должны генерировать sheet1 с первыми 255 столбцами (или немного меньше, если есть разумная логическая группировка) и sheet2 с другими столбцами.

Для большего количества строк повторите 2-сторонний подход с новой парой листов до тех пор, пока не будут созданы все строки.

BTW,
Вы признали, что с использованием SXSSFWorkbook строкаAccessWindowSize от «1» дает лучшую производительность?

+0

Спасибо за ответ. Какую служебную версию вы используете для открытия файла с 1 миллионом строк и 100 столбцов. Я использую 32-разрядную версию Excel 2007. Если я попытаюсь открыть файл, он дает недостаточно ресурсов для отображения сообщения об ошибке. – teja

+0

Лично пользуюсь LibreOffice. Но сообщение об ошибке звучит так, как будто ваш компьютер слишком мал для открытия файла. – rpy

+0

Можете ли вы поделиться сведениями о конфигурации системы, которые используются для загрузки 1 миллиона записей, созданных с использованием Apache Streaming API. Спасибо. – teja

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