Я сталкиваюсь с проблемой в итераторах ячеек и пустых ячейках в листе Excelкак динамически обрабатывать пустые ячейки и пустые столбцы - PullRequest
0 голосов
/ 25 октября 2019

В Java, как мне динамически обрабатывать пустые ячейки в листе Excel и пустые столбцы.

У меня проблема с итератором и типом пустой ячейки.

Когда я создаю динамические запросы для postgresql db, при запросе вставки я получаю исключения из-за пустого регистра в Excel. Я пытаюсь работать с poi, получая исключение при пустом регистре.

Изображение Excel

try {
  DataFormatter dataFormatter = new DataFormatter();
  Workbook workbook = WorkbookFactory.create(excelFile);
  Iterator<Sheet> sheetIterator = workbook.sheetIterator();
  List<List<List<Object>>> sheets = new ArrayList<>();

  while (sheetIterator.hasNext()) {
    List<List<Object>> sheetList = new ArrayList<>();
    Sheet sheet = sheetIterator.next();
    logger.info(" ---sheet name ---" + sheet.getSheetName());
    if (sheetNames != null) {
      for (String sheetName : sheetNames) {
        if (sheet.getSheetName().equals(sheetName)) {
          Iterator<Row> rowIterator = sheet.rowIterator();
            while (rowIterator.hasNext()) {
              Row row = rowIterator.next();
              List<Object> rows = new ArrayList<>();

              // Now let's iterate over the columns of the current row
              Iterator<Cell> cellIterator = row.cellIterator();
              while (cellIterator.hasNext()) {
                Cell cell = cellIterator.next();
                CellType type = cell.getCellType();
                if (type == CellType.BLANK) {
                  Integer intsample = 0;
                  cell.setCellValue(intsample);

                  // rows.add(dataFormatter.formatCellValue(cell));
                  rows.add(cell);   
                }
                else if (type == CellType.STRING) {
                  rows.add(cell.getRichStringCellValue().toString());
                } else if (type == CellType.NUMERIC) {
                  if (HSSFDateUtil.isCellDateFormatted(cell)) {
                    rows.add(cell.getDateCellValue());
                  } else if (dataFormatter.formatCellValue(cell).contains(".")) {
                    try {
                      rows.add(Double.parseDouble(dataFormatter.formatCellValue(cell)));
                    } catch (Exception e) {
                        rows.add(cell.getRichStringCellValue().toString());
                    }
                  } else {
                    try {
                      rows.add(Long.parseLong(dataFormatter.formatCellValue(cell)));
                    } catch (Exception e) {
                      rows.add(dataFormatter.formatCellValue(cell));
                    }
                  }
                } else if (type == CellType.BOOLEAN) {
                  rows.add(cell.getBooleanCellValue());
                } else {
                  rows.add(dataFormatter.formatCellValue(cell));
                }
              }
              sheetList.add(rows);
            }
            sheets.add(sheetList);
          }
        }
      }
    }
    workbook.close();

    return sheets;
  } catch (Exception e) {
    e.printStackTrace();
}

Ответы [ 2 ]

0 голосов
/ 25 октября 2019
    I am trying like with out using celliterator,rowiterator,sheetiterator.but again skipping cell is happen ...
    here is my code 
  try {
            DataFormatter dataFormatter = new DataFormatter();
            Workbook workbook = WorkbookFactory.create(file);
            List<List<List<Object>>> sheets = new ArrayList<List<List<Object>>>();

            for (int sh = 0; sh < workbook.getNumberOfSheets(); sh++) {

                Sheet sheet = workbook.getSheetAt(sh);
                List<List<Object>> sheetList = new ArrayList<List<Object>>();

                for (int i = 0; i < sheet.getLastRowNum(); i++) {
                    Row row = sheet.getRow(i);

                    List<Object> rows = new ArrayList<Object>();

                    for (int j = 0; j < row.getLastCellNum(); j++) {

                        Cell cell = row.getCell(j);

                        CellType type = cell.getCellType();
                        // System.out.println(type+ " -----type -------");

                        if (type == CellType.STRING) {
                            rows.add(cell.getRichStringCellValue().toString());

                        } else if (type == CellType.NUMERIC) {

                            if (HSSFDateUtil.isCellDateFormatted(cell)) {
                                rows.add(cell.getDateCellValue());
                            } else if (dataFormatter.formatCellValue(cell).contains(".")) {
                                try {
                                    rows.add(Double.parseDouble(dataFormatter.formatCellValue(cell)));
                                } catch (Exception e) {
                                    rows.add(cell.getRichStringCellValue().toString());
                                }
                            } else {
                                try {
                                    rows.add(Long.parseLong(dataFormatter.formatCellValue(cell)));
                                } catch (Exception e) {
                                    rows.add(dataFormatter.formatCellValue(cell));
                                }
                            }

                        } else if (type == CellType.BOOLEAN) {
                            rows.add(cell.getBooleanCellValue());
                        } else if (type == CellType.BLANK) {

                             cell.setCellValue("NA");
                            //System.out.println(cell);
                                //Cell cell = row.getCell(i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                            Integer intsample = 0;
                            //cell.setCellValue(intsample);
                            // rows.add(dataFormatter.formatCellValue(cell));
                            rows.add(cell);

                        } else {
                            rows.add(dataFormatter.formatCellValue(cell));

                        }

                    }

                    sheetList.add(rows);
                    System.out.println(rows);
                }

                sheets.add(sheetList);
                // System.out.println(sheets+"\n");
            }

            workbook.close();

            return sheets;
        } catch (Exception e) {
            e.printStackTrace();
        }
0 голосов
/ 25 октября 2019

CellIterator пропускает пустые ячейки при повторении ячеек в строке. Вы можете обойти эту проблему, используя цикл for вместо итератора:

Row row = rowIterator.next();
...
int lastCellIndex = 8; // (9-1 cells)
for (int i=0; i<lastCellIndex; i++) {
    Cell cell = row.getCell(cn, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
    ...
}

Количество ячеек в вашем примере равно 9, что делает lastCellIndex 8. Если число ячеек в строке будет менятьсяиспользуйте row.getLastCellNum(); в верхней строке заголовка, чтобы получить длину.

Более подробную информацию о getCell() можно найти в документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...