6

我一直在寻找一段时间,但还没有找到解决方案。

这个问题之前已经在这里问过,但 OP 没有得到回应,我不想复活一个旧线程,所以决定问一个新问题。OP 线程在这里

我遇到的问题是我有一个电子表格,它是用从数据库中获得的数据创建的,但是有时单元格内的数据可能很长,所以希望 POI 自动调整大小以节省用户必须这样做,但是因为我在调用 autosize 之前设置了 autofilter,所以它不太有效。

我正在使用 Apache POI 3.9。

我要么让它自动调整大小但没有考虑到自动过滤器下拉箭头,要么我得到一个空指针异常。

我尝试在整个地方移动一个 for 循环,包括在数据写入电子表格的末尾,以及文件输出流之前,但无济于事。

我也尝试过使用几种不同的字体,但也没有用。

希望有人可以帮助我。

谢谢

4

3 回答 3

16

我是写你提到的原始线程的人。最后我实现了一个解决方案,不是我正在寻找的解决方案,但至少它对我有用。我只是忘了用我找到的解决方案更新我的问题。

我创建了一个新方法,它遍历我想要自动调整大小的工作表的列并做两件事。首先,我自动调整列的大小,因此我们将拥有我们不想要的宽度,因为它没有考虑箭头的宽度。然后我手动设置列的宽度,包括箭头的宽度。我不得不玩一点才能找到箭头的宽度(对我来说是 1300)。我想这个宽度可以为你工作,但你可以随意设置它。

可以想象,您应该首先获取并自动过滤数据。之后,您调用一种方法来自动调整列的大小,就像我使用的那样:

private static final int WIDTH_ARROW_BUTTON = 1300;

private void autosizeColumnsFromSheet(final Sheet excelSheet, final int fromColumn, final int toColumn) {
        for (int i = fromColumn; i <= toColumn; i++) {
            excelSheet.autoSizeColumn(new Short(String.valueOf(i)));
            try {
                excelSheet.setColumnWidth(i, excelSheet.getColumnWidth(i) + WIDTH_ARROW_BUTTON);
            } catch (final Exception e) {
                // don't do anything - just let autosize handle it
            }
        }
    }
于 2013-07-11T07:45:18.233 回答
4

根据我的理解,您选择的过滤器下拉列表文本由于箭头而被隐藏。如果我是对的,为什么不在自动调整大小后给一些填充!我的意思是首先通过以下方式自动调整 col 大小:

testSheet.autoSizeColumn(ColIndex);

然后计算列宽并在宽度中添加一些所需的填充

testSheet.setColumnWidth(ColIndex ,testSheet.getColumnWidth(ColIndex)+PaddingWidth);

这将为下拉菜单右侧的箭头图标提供足够的填充,并且文本将完全出现。

于 2013-07-10T18:26:19.600 回答
1
            int WIDTH_ARROW_BUTTON = 2 * 255;
        for (int i = 0; i < row.getLastCellNum(); i++) {
            sheet.autoSizeColumn(i);
            // For filter additional arrow width
            sheet.setColumnWidth(i, sheet.getColumnWidth(i) + WIDTH_ARROW_BUTTON);
        }
于 2015-09-29T10:27:53.333 回答