У меня проблема с моим читателем excel в java. Он не читает пустые или пустые ячейки и не переходит к следующей ячейке, которая имеет значение.Чтение файла Excel в java не читает или не подсчитывает пустую ячейку как нуль
пример ..
header1 | header2 | header3 | header4
row1 | | row3 | row4
row1 | row2 | | row4
| row2 | row3 |
результаты:
header1 | header2 | header3 | header4
row1 | row3 | row4 |
row1 | row2 | row4 |
row2 | row3 | |
ожидается, произойдет:
header1 | header2 | header3 | header4
row1 | null | row3 | row4
row1 | row2 | null | row4
null | row2 | row3 | null
нуль или "" (пустая строка)
Вот мой код:
мой readXLSFile метод:
private boolean readXLSFile(String batchRunNbr, String filename) throws IOException, ParseException {
List sheetData = new ArrayList();
FileInputStream fis = null;
try {
if ((filename.endsWith(".xlsx")) || (filename.endsWith(".XLSX"))) {
log.info("Reading xlsx file...");
fis = new FileInputStream(filename);
} else{
this.errorMessageTxt = this.errorMessageTxt+this.htmlNextLine+
"Unable to process the file. Please save the file to the latest Excel *.xlsm or *.xlsx file.";
return true;
}
XSSFWorkbook workbook = new XSSFWorkbook(fis);
XSSFSheet sheet = workbook.getSheetAt(0);
Iterator<Row> rows = sheet.rowIterator();
int counter = 0;
while (rows.hasNext()) {
counter++;
XSSFRow row = ((XSSFRow) rows.next());
Iterator<Cell> cells = row.cellIterator();
List data = new ArrayList();
while (cells.hasNext()) {
Cell cell = (XSSFCell) cells.next();
data.add(cell);
}
sheetData.add(data);
}
} catch (IOException e) {
e.printStackTrace();
this.errorMessageTxt = this.errorMessageTxt+this.htmlNextLine+
e.getMessage()+this.htmlNextLine+e.getCause();
return true; //There is an error, return true.
} finally {
if (fis != null) {
fis.close();
}
}
processExcelSheet(sheetData, batchRunNbr, filename);
Вот мой processExcelSheeet метод:
private void processExcelSheet(List sheetData, String batchRunNbr, String inputFileName) {
DateFormat formatter;
formatter = new SimpleDateFormat("dd.MM.yyyy");
boolean firstTime = true;
try {
for (int i = 0; i < sheetData.size(); i++) {
List list = (List) sheetData.get(i);
if (firstTime) {
firstTime = false;
} else {
for (int ii = 0; ii < list.size(); ii++) {
XSSFCell cell = (XSSFCell) list.get(ii);
switchCase(formatter, ii, cell);
}
insertToStaging(batchRunNbr, inputFileName);//This method inserts the data to the database based on what it reads above.
}
//log.info("COMPLETED!");
}
} catch (Exception e) {
log.info("loadStagingTable Error:" + e);
//this.errorMessageTxt = this.errorMessageTxt+this.htmlNextLine+
// "Error Loading to KLTL Data Staging. "+e.getMessage()+","+e.getCause();
e.printStackTrace();
}
}
Я подозреваю, что проблема на row.hasNext? Пожалуйста, помогите .. Большое вам спасибо. И если вам нужна дополнительная информация, прокомментируйте это ниже.
Вы проверили 'sheetData'? Исходя из вашего результата, он не должен относиться к 'rows.hasNext' или' cells.hasNext', если он возвращает false, у вас не будет строки 4 в результирующем наборе – Prisoner
Oh .. Я попытался положить на пустые ячейки и он читает соответственно. Но с пустыми или пустыми ячейками он пропускает пустые ячейки. Я действительно не знаю, в чем проблема с моим кодом. Не могу найти никаких решений. –
Итак, вы проверяете 'sheetData' в отладчике? или проверить 'data.size()' before 'sheetData.add (data)' – Prisoner