通过 Java 读取 excel 个文件 .xlsx
Reading excel files .xlsx via Java
所以我的 excel 文件相对较小。它包含 8 sheets。每个 sheet 都有 "records" 的数据我需要读取。每个 sheet 还为 headers 保留了第一行,我跳过了;所以我的数据将从每个 sheet 的第二行(第一个索引)开始,到最后一条记录结束。
所以,下面是我的代码,用于遍历 sheet 并读取每一行,但是它无法读取每一行 sheet。而且我似乎无法弄清楚为什么。请看一下,如有任何建议,我们将不胜感激。
谢谢!
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();
至少有一个很大的逻辑错误。由于您将所有 sheet 的数据放在 one 数组中,因此该数组的尺寸必须如下所示:
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;
...
使用您的代码,第二个 sheet 的分配将覆盖第一个 sheet 的分配,因为 j
以每个 sheet 的 1 开头。
所以我的 excel 文件相对较小。它包含 8 sheets。每个 sheet 都有 "records" 的数据我需要读取。每个 sheet 还为 headers 保留了第一行,我跳过了;所以我的数据将从每个 sheet 的第二行(第一个索引)开始,到最后一条记录结束。
所以,下面是我的代码,用于遍历 sheet 并读取每一行,但是它无法读取每一行 sheet。而且我似乎无法弄清楚为什么。请看一下,如有任何建议,我们将不胜感激。 谢谢!
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();
至少有一个很大的逻辑错误。由于您将所有 sheet 的数据放在 one 数组中,因此该数组的尺寸必须如下所示:
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;
...
使用您的代码,第二个 sheet 的分配将覆盖第一个 sheet 的分配,因为 j
以每个 sheet 的 1 开头。