自动过滤后调用autosize的Apache POI

我一直在寻找一段时间,还没有find解决scheme。

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

我遇到的问题是我有一个电子表格,它是用从数据库中获得的数据创build的,但是有时候单元格内的数据可能会很长,所以想让POI自动化来保存用户不得不这样做,但是因为我在调用autosize之前设置了autofilter,所以没有工作。

我正在使用Apache POI 3.9。

我要么得到它的自动化点,但没有考虑到自动筛选下拉箭头,或者我得到一个空指针exception。

我已经尝试了遍地移动一个for循环,包括在数据写入电子表格的末尾,也在文件输出stream的前面,但是无济于事。

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

希望有人能帮助我。

谢谢

我是那个写你所提到的原始线索的人。 最后,我获得了一个解决scheme,而不是我正在寻找的解决scheme,但至less它为我工作。 我只是忘了用我find的解决scheme更新我的问题。

我创build了一个新的方法,迭代我想要自动调整的工作表的列,并做两件事情。 首先,我自动调整列的宽度,这样我们就可以得到不需要的宽度,因为它没有考虑到箭头的宽度。 然后我手动设置列的宽度,包括箭头的宽度。 我不得不玩一点点find箭头的宽度(这对我来说是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 } } } 

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

 testSheet.autoSizeColumn(ColIndex); 

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

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

这将为右下angular的箭头图标提供足够的填充,文本将完整显示。

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