Apache POI autoSizeColumn不正确resize

我在Java中使用Apache POI创build一个Excel文件。 我填写数据然后尝试自动化每列,但大小总是错误的(我认为一致)。 前两行总是(?)完全折叠。 当我在Excel中自动调整列时,它完美的工作。

没有空白单元格正在写(我相信),resize是我做的最后一件事情。

下面是相关的代码:这是一个没有error handling等的简化版本

public static synchronized String storeResults(ArrayList<String> 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 < resultList.size(); x++) { String[] items = resultList.get(x).split(PRIM_DELIM); Row row = results.createRow(x); for (int i = 0; i < items.length; i++) { row.createCell(i).setCellValue(items[i]); } } //Auto size all the columns for (x = 0; x < results.getRow(0).getPhysicalNumberOfCells(); x++) { results.autoSizeColumn(x); } //Write the book and close the stream book.write(stream); stream.flush(); stream.close(); return file; } 

我知道这里有几个类似的问题,但其中大多数只是填充数据之前的大小的一个例子。 而less数不是更复杂/没有答案。

编辑:我尝试使用几个不同的字体,它没有工作。 这并不令人感到意外,因为不pipe字体是什么字体,都应该完全崩溃或不应该是。

另外,由于字体问题出现,我在Windows 7上运行该程序。

解决:这是一个字体问题。 我发现的唯一字体是Serif。

只是为了回应我的意见。 由于Java并不知道你想要使用这个链接的字体,因此如果你想把新的字体安装到Java中,你可以使用一些更好的东西。 它也有Java知道的默认字体的列表。

很高兴这有助于你解决了你的问题!

这可能与这个与Java Bug JDK-8013716相关的POI Bug相关:Calibri和Cambria字体的渲染器自更新45以来失败 。

在这种情况下,更改字体或使用6u45 / 7u21以上的JRE应该可以解决问题。

你也可以通过使用这样的代码来弥补这个问题,并避免列被完全折叠sheet.autoSizeColumn(x); if (sheet.getColumnWidth(x) == 0) { // autosize failed use MIN_WIDTH sheet.setColumnWidth(x, MIN_WIDTH); } sheet.autoSizeColumn(x); if (sheet.getColumnWidth(x) == 0) { // autosize failed use MIN_WIDTH sheet.setColumnWidth(x, MIN_WIDTH); }

我也遇到这个问题,这是我的解决方案。

脚步:

  1. 创建工作簿
  2. 创建电子表格
  3. 创建行
  4. 创建/设置字体“Arial”
  5. 用字体创建/设置样式
  6. 用值和样式创建/设置单元格
  7. autoSizeColumn
  8. 创建文件

码:

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

资源:

http://www.tutorialspoint.com/apache_poi/index.htm

我在Windows 7上有类似的问题。

我使用Calibri字体(在我的JVM中支持)。 使用该字体时, autoSizeColumn() POI方法使用的java.awt.font.TextLayoutgetBounds().getWidth()将返回0。

更改字体为Calibri-Regular解决了我的情况下的问题。

这是我的2美分 –

我使用默认的字体(在我的情况下宋体)使用它来使某些字段在XLS粗体。 像在Windows中的魅力一样工作,autoSizeColumn()函数。

Linux不是那么宽容。 自动调整大小是不合适的。 通过这个线程和其他我想出了以下解决方案。

我将Arial字体的.tff文件复制到JAVA / jre / lib / fonts目录中,然后重新运行该应用程序。 工作得很好。

我用Helvetica字体尝试替换Arial字体(实际上,Helvetica与Arial类似)。

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

当最宽的字符串以空格开始时,我发现自动调整大小没有使列宽足够,例如

 cell.setCellValue(" New Cell"); 

这可以通过使用缩进来解决,例如

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