Apache POI autoSizeColumn Resizes Incorrectly

匿名 (未验证) 提交于 2019-12-03 02:33:02

问题:

I'm using Apache POI in java to create an excel file. I fill in the data then try to autosize each column, however the sizes are always wrong (and I think consistent). The first two rows are always(?) completely collapsed. When I autosize the columns in excel, it works perfectly.

No blank cells are being written (I believe) and the resizing is the last thing I do.

Here's the relevant code: This is a boiled down version without error handling, etc.

public static synchronized String storeResults(ArrayList resultList, String file) {     if (resultList == null || resultList.size() == 0) {         return file;     }     FileOutputStream stream = new FileOutputStream(file);      //Create workbook and result sheet     XSSFWorkbook book = new XSSFWorkbook();     Sheet results = book.createSheet("Results");      //Write results to workbook     for (int x = 0; x 

I know there are a few questions out there similar, but most of them are simply a case of sizing before filling in the data. And the few that aren't are more complicated/unanswered.

EDIT: I tried using a couple different fonts and it didn't work. Which isn't too surprising, as no matter what the font either all the columns should be completely collapsed or none should be.

Also, because the font issue came up, I'm running the program on Windows 7.

SOLVED: It was a font issue. The only font that I found that worked was Serif.

回答1:

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!



回答2:

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); }



回答3:

I was also running into this issue and this was my solution.

Steps:

  1. Create workbook
  2. Create spreadsheet
  3. Create row
  4. Create/Set font to "Arial"
  5. Create/Set style with font
  6. Create/Set cell with value and style
  7. autoSizeColumn
  8. 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



回答4:

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.



回答5:

Here are my 2 cents -

I was using the default font (Arial in my case) using it to make certain fields bold in the xls. Worked like a charm in Windows along with autoSizeColumn() function.

Linux wasn't that forgiving. The auto-sizing was improper at places. After going through this thread and other I came up with the following solution.

I copied the Arial font's .tff files into the JAVA/jre/lib/fonts directory and re-ran the application. Worked just fine.



回答6:

I've used Helvetica font trying to replace Arial font (in fact, Helvetica is similar to Arial).

XSSFFont font = wb.createFont(); font.setFontName("Helvetica"); 


回答7:

I found that auto-sizing didn't make the column wide enough when the widest string began with spaces, e.g.

cell.setCellValue("   New Cell"); 

This can be fixed by using indentations instead, e.g.

// font/style XSSFFont font = workbook.createFont(); font.setFontName("Arial"); XSSFCellStyle style = workbook.createCellStyle(); style.setFont(font); style.setIndention((short)2);  // create/set cell & style cell = row.createCell(0); cell.setCellValue("New Cell"); cell.setCellStyle(style);  // auto size spreadsheet.autoSizeColumn(0); 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!