Apache POI,在自动过滤后调用自动调整大小

Chr*_*ris 5 java excel autofilter autosize apache-poi

我一直在寻找,但还没有找到解决方案.

这个问题之前已经被问过,但是OP没有得到回复,我不想复活一个旧线程,因此决定提出一个新问题.OP线程就在这里.

我遇到的问题是我有一个电子表格,它是用从数据库中获取的数据创建的,但是有时候单元格中的数据可能会非常冗长,所以要求POI自动调整以保存用户必须这样做,但是因为我在调用自动​​调整大小之前设置自动过滤器,所以它不太有用.

我正在使用Apache POI 3.9.

我要么让它达到自动调整的程度,但没有考虑自动过滤器下拉箭头,或者我得到一个空指针异常.

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

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

希望有人可以帮助我.

谢谢

Car*_*tor 11

我是那个编写你提到的原始主题的人.最后我找到了一个解决方案,而不是我想要的解决方案,但至少它对我有用.我忘了用我找到的解决方案更新我的问题.

我创建了一个新方法,迭代我要自动调整的工作表的列,并做两件事.首先我自动调整列,这样我们就会得到我们不想要的宽度,因为它没有考虑箭头的宽度.然后我手动设置列的宽度,包括箭头的宽度.我不得不玩一点才能找到箭头的宽度(对我而言是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
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)


San*_*ngh 5

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

testSheet.autoSizeColumn(ColIndex);
Run Code Online (Sandbox Code Playgroud)

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

testSheet.setColumnWidth(ColIndex ,testSheet.getColumnWidth(ColIndex)+PaddingWidth);
Run Code Online (Sandbox Code Playgroud)

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