Apache POI autoSizeColumn调整大小不正确

时间:2013-06-05 15:10:01

标签: java apache excel apache-poi

我在java中使用Apache POI来创建excel文件。我填写数据然后尝试自动调整每列,但是大小总是错误的(我认为一致)。前两行总是(?)完全折叠。当我在excel中自动调整列时,它可以很好地工作。

没有空白单元格写入(我相信),调整大小是最后我做的事情。

以下是相关代码:这是一个没有错误处理的简化版本等。

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

我知道有一些类似的问题,但大多数问题只是填写数据之前的大小调整。少数不是更复杂/没有答案。

编辑:我尝试使用几种不同的字体,但它不起作用。这并不太令人惊讶,因为无论字体是什么,所有列都应该完全折叠或者不应该是。

另外,因为出现了字体问题,我正在Windows 7上运行该程序。

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

8 个答案:

答案 0 :(得分:13)

只是为了回答我的评论。这些行无法正确调整大小,因为Java不知道您尝试使用的字体this link如果要将新字体安装到Java中应该有帮助,这样您就可以使用更高级的东西。它还有Java知道的默认字体列表。

很高兴这有帮助,你解决了问题!

答案 1 :(得分:7)

这可能与this POI Bug有关,Java Bug JDK-8013716: Renderer for Calibri and Cambria Fonts fails since update 45

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

您还可以通过使用以下代码来调整问题并避免列完全崩溃:

    sheet.autoSizeColumn(x);

    if (sheet.getColumnWidth(x) == 0) {
      // autosize failed use MIN_WIDTH
      sheet.setColumnWidth(x, MIN_WIDTH);
    }

答案 2 :(得分:6)

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

步骤:

  1. 创建工作簿
  2. 创建电子表格
  3. 创建行
  4. 创建/设置字体为&#34; Arial&#34;
  5. 使用字体
  6. 创建/设置样式
  7. 使用值和样式创建/设置单元格
  8. autoSizeColumn
  9. 创建文件
  10. 代码:

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

答案 3 :(得分:4)

我在Windows 7上遇到了类似的问题。

我使用的是Calibri字体(我的JVM支持)。 使用该字体时,getBounds().getWidth() POI方法使用的java.awt.font.TextLayout的{​​{1}}将返回0.

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

答案 4 :(得分:2)

这是我的2美分 -

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

Linux并不是那么宽容。在某些地方,自动调整大小是不合适的。经过这个线程和其他我提出了以下解决方案。

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

答案 5 :(得分:1)

我发现当最宽的字符串以空格开头时,自动调整大小并不能使列足够宽,例如。

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

答案 6 :(得分:1)

我使用Helvetica字体试图替换Arial字体(事实上,Helvetica类似于Arial)。

babel-node

答案 7 :(得分:0)

一种黑客方式

我的情况是在自动调整大小后,这些单元格比实际内容的宽度略小。

我所做的只是在调用 autoSizeColumn 方法后添加了额外的 200 个宽度。

sheet.autoSizeColumn(columnIndex);
sheet.setColumnWidth(columnIndex, sheet.getColumnWidth(columnIndex) + 200);

这对我来说很好:)