2017-02-25 67 views
1

我有數據存儲在ArrayList中,我想將這些數據寫入多張工作表中。 我可以在excel工作簿中寫入數據,但它寫在同一張表中。 截至目前,我能夠通過以下方式來寫入數據,如PIC如下圖所示:如何將數據從arrayList寫入多個excel表格

enter image description here

但我想打破數據分成多個表, 數據應從頭打破我, S.No,Col1 ... Col6,當這些出現時,數據應該寫入新的表格。

我使用這個代碼將數據寫入到Excel

for (int i = 0; i < listOfResults.size(); i++) { 
      row = sheet.createRow(i); 
      for (int j = 0; j < 7; j++) { 
       cell = row.createCell(j); 
       if (j + add < listOfResults.size()) { 
        cell.setCellValue(listOfResults.get(j + add)); 

       } 
      } 

      add += 7; 
     } 

請幫助..

+2

你如何在代碼中創建'sheet'? – user7291698

+3

我懷疑你從互聯網上拿了一些代碼,並試圖使它適應你的需求。最好的做法是仔細檢查這些代碼,瞭解每個調用,並檢查Apache POI文檔中的確切內容以及API提供的其他可能性。這將爲您提供創建滿足您個人需求的程序所需的知識。 – RealSkeptic

+0

@ user7291698: - 我按以下方式創建工作表: 第一次循環之前 工作表= wb.createSheet(「ExpectedResults」); –

回答

1

這不是一個POI問題,而是一個突破邏輯問題。

代碼

for (int i = 0; i < listOfResults.size(); i++) { 
    row = sheet.createRow(i); 
    for (int j = 0; j < 7; j++) { 
     cell = row.createCell(j); 
     if (j + add < listOfResults.size()) { 
      cell.setCellValue(listOfResults.get(j + add)); 
     } 
    } 
    add += 7; 
} 

沒有什麼這裏來檢測標題行,因此沒有創建一個新的工作表。您需要檢測中斷,然後創建一個新工作表,並將每個標題的行索引重置爲零。

修改代碼

int rowIndex = 0; 
int firstCellInRow = 0; 
int cellCount = listOfResults.size(); 
int cellsPerRow = 7; 
int rowCount = cellCount/cellsPerRow; 

for (int i = 0; i < rowCount; i++) { 

    // detect first header cell 
    firstCellInRow = i * cellsPerRow; 
    if (listOfResults.get(firstCellInRow).equals("S.NO")) { 
     // create a new sheet 
     sheet = wb.createSheet(); 
     // reset the row index to 0 
     rowIndex = 0; 
    } 

    // create the row and increment the row index 
    row = sheet.createRow(rowIndex++); 

    // now add the data to the cells 
    for (int j = 0; j < cellsPerRow; j++) { 
     cell = row.createCell(j); 
     if (firstCellInRow + j < listOfResults.size()) { 
      cell.setCellValue(listOfResults.get(firstCellInRow + j)); 
     } 
    } 
} 

的另一個問題是,你是通過主循環太多次運行。你爲每個單元循環一次,但你真的想循環每行一次。這是在第一個循環中將列表長度(單元數)除以7(每行單元數)的原因。

+0

謝謝,這很好, –

0

可以檢查當前元素就像S.NO. 如果是,則必須打開新工作表並繼續書寫。

+0

@ xarines-我已經試過這個,使用這個條件我能夠將數據分成多個工作表,但第一個工作表,但我得到這種類型的輸出: 表1:只有標題, 表2:表1數據加標題2, 表3:表數據加標題3, 這樣我得到的數據 –

+0

@mayankbisht看來你正在創建工作表寫完標題行後... – Betlista

+0

檢查此條件後創建新工作表: 'if(listOfResults.get(j + add).contains(「S。NO 「)) \t \t \t \t \t { \t \t \t \t \t \t片= wb.createSheet(」 片「+ I); \t \t \t \t \t} \t \t \t \t \t cell.setCellValue(listOfResults。 get(j + add));' –