当前位置: 首页 > 知识库问答 >
问题:

Apache poi在读取excel文件时的奇怪行为

刘瑞
2023-03-14

我已经成功地使用Apache POI库读取了excel文件。但是,我从它那里得到了一个奇怪的行为,我不知道为什么它会发生。

如果我创建一个新的excel文件,并对所需数据进行如下调整:

设置在电子邮件列第一个的空单元格根本不被读取(忽略)。

[Hari Krishna, 445444, 986544544]

[Hari Krishna, 445444, 986544544, ]

下面是我用来阅读excel文件的完整代码

 public static List importExcelFile(String filePath, String fileName) {
    DataFormatter formatter = new DataFormatter(Locale.UK);
    // stores data from excel file
    List excelDataList = new ArrayList();
    try {
      // Import file from source destination
      FileInputStream file = new FileInputStream(new File(filePath.concat(File.separator.concat(fileName))));

      // Get the workbook instance for XLS file
      XSSFWorkbook workbook = new XSSFWorkbook(file);
      // workbook.setMissingCellPolicy(Row.RETURN_BLANK_AS_NULL);
      // Get first sheet from the workbook
      XSSFSheet sheet = workbook.getSheetAt(0);
      // Iterate through each rows from first sheet
      Iterator<Row> rowIterator = sheet.iterator();
      // Skip first row, since it is header row
      rowIterator.next();
      while (rowIterator.hasNext()) {
        Row row = rowIterator.next();
        int nextCell = 1;
        int currentCell = 0;
        // add data of each row
        ArrayList rowList = new ArrayList();
        // For each row, iterate through each columns
        Iterator<Cell> cellIterator = row.cellIterator();
        while (cellIterator.hasNext()) {
          Cell cell = cellIterator.next();
          currentCell = cell.getColumnIndex();
          if (currentCell >= nextCell) {
            int diffInCellCount = currentCell - nextCell;
            for (int nullLoop = 0; nullLoop <= diffInCellCount; nullLoop++) {
              rowList.add(" ");
              nextCell++;
            }
          }
          switch (cell.getCellType()) {
            case Cell.CELL_TYPE_BOOLEAN:
              rowList.add(cell.getBooleanCellValue());
              break;
            case Cell.CELL_TYPE_NUMERIC:
              if (DateUtil.isCellDateFormatted(cell)) {
                String date = formatter.formatCellValue(cell);
                rowList.add(date);
              } else {
                rowList.add(cell.getNumericCellValue());
              }
              break;
            case Cell.CELL_TYPE_STRING:
              rowList.add(cell.getStringCellValue());
              break;
            case Cell.CELL_TYPE_BLANK:
              rowList.add(" ");
              break;
            case Cell.CELL_TYPE_ERROR:
              rowList.add(" ");
              break;
            default:
              break;
          }
          nextCell++;
        }
        excelDataList.add(rowList);
      }
      file.close();
    } catch (FileNotFoundException e) {
      System.out.println(e.toString());
      return null;
    } catch (IOException e) {
      e.printStackTrace();
      return null;
    }
    return excelDataList;

  }

共有1个答案

养学
2023-03-14

原因是当您设置单元格的字体大小时,Excel需要一种方法来知道单元格有不同的字体(通常是CellStyle)。当您从默认值更改字体大小时,Excel将创建一个空白单元格,并将其设置为单元格样式字体大小为10。因为CellStyle单元格的属性,Excel需要一个单元格,以便存储CellStyle

当您使用迭代器 读取单元格时,它将只返回那些存在的单元格。在更改字体大小之前,“hari krishna”的“email”单元格并不存在。在你的字体大小改变后,现在“电子邮件”单元格“hari krishna”是存在的,即使它是空白的。

如果想要空值,即使字体大小没有改变,也不能使用迭代器,因为它不会返回单元格--它不存在。您可以使用create_null_as_blankmissingcellpolicyrow对象使用标准的for循环。

如果要跳过空白值,无论字体大小是否有变化,都应该跳过类型为cell_type_blank的单元格。从switch语句中删除该大小写。

 类似资料:
  • 我创建了此代码以使用Apache POI读取excel文件的内容。我使用eclipse作为编辑器,但当我运行代码时,我的粗体行出现问题。有什么问题?excel的内容如下:

  • 我正在写一个程序,它需要从excel文件中读取和写入数据,而不考虑格式(xls或xlsx)。 我知道ApachePOI,但它似乎有不同的类来处理xls文件(HSSF)和xlsx(XSSF)文件。 任何人都知道我将如何实现我在这里的目标。(也欢迎使用POI以外的API的想法)。

  • 嗨,我想在第一行搜索一个字符串,如果找到了,我想移动那一列。

  • 问题内容: 请考虑以下示例Java类(下面的pom.xml): 我写一个FileOutputStream,然后尝试删除该文件, 而不先关闭Stream 。这是我最初的问题,当然是错误的,但它导致了一些奇怪的发现。 在Windows 7上运行主方法时,它将产生以下输出: 为什么第一次调用Files.delete()不会引发异常? 为什么以下对Files.exist()的调用返回false? 为什么无

  • 问题内容: 我正在尝试编写一个节点应用程序,该应用程序读取一组文件,将它们拆分为几行,然后将这些行放入数组中。很简单 除了我正在使用的某些SQL文件外,它还可以处理许多文件。由于某些原因,当我拆分行时,似乎会得到某种unicode输出。该应用程序看起来像这样: 输入文件如下所示: 输出看起来像这样: 如您所见,文件开头有某种无法识别的字符。读入数据并直接输出后,除此字符外看起来还不错。但是,如果我

  • 我正在尝试编写一个节点应用程序,该应用程序读取一组文件,将它们拆分为行,然后将这些行放入数组中。非常简单。它适用于相当多的文件,除了我正在处理的一些SQL文件。出于某种原因,当我拆分行时,我似乎得到了某种unicode输出。该应用程序看起来像这样: 输入文件如下所示: 输出如下所示: 正如您所看到的,在文件的开头有一些无法识别的字符。读入数据后直接输出,除了这个字符看起来还行。然而,如果我试图把它