Apache POI,在自动筛选后调用autosize

9

我已经搜索了一段时间,但仍然找不到解决方案。

这个问题之前在这里问过,但是没有得到回复。我不想让旧的帖子再次浮现,所以决定提出一个新问题。原始帖子在这里

我的问题是,我有一个电子表格,其中包含从数据库获取的数据,但是有时单元格内的数据可能非常长,因此希望POI自动调整大小以避免用户自行调整大小。但是,因为我设置了自动筛选器,然后才调用自动调整大小,所以它并不完全起作用。

我使用的是Apache POI 3.9。

我要么将其自适应大小但未考虑自动筛选器下拉箭头,要么就会出现空指针异常。

我尝试将for循环移动到许多位置,包括在数据写入电子表格的结尾处,以及仅在文件输出流之前,但都无济于事。

我还尝试使用了几种不同的字体,但也没有奏效。

希望有人能帮助我。谢谢。

3个回答

20

我是您提到的原始帖子的作者。最后,我找到了一个解决方案,虽然不是我想要的那个,但至少对我有用。我只是忘记更新我的问题,告诉大家我找到的解决方案。

我创建了一个新方法,遍历我想要自动调整大小的工作表的列,并执行两个操作。首先,我自动调整列宽,以便我们有了不想要的宽度,因为它没有考虑箭头的宽度。然后,我手动设置列的宽度,包括箭头的宽度。我不得不尝试一下才找到箭头的宽度(对我来说是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(i);
            try {
                excelSheet.setColumnWidth(i, excelSheet.getColumnWidth(i) + WIDTH_ARROW_BUTTON);
            } catch (final Exception e) {
                // don't do anything - just let autosize handle it
            }
        }
    }

1
我认为你可以将这一行代码 excelSheet.autoSizeColumn(new Short(String.valueOf(i))); 改成 excelSheet.autoSizeColumn(i);,这样更易于阅读 :) - Joseph Budin
1
感谢@JosephBudin,我完全同意你的观点!这篇文章已经发布很久了,我不知道为什么当时使用Short而不是直接使用int。 - Carlos Pastor

5
根据我的理解,您所选的筛选下拉框中的文本由于箭头而隐藏。如果我是对的,为什么不在自动调整大小后再添加一些填充!我的意思是首先按以下方式自动调整列的大小:
testSheet.autoSizeColumn(ColIndex);

然后计算列宽并在宽度中添加所需的填充。
testSheet.setColumnWidth(ColIndex ,testSheet.getColumnWidth(ColIndex)+PaddingWidth);

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接