30

我在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。

4

10 回答 10

14

只是为了回答我的评论。行无法正确调整大小,因为 Java 不知道您尝试使用的字体如果您想将新字体安装到 Java 中,那么此链接应该会有所帮助,这样您就可以使用更高级的字体。它还包含 Java 知道的默认字体列表。

很高兴这对您有所帮助,您的问题得到了解决!

于 2013-06-14T14:52:57.170 回答
7

这可能与此 POI 错误有关,该错误与Java Bug JDK-8013716: Renderer for Calibri and Cambria Fonts failed since update 45 有关

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

您还可以通过使用如下代码来解决问题并避免列完全折叠:

    sheet.autoSizeColumn(x);

    if (sheet.getColumnWidth(x) == 0) {
      // autosize failed use MIN_WIDTH
      sheet.setColumnWidth(x, MIN_WIDTH);
    }
于 2014-09-14T19:40:33.777 回答
6

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

脚步:

  1. 创建工作簿
  2. 创建电子表格
  3. 创建行
  4. 创建/设置字体为“Arial”
  5. 使用字体创建/设置样式
  6. 创建/设置具有值和样式的单元格
  7. 自动大小列
  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

于 2016-02-16T15:36:03.097 回答
4

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

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

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

于 2013-06-18T21:34:59.440 回答
2

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

XSSFFont font = wb.createFont();
font.setFontName("Helvetica");
于 2016-06-10T19:17:02.723 回答
2

这是我的 2 美分 -

我使用默认字体(在我的例子中是 Arial)使用它来使 xls 中的某些字段变为粗体。在 Windows 中与 autoSizeColumn() 函数一起工作就像一个魅力。

Linux 没有那么宽容。自动调整大小在某些地方不合适。在经历了这个线程和其他之后,我想出了以下解决方案。

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

于 2016-01-20T10:21:43.850 回答
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);
于 2016-04-02T13:32:27.023 回答
0

一种骇人听闻的方式

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

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

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

这对我来说很好:)

于 2021-07-27T08:36:00.183 回答
0

如果用户遇到的问题是他们有一张包含单元格和合并单元格的工作表,Gagravarr 在这篇文章中的回答真的帮助了我:

https://stackoverflow.com/a/31425163/9407809

在此处发布以供将来寻找此内容的用户使用。

于 2022-02-18T21:34:19.250 回答
0

以下对我有用。

输入所有数据后,我设置字体并使用 autoSizeColumn() 。

    public static XSSFWorkbook createExcel(List<ChannelVodFileInfoList> resList) {
    XSSFWorkbook hwb = new XSSFWorkbook();
    String[] title = { "1", "2", "3", "4"};

    XSSFSheet sheet = hwb.createSheet("dataStats");

    XSSFRow firstrow = sheet.createRow(0);
    for (int i = 0; i < title.length; i++) {
        XSSFCell xh = firstrow.createCell(i);
        xh.setCellValue(title[i]);
    }

    if (resList == null || resList.size() == 0) {
        return hwb;
    }

    for (int i = 0; i < resList.size(); i++) {
        ChannelVodFileInfoList doTemp = resList.get(i);
        XSSFRow row = sheet.createRow(i + 1);
        for (int j = 0; j < title.length; j++) {
            XSSFCell cell = row.createCell(j);
            Font font111 = hwb.createFont();
            font111.setBoldweight(Font.BOLDWEIGHT_NORMAL); 
            XSSFCellStyle cellStyle111 = hwb.createCellStyle();
            cellStyle111.setFont(font111);
            cell.setCellStyle(cellStyle111);

            if (j == 0) { 
                cell.setCellValue(dateStr);
            } else if (j == 1) {  
                cell.setCellValue(doTemp.getChannelName()); 
            }else if (j == 2) {  
                cell.setCellValue(doTemp.getBitrate()); 
            }else if (j == 3) {  
                cell.setCellValue(doTemp.getWh()); 
            }
         }

        for (int j = 0; j < title.length; j++) {
           sheet.autoSizeColumn(j);
        }

    return hwb;
}
于 2018-05-10T06:08:57.173 回答