2013-04-01 111 views
5

我正在創建一個使用apache poi將信息寫入excel文件的程序。將所有數據輸入到文件後,我在文件的每一列上調用autoSizeColumn方法。但是它將列的大小調整爲最後一個輸入的單元格的寬度,有時不像列中的其他單元格那麼大。我知道我正確地使用它,不幸的是我現在沒有互聯網來發布任何代碼,但我會盡可能地更新。Apache POI autoSizeColumn()不能正常工作

好,我希望我使用的代碼標籤正確的,但在這裏它是:

public void writeFile() { 
    Workbook wb = new HSSFWorkbook(); 
    Sheet s = wb.createSheet(); 
    try { 

     FileOutputStream out = new FileOutputStream(
       this.getSelectedFile()); 
     // create a new workbook 

     // create a new sheet 

     // declare a row object reference 
     Row r = null; 
     // declare a cell object reference 
     Cell c = null; 
     // in case of plain ascii 
     wb.setSheetName(0, "Street Light Report"); 
     // create a sheet with 30 rows (0-29) 
     // int rownum; 
     // short rownum; 
     // PrintWriter printOut = new PrintWriter(
     // this.getSelectedFile()); 
     String[] colName = { "Light Id", "Flagged", 
       "Malfunction", "Comments", "Location", "Date" }; 
     // printOut.println("Light Id,Flagged,Malfunction,Comments,Location,Date"); 
     Connections.connect(); 
     String[][] data = Connections.searchForFlagged(); 
     for (int i = 0; i < data.length; i++) { 
      r = s.createRow(i); 
     } 
     r.setRowNum(0); 
     for (int j = 0; j < 6; j++) { 
      c = r.createCell(j); 
      switch (j) { 
      case 0: 
       c.setCellValue(colName[j]); 
       break; 
      case 1: 
       c.setCellValue(colName[j]); 
       break; 
      case 2: 
       c.setCellValue(colName[j]); 
       break; 
      case 3: 
       c.setCellValue(colName[j]); 
       break; 
      case 4: 
       c.setCellValue(colName[j]); 
       break; 
      case 5: 
       c.setCellValue(colName[j]); 
       break; 

      } 
     } 

     for (int i = 0; i < data.length; i++) { 

      r.setRowNum(i + 1); 
      for (int j = 0; j < data[i].length; j++) { 

       c = r.createCell(j); 

       // System.out.println(data[i][j]); 

       switch (j) { 
       case 0: 
        c.setCellType(Cell.CELL_TYPE_NUMERIC); 
        c.setCellValue(Integer.parseInt(data[i][j])); 
        break; 
       case 1: 
        if (data[i][j].equals("true")) 
         c.setCellValue("Yes"); 
        else 
         c.setCellValue("No"); 
        break; 
       case 2: 
        if (data[i][j].equals("I")) 
         c.setCellValue("Intermittent"); 
        else 
         c.setCellValue("Not Functional"); 
        break; 
       case 3: 
        c.setCellValue(data[i][j]); 
        break; 
       case 4: 
        c.setCellValue(data[i][j]); 
        break; 
       case 5: 
        c.setCellValue(data[i][j]); 
        break; 
       } 

      } 
     } 
           wb.getSheetAt(0).setPrintGridlines(true); 
     for (int j = 0; j < 6; j++) { 
      s.autoSizeColumn(j); 
     } 
     wb.write(out); 
     out.close(); 
    } catch (Exception ex) { 

    } 
}; 

我將在這裏發佈的圖像,但我需要代表。點,我剛從這裏開始。

**注意連接類是JDBC類,以便Java可以從個MySQL數據庫返回的字符串的二維數組**

+1

我們將等待您的代碼。 – javadev

+0

確定代碼已上傳 –

+0

請參閱[此問題]的答案(http://stackoverflow.com/questions/16943493/apache-poi-autosizecolumn-resizes-incorrectly)。 – scaevity

回答

8

您只需將呼叫轉移到

提取信息
sheet.autoSizeColumn(columnNumber); 

在數據添加完成後在代碼中的某一點。

這裏是到API

這是做到這一點的唯一途徑的鏈接。我有同樣的問題,我在輸入數據之前調用方法autoSizeColumn()。滾開,幫助

+0

autoSizeSize()方法是在我輸入所有數據後運行,它只是自動調整到最後一個單元格的寬度 –

+0

嘗試將它放在u定義的列之後並在單元格之前 – knowbody

+0

請原諒我對POI的體驗,但你沒有定義僅列表的行和單元格的權利? –

1

移動的for循環:

for (int j = 0; j < 6; j++) { 
        s.autoSizeColumn(j); 
       } 

您在工作簿中編寫並關閉了對象之前是公正。

wb.write(out); 
+0

好吧我移動它,但仍然是相同的結果..不知道如何在評論框中發佈代碼,但生病發布頂部。 –

+0

所以沒有進一步補充? –

3

請注意,如果您正在生成巨大的報告s.autoSizeColumn(j);會減慢性能。

+1

這是重要的注意事項,顯着降低性能! – NinaNa