通过Java读取excel文件.xlsx

所以我的excel文件比较小。 它包含8张。 每张纸都有我需要阅读的数据的“logging”。 每张纸也有第一行保留为我跳过的标题; 所以我的数据将从每张表的第二行(第一个索引)开始,到最后一个logging结束。

所以,下面是我的代码迭代通过工作表,并阅读每行,但它无法读取每张表。 而我似乎无法弄清楚为什么。 请看看,任何build议将不胜感激。 谢谢!

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(); 

至less有一个大的逻辑错误。 由于您将所有工作表的数据放在一个数组中,因此此数组的大小必须如下所示:

 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; ... 

使用你的代码,第二张纸上的分配将覆盖第一张纸上的分配,因为j对于每张纸从1开始。