2016-03-19 7 views
0

私のExcelファイルのサイズは比較的小さいので、それは8シートを含んでいます。各シートには、私が読む必要があるデータの "記録"があります。各シートには、スキップするヘッダー用に予約された最初の行もあります。私のデータは各シートの2行目(1番目のインデックス)から始まり、最後のレコードで終わります。Javaを介してexcelファイル.xlsxを読む

以下は、シートを繰り返して各行を読み取るコードですが、各シートを読み取ることはできません。そして、なぜ私は理解できないようです。見てくださいと任意の提案をいただければ幸いです。 ありがとう!

FileInputStream fis = new FileInputStream(new File(filePath)); 
XSSFWorkbook wb = new XSSFWorkbook(fis); 
DataFormatter formatter = new DataFormatter(); 

//iterate over sheets 
for (int i=0; i<NUM_OF_SHEETS; i++) { 
    sheet = wb.getSheetAt(i); 
    sheetName = sheet.getSheetName(); 

    //iterate over rows 
    for (int j=1; j<=lastRow; j++) { //1st row or 0-index of each sheet is reserved for the headings which i do not need. 
    row = sheet.getRow(j); 
    if (row!=null) { 
     data[j-1][0] = sheetName; //1st column or 0th-index of each record in my 2d array is reserved for the sheet's name. 

     //iterate over cells 
     for (int k=0; k<NUM_OF_COLUMNS; k++) { 
     cell = row.getCell(k, XSSFRow.RETURN_BLANK_AS_NULL); 
     cellValue = formatter.formatCellValue(cell); //convert cell to type String 
     data[j-1][k+1] = cellValue; 
     }//end of cell iteration 
    } 
    }//end of row iteration 
}//end of sheet iteration 
wb.close(); 
fis.close(); 
+1

「ただし、各シートの読み込みに失敗しました」とはどういう意味ですか?エラーが発生しましたか?スタックトレースを提供してください。他の何かがうまくいきませんか?それから何か教えてください。 –

+0

デバッガを使用してコードを歩いてみたり、ロギングを追加して問題のトラブルシューティングを行いましたか? – mfulton26

答えて

2

少なくとも1つの大きな論理エラーがあります。あなたはアレイ内のすべてのシートのデータを入れているので、この配列は次のような寸法にする必要があります。

String[][] data = new String[lastRow*NUM_OF_SHEETS][NUM_OF_COLUMNS+1]; 

そして配分は次のようにする必要があります

... 
     data[(j-1)+(i*lastRow)][0] = sheetName; //1st column or 0th-index of each record in my 2d array is reserved for the sheet's name. 
... 

... 
     data[(j-1)+(i*lastRow)][k+1] = cellValue; 
... 

あなたのコードでは、はすべてのsheeに対して1から始まるので、2番目のシートからの割り当ては最初のシートのものを上書きしますt。

+0

私は実際に必要なシート全体の行の総数を数える方法を持っています。しかし、私は2D配列をどのように使用していたのかを明らかにしました。問題を理解しました。私の第1のシートを覆す第2のシートについてあなたが言ったのはまさにそのことでした。 – RoRO