2015-08-14 4 views
1

Я уже довольно давно работаю над моделью Apache POI XSSF. Я пытаюсь создать лист Excel, который отформатирован и имеет некоторый набор стилей. По соображениям производительности я использовал пример Big-Grid, предоставляемый POI.Где разместить autoSizeColumn в Apache POI?

https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/BigGridDemo.java.

Наряду с этим я также хочу применить autoSizeColumn для каждого столбца. Но я не уверен, где я должен применить метод autoSizeColumn в данной программе.

private static void generate(Writer out, Map<String, XSSFCellStyle> styles,String inputFileName, XSSFSheet sheet) throws Exception { 

    BufferedReader br = null; 
    String line = ""; 
    String cvsSplitBy = ","; 
    SpreadsheetWriter sw = new SpreadsheetWriter(out); 
    sw.beginSheet(); 
    Integer rowId = 0;   
    br = new BufferedReader(new FileReader(inputFileName)); 
    while ((line = br.readLine()) != null) { 
     //use comma as separator 
     String[] reportRecords = line.split(cvsSplitBy); 
     if (rowId == 0) { // Print the Report Name   
      sw.insertRow(rowId++); 
      sw.createCell(0, StringEscapeUtils.escapeXml(line.substring(1, line.length() - 1)), styles.get("header").getIndex()); 
      sw.endRow();    
     } 
     else if(rowId == 1){ 
      sw.insertRow(rowId++); 
      for (int column = 0; column < reportRecords.length; column++) { 
       sw.createCell(column, StringEscapeUtils.escapeXml(reportRecords[column].substring(1,reportRecords[column].length() - 1)), styles.get("header").getIndex()); 
      }    
      sw.endRow();     
     } 
     else{ 
      sw.insertRow(rowId++); 
      for (int column = 0; column < reportRecords.length; column++) { 
       sw.createCell(column, StringEscapeUtils.escapeXml(reportRecords[column].substring(1,reportRecords[column].length() - 1))); 
      } 
      sw.endRow();    
     } 
    } 
    br.close(); 
    sheet.autoSizeColumn(1); 
    sheet.autoSizeColumn(2); 
    sheet.autoSizeColumn(3); 
    sw.endSheet(); 

} 

Ваша помощь очень ценится в этом отношении.

Спасибо!

+1

Выполняются ли ваши попытки изменения размера? – andrewdleach

+0

Знаете ли вы, что для автосогласования столбца требуется чтение каждой ячейки для работы, которая является самой длинной, что принципиально несовместимо с записью всех ячеек на диск, чтобы они не были в памяти? – Gagravarr

ответ

2

Вы упоминаете BigGridDemo. То, что вы, кажется, не смогли прочитать это большое предупреждение в the top of the file, и немного меньше, один далее вниз через Javadocs заголовка:

Примечание - Вы, наверное, не хотите использовать этот подход не больше,! POI теперь включает в себя SXSSF, который обрабатывает все это для вас, вы должны использовать это вместо ! Этот код остается в основном для исторического интереса.

Как говорится в заголовке, вы должны использовать SXSSF instead. SXSSF обеспечивает в значительной степени совместимый с XSSF способ записи файла .xlsx, но, создав сам XML и сохраняя лишь небольшое «окно» строк и ячеек в памяти, сохраняет очень низкое пространство памяти, которое BigGridDemo делает

, вам нужно изменить свой код, чтобы использовать SXSSFWorkbook, но в остальном в значительной степени быть таким же, как ваша голодная версия XSSF, и вы будете хорошими

Ну ... Кроме того, что для авторизации требуется доступ ко всем строкам в чтобы узнать, какая ячейка самая большая. SXSSF не может дать вам это, так как он сбрасывал почти все строки на диск, чтобы сохранить память. Таким образом, ваш авто-размер будет работать только для нескольких строк, которые все еще находятся в окне, так как они доступны только для проверки размера. Вероятно, в основном это будет правильно, так как обычно большинство ячеек столбца имеют одинаковый размер. Это может быть не идеально, но, к сожалению, это один из компромиссов использования более низкой памяти.

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