Apache POI autoSizeColumn Resizes Incorrectly
Just to make an answer out of my comment. The rows couldn't size properly because Java was unaware of the font you were trying to use this link should help if you want to install new fonts into Java so you could use something fancier. It also has the list of default fonts that Java knows.
Glad this helped and you got your issue solved!
This is probably related to this POI Bug which is related to Java Bug JDK-8013716: Renderer for Calibri and Cambria Fonts fails since update 45.
In this case changing the Font or using JRE above 6u45 / 7u21 should fix the issue.
You can also mtigitate the issue and avoid the columns from being totally collapsed by using a code like this:
sheet.autoSizeColumn(x);
if (sheet.getColumnWidth(x) == 0) {
// autosize failed use MIN_WIDTH
sheet.setColumnWidth(x, MIN_WIDTH);
}
I was also running into this issue and this was my solution.
Steps:
- Create workbook
- Create spreadsheet
- Create row
- Create/Set font to "Arial"
- Create/Set style with font
- Create/Set cell with value and style
- autoSizeColumn
- Create File
Code:
// initialize objects
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet spreadsheet = workbook.createSheet(sheetName);
XSSFRow row = spreadsheet.createRow(0);
XSSFCell cell;
// font/style
XSSFFont font = workbook.createFont();
font.setFontName("Arial");
XSSFCellStyle style = workbook.createCellStyle();
style.setFont(font);
// create/set cell & style
cell = row.createCell(0);
cell.setCellValue("New Cell");
cell.setCellStyle(style);
// auto size
spreadsheet.autoSizeColumn(0);
// create file
File aFile = new File("Your Filename");
FileOutputStream out = new FileOutputStream(aFile);
workbook.write(out);
Resources:
http://www.tutorialspoint.com/apache_poi/index.htm
I had a similar issue on Windows 7.
I was using the Calibri font (that is supported in my JVM).
With that font the getBounds().getWidth()
of the java.awt.font.TextLayout
used by the autoSizeColumn()
POI method returns 0.
Changing the font to Calibri-Regular solved the issue in my case.