【问题标题】:Apache POI autoSizeColumn() not working right [duplicate]Apache POI autoSizeColumn()无法正常工作[重复]
【发布时间】:2013-03-22 07:55:18
【问题描述】:

我正在创建一个使用 apache poi 将信息写入 excel 文件的程序。将所有数据输入文件后,我在文件的每一列上调用 autoSizeColumn 方法。但是它将列的大小调整为最后输入的单元格的宽度,有时没有列中的其他单元格那么大。我知道我使用它是正确的,不幸的是我现在没有互联网来发布任何代码,但我会尽可能更新。

好的,我希望我使用的是正确的代码标签,但它是:

public void writeFile() {
    Workbook wb = new HSSFWorkbook();
    Sheet s = wb.createSheet();
    try {

        FileOutputStream out = new FileOutputStream(
                this.getSelectedFile());
        // create a new workbook

        // create a new sheet

        // declare a row object reference
        Row r = null;
        // declare a cell object reference
        Cell c = null;
        // in case of plain ascii
        wb.setSheetName(0, "Street Light Report");
        // create a sheet with 30 rows (0-29)
        // int rownum;
        // short rownum;
        // PrintWriter printOut = new PrintWriter(
        // this.getSelectedFile());
        String[] colName = { "Light Id", "Flagged",
                "Malfunction", "Comments", "Location", "Date" };
        // printOut.println("Light Id,Flagged,Malfunction,Comments,Location,Date");
        Connections.connect();
        String[][] data = Connections.searchForFlagged();
        for (int i = 0; i < data.length; i++) {
            r = s.createRow(i);
        }
        r.setRowNum(0);
        for (int j = 0; j < 6; j++) {
            c = r.createCell(j);
            switch (j) {
            case 0:
                c.setCellValue(colName[j]);
                break;
            case 1:
                c.setCellValue(colName[j]);
                break;
            case 2:
                c.setCellValue(colName[j]);
                break;
            case 3:
                c.setCellValue(colName[j]);
                break;
            case 4:
                c.setCellValue(colName[j]);
                break;
            case 5:
                c.setCellValue(colName[j]);
                break;

            }
        }

        for (int i = 0; i < data.length; i++) {

            r.setRowNum(i + 1);
            for (int j = 0; j < data[i].length; j++) {

                c = r.createCell(j);

                // System.out.println(data[i][j]);

                switch (j) {
                case 0:
                    c.setCellType(Cell.CELL_TYPE_NUMERIC);
                    c.setCellValue(Integer.parseInt(data[i][j]));
                    break;
                case 1:
                    if (data[i][j].equals("true"))
                        c.setCellValue("Yes");
                    else
                        c.setCellValue("No");
                    break;
                case 2:
                    if (data[i][j].equals("I"))
                        c.setCellValue("Intermittent");
                    else
                        c.setCellValue("Not Functional");
                    break;
                case 3:
                    c.setCellValue(data[i][j]);
                    break;
                case 4:
                    c.setCellValue(data[i][j]);
                    break;
                case 5:
                    c.setCellValue(data[i][j]);
                    break;
                }

            }
        }
                                wb.getSheetAt(0).setPrintGridlines(true);
        for (int j = 0; j < 6; j++) {
            s.autoSizeColumn(j);
        }
        wb.write(out);
        out.close();
    } catch (Exception ex) {

    }
};

我会在这里张贴一张图片,但我需要代表。点,我刚从这里开始。

** 请注意,Connections 类是 JDBC 类,因此 java 可以从 mySQL 数据库中提取信息,它返回一个二维字符串数组 **

【问题讨论】:

  • 我们将等待您的代码。
  • 请注意,如果您生成大量报告 s.autoSizeColumn(j); 会降低性能。
  • 查看this question的答案。
  • 这一点需要注意,会显着降低性能!

标签: java apache excel apache-poi


【解决方案1】:

您只需要将呼叫转移到

sheet.autoSizeColumn(columnNumber);

添加数据后代码中的某个点。

这是API的链接

这是唯一的方法。我有同样的问题,我在输入数据之前调用了方法autoSizeColumn()。跳它有帮助

【讨论】:

  • autoSizeColumn() 方法是在我输入所有数据之后,它会自动调整为最后输入的单元格的宽度
  • 试着把它放在你定义的列之后和单元格之前
  • 请原谅我对 POI 的经验不足,但您没有定义列,只定义行和单元格,对吗?
  • @knowbody 我也遇到了autosize的问题,肯定是输入数据后才放的。
  • 面临类似问题,在输入数据后放置。有人找到解决办法了吗?
【解决方案2】:

移动for循环:

for (int j = 0; j < 6; j++) {
                    s.autoSizeColumn(j);
                }

就在您在工作簿中写入并关闭您的对象之前。

wb.write(out);

【讨论】:

  • 好的,我移动了它,但结果还是一样。不知道如何在评论框中发布代码,但我把它贴在上面。
  • 所以没有什么要补充的了??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 2013-04-25
  • 1970-01-01
  • 2016-12-01
  • 2012-11-13
  • 1970-01-01
相关资源
最近更新 更多