2013-07-10 91 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); 
     }