2013-07-10 57 views
4

我一直在寻找一段时间,还没有找到解决方案。Apache POI,自动过滤后调用autosize

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

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

我正在使用Apache POI 3.9。

我要么到它被自动化的地步,但没有考虑到autofilter下拉箭头,否则我会得到一个空指针异常。

我已经尝试过将for循环遍布整个地方,包括将数据写入电子表格的位置以及文件输出流之前,但无济于事。

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

希望有人能帮助我。

感谢

回答

3

按我的理解,你所选择的过滤器下拉菜单的文本,是因为箭头的躲了起来。如果我是对的,为什么不在自动大小后给一些填充!我的意思是第一AUTOSIZE由西:

testSheet.autoSizeColumn(ColIndex); 

然后计算列的宽度和宽度

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

这将权下拉和文本给出了箭头图标足够填充添加一些期望的填充将完全出现。

10

我是那个写了你提到的原始线程的人。最后,我获得了一个解决方案,而不是我一直在寻找的解决方案,但至少它为我工作。我忘了用我找到的解决方案更新我的问题。

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