2014-01-04 3 views
9

При работе со значениями, которые являются формулами, мне трудно получить столбцы для автоматической проверки правильности.Apache POI autoSizeColumn изменяет размер до минимальной ширины

Я решил «решить» это, создав скрытую строку, которая имеет максимальные значения в качестве значений постоянных строк, но это далеко не изящно и часто требует оценки формул в каждой ячейке, чтобы получить самые большие строки, которые сгенерированы. Хотя этот вид работ для такой небольшой таблицы, это становится очень непрактичным для листов, которые составляют ~ 16 столбцов х ~ 6000 строк.

Следующий код отображается как в OpenOffice.

package com.shagie.poipoc; 

import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.ss.usermodel.*; 
import java.io.FileOutputStream; 

public class SimpleBug { 
    public static void main(String[] args) { 
     try { 

      Workbook wb = new HSSFWorkbook(); 
      FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
      Sheet sheet = wb.createSheet("new sheet"); 

      Row row = sheet.createRow(0); 
      CellStyle style = wb.createCellStyle(); 
      style.setDataFormat(wb.createDataFormat().getFormat("[h]:mm")); 
      Cell cell = row.createCell(0); 
      cell.setCellValue(123.12); 
      cell.setCellStyle(style); 

      row.createCell(1).setCellFormula("A1"); 

      row.createCell(2) 
       .setCellFormula("TRUNC(A1) & \"d \" & TRUNC(24 * MOD(A1,1))" + 
       " & \"h \" & TRUNC(MOD(60 * 24 * MOD(A1,1),60)) & \"m\""); 

      row.createCell(3).setCellValue("foo"); 

      for(int i = 0; i < 4; i++) { 
       sheet.autoSizeColumn(i); 
      } 

      wb.write(fileOut); 
      fileOut.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 

Связанные и попробовал:

Apache POI autoSizeColumn Resizes Incorrectly Я пробовал шрифт в стиле. Я получил список всех шрифтов Java сознавал с

GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
for(String font:e.getAvailableFontFamilyNames()) { 
    System.out.println(font); 
} 

Я попробовал несколько из шрифтов, перечисленных в этом цикле, и в то время как OpenOffice изменил шрифт, столбцы, где до сих пор размер неправильно.

ответ

9

Предполагая, что вы хотите, чтобы иметь правильный размер столбца на основании результатов формулы, просто вставьте следующую строку прямо перед тем вы делаете autoSizeColumn, в этом случае, прежде чем ваш for цикла:

HSSFFormulaEvaluator.evaluateAllFormulaCells(wb); 

Причина: autoSizeColumn определяет размер вашей ячейки на основе результатов оценки в кешированной формуле, и если формула никогда не оценивалась, она не знает, какой размер будет установлен для нее.

Код:

... 

row.createCell(3).setCellValue("foo"); 
HSSFFormulaEvaluator.evaluateAllFormulaCells(wb); 

for (int i = 0; i < 4; i++) { 
    sheet.autoSizeColumn(i); 
} 

... 

Output (in OpenOffice)

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