首页 > 解决方案 > 在 Java 10 中使用 Apache POI 时出错

问题描述

我制作了一个解析器,它使用带有 java 9 的 apache poi 读取 excel 电子表格,当我将它导出到 jar 文件并在我的计算机上运行时,我的程序运行良好。但是,当我尝试使用 java 10 运行程序时,出现一堆错误并且它根本不读取文件。

错误

错误继续

项目结构

我正在运行最新版本的 apache poi,当我在 java 9 中运行应用程序时,我收到警告消息,但程序仍然运行没有任何问题。这些是我用来制作文件并将文件传递给 open 方法的方法。

 @FXML
public void handleFileButtonClick() throws Exception {
    FileChooser fileChooser = new FileChooser();
    fileChooser.setTitle("Please Select a SpreadSheet");
    FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("Excel files (*.xlsx)", "*.xlsx");
    fileChooser.getExtensionFilters().add(extFilter);
    File file = fileChooser.showOpenDialog(mainGridPane.getScene().getWindow());
    if (file != null) {
        open(file);
    } else {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle("File Not Found");
        alert.setContentText("File was not found or cannot be read.");
        alert.showAndWait();
    }

}

  private void open(File file) throws Exception {
    XSSFWorkbook workbook = new XSSFWorkbook(file);
    XSSFSheet spreadSheet = workbook.getSheetAt(0);
    Iterator<Row> rowIterator = spreadSheet.iterator();
    rowIterator.next();
    rowIterator.next();
    rowIterator.next();
    rowIterator.next();
    rowIterator.next();

    while (rowIterator.hasNext()) {
        row = (XSSFRow) rowIterator.next();
        Iterator<Cell> cellIterator = row.cellIterator();
        Job job = new Job();

        while (cellIterator.hasNext()) {
            Cell cell = cellIterator.next();
            DataFormatter dataFormatter = new DataFormatter();
            String cellStringValue = dataFormatter.formatCellValue(cell);
            switch (cell.getColumnIndex()) {
                case 0:
                case 1:
                    break;
                case 2:
                    if (!cellStringValue.equals("")) {
                        String[] date = cellStringValue.split("/");
                        LocalDate newDate = LocalDate.of(2000 + Integer.parseInt(date[2]), Integer.parseInt(date[0]), Integer.parseInt(date[1]));
                        job.setStartDate(newDate);

                    }
                    break;
                case 3:
                    if (!cellStringValue.equals("")) {
                        String[] date2 = cellStringValue.split("/");
                        LocalDate newDate2 = LocalDate.of(2000 + Integer.parseInt(date2[2]), Integer.parseInt(date2[0]), Integer.parseInt(date2[1]));
                        job.setEndDate(newDate2);
                    }
                    break;
                case 4:
                    if (!cellStringValue.equals("")) {
                        job.setTotalDaysPaid(Integer.parseInt(cellStringValue));
                    }
                    break;
                case 5:
                    break;
                case 6:
                    if (!cellStringValue.equals("")) {
                        String[] date3 = cellStringValue.split("/");
                        LocalDate newDate3 = LocalDate.of(2000 + Integer.parseInt(date3[2]), Integer.parseInt(date3[0]), Integer.parseInt(date3[1]));
                        job.setNextYearStart(newDate3);
                    }

                    break;
                case 7:
                    if (!cellStringValue.equals("")) {
                        String[] date4 = cellStringValue.split("/");
                        LocalDate newDate4 = LocalDate.of(2000 + Integer.parseInt(date4[2]), Integer.parseInt(date4[0]), Integer.parseInt(date4[1]));
                        job.setNextYearEnd(newDate4);
                    }
                    break;
                default:
                    break;
            }
        }
        if (job.getStartDate() != null) {
            jobs.add(job);
        }
    }
    workbook.close();
}

标签: javaapache-poi

解决方案


根据:https ://poi.apache.org/faq.html “24. Apache POI 可以与 Java 10 或更高版本一起编译/使用吗?Java 10 或更高版本尚不完全支持 Apache POI。二进制格式(.xls、.doc、.ppt、...)应该大部分都可以工作,但不幸的是,读取新的基于 XML 的格式(.xlsx、.docx、pptx、...)会因更改Java 10 中的 ZIP 文件处理,有关详细信息和最新状态,请参阅错误 62187。”


推荐阅读