2016-03-19 139 views
0

因此,我的Excel文件的大小相对较小。它包含8张。每张表都有我需要阅读的数据的“记录”。每张表还有第一行保留给我跳过的标题;所以我的数据将从每张纸的第二行开始(第一个索引)并结束于最后一个记录。通过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

至少有一个大的逻辑错误。既然你把所有表的数据一个阵列,该阵列的尺寸必须像:

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从每个shee开始1吨。

+0

我实际上有一种方法来计算我需要的整张床单的总行数。但是,你确实阐明了我是如何使用我的2D阵列的,并且我已经发现了这个问题。正如你对我的第二张纸覆盖我的第一张纸一样。 – RoRO