autoSizeColumn POI Java не работает должным образом

Я использую POI 3.9 и jdk1.6.0_14.

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

for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
            HSSFSheet thisSheet = workbook.getSheetAt(i);
            log.info("Last row : "+thisSheet.getLastRowNum());
            HSSFRow rowexcel = thisSheet.getRow(thisSheet.getLastRowNum());
            // Auto sizing columns
            for (short j = 0; j < rowexcel.getLastCellNum(); j++) {
                workbook.getSheetAt(i).autoSizeColumn(j);
            }
            // Freezing the top row
            workbook.getSheetAt(i).createFreezePane(0, 1);
        }

Вместо

HSSFRow rowexcel = thisSheet.getRow(thisSheet.getLastRowNum());

Я также пробовал с верхней строкой

HSSFRow rowexcel = thisSheet.getRow(0);

Но до сих пор нет разрешения.


person Soheb    schedule 07.05.2013    source источник
comment
Все ли шрифты, которые вы используете, присутствуют + доступны для Java в системе, в которой вы создаете файл?   -  person Gagravarr    schedule 07.05.2013
comment
Да, он использует шрифт Arial, который присутствует в Windows/Font. Сгенерированный файл также имеет шрифт Arial.   -  person Soheb    schedule 07.05.2013
comment
Но видит ли это Java? Размер столбца очень зависит от шрифта, и если у Java нет доступа к нужному шрифту, он не может правильно рассчитать ширину...   -  person Gagravarr    schedule 07.05.2013
comment
Вы также можете использовать setColumnWidth для каждой ячейки заголовка. Таким образом, размер будет применяться ко всем ячейкам.   -  person swamy    schedule 08.05.2013


Ответы (1)


Я столкнулся с той проблемой, которую вы описали, и смог добиться определенного успеха, явно установив шрифт с помощью стиля Cell, как это было предложено в некоторых комментариях выше (также здесь).

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

Сказав это, попробуйте создать лист с применением только очень простого набора стилей ячеек, а затем попробуйте настроить его оттуда:

// Let's test with Arial, 10pt
Font testFont = workbook.createFont();
testFont.setFontName("Arial");
testFont.setFontHeightInPoints((short)10);

// We'll apply a very bare-bones style to our cells that just applies the Font
CellStyle testCellStyle = workbook.createCellStyle();
testCellStyle.setFont(testFont);

// Your real data cell creation would go here instead of my dummy code:
CreationHelper creationHelper = workbook.getCreationHelper();
Row testRow = thisSheet.createRow(0);
int currentColumn = 0;

Cell testCell = testRow.createCell(currentColumn++);
testCell.setCellStyle(testCellStyle);
testCell.setCellType(Cell.CELL_TYPE_STRING);
testCell.setCellValue(creationHelper.createRichTextString("Cell Data Goes Here");

testCell = testRow.createCell(currentColumn++);
testCell.setCellStyle(testCellStyle);
testCell.setCellType(Cell.CELL_TYPE_STRING);
testCell.setCellValue(creationHelper.createRichTextString("Your Real Code Won't Be This Redundant :)");

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

int origColWidth = thisSheet.getColumnWidth(currentColumn);
thisSheet.autoSizeColumn(currentColumn);

// Reset to original width if resized width is smaller than default/original
if (origColWidth > thisSheet.getColumnWidth(currentColumn))
  thisSheet.setColumnWidth(currentColumn, origColWidth);
person GoldDragonTSU    schedule 26.06.2013