通过POI读取空白xls细胞

时间:2014-12-17 19:30:22

标签: java apache-poi

我试图读取xls文件的空单元格并将它们作为空条目移植到我的对象xls。但我并不认为这些细胞是空白的。有人可以告诉我我做错了吗?

private boolean lerArquivo(String dir) throws IOException {

    HSSFWorkbook wb = null;
    HSSFRow row = null;
    HSSFCell cell = null;
    String path = dir;
    boolean flag = false;

    InputStream inp = new FileInputStream(path);

    wb = new HSSFWorkbook(inp);
    HSSFSheet sheet = wb.getSheetAt(0);

    for (Iterator rit = (Iterator) sheet.rowIterator(); rit.hasNext();) {
        row = (HSSFRow) rit.next();
        for (Iterator cit = (Iterator) row.cellIterator(); cit.hasNext();) {
            cell = (HSSFCell) cit.next();

            switch (cell.getCellType()) {
            case HSSFCell.CELL_TYPE_STRING:
                xls.add(cell.getRichStringCellValue().getString());
                break;
            case HSSFCell.CELL_TYPE_BLANK:
                xls.add(null);
                break;
            case HSSFCell.CELL_TYPE_NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    xls.add(cell.getDateCellValue().toString());
                } else {
                    xls.add(String.valueOf(cell.getNumericCellValue()));

                }
                break;

            default:

            }
        }
    }

编辑01 - 你好Gagravarr,谢谢你的帮助。 我试过你的建议,并阅读文档。 按照我的理解,我改变了我的代码,达到了这个目的: 即使这样,代码也不会读取空白单元格。有什么猜测吗?

for (int rowNum = 0; rowNum < 4; rowNum++) {
        row = sheet.getRow(rowNum);
        for (int celNum = 0; celNum < row.getLastCellNum(); celNum++) {
            cell = row.getCell(celNum, org.apache.poi.ss.usermodel.Row.RETURN_BLANK_AS_NULL);

            switch (cell.getCellType()) {
            case HSSFCell.CELL_TYPE_STRING:
                xls.add(cell.getRichStringCellValue().getString());
                break;
            case HSSFCell.CELL_TYPE_BLANK: {
                xls.add("");
                break;
            }
            case HSSFCell.CELL_TYPE_NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    xls.add(cell.getDateCellValue().toString());
                } else {
                    xls.add(String.valueOf(cell.getNumericCellValue()));
                }
                break;

            default:

            }
        }
    }

1 个答案:

答案 0 :(得分:0)

Apache POI已pretty detailed and explicit documentation on iterating over rows and cells,建议您阅读它!

从那里复制并粘贴示例,您可以看到如何处理/检测缺少的行和单元格以及空白单元格:

// Decide which rows to process
int rowStart = Math.min(15, sheet.getFirstRowNum());
int rowEnd = Math.max(1400, sheet.getLastRowNum());

for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
   Row r = sheet.getRow(rowNum);

   int lastColumn = Math.max(r.getLastCellNum(), MY_MINIMUM_COLUMN_COUNT);

   for (int cn = 0; cn < lastColumn; cn++) {
      Cell c = r.getCell(cn, Row.RETURN_BLANK_AS_NULL);
      if (c == null) {
         // The spreadsheet is empty in this cell
      } else {
         // Do something useful with the cell's contents
      }
   }
}