我正在使用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);


但是仍然没有解决方案。

最佳答案

我遇到了您所描述的确切问题,并且能够通过上述某些注释(也称为here)中所建议的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);

10-05 19:49