Apache POI这个库,可能是JAVA平台最好操作excel文件的库了。怎么才能使用呢?

1、下载Apache POI,本来是个很简单的事情,但是也有坑。这也就是我一直不敢用java的原因之一,这些莫名其妙的坑,总是让人烦躁。我们打开官网,发现他已经不发编译好的包了,发的是源代码。我只是搞个简单的应用,哪有功夫去研究大项目的源代码。

零基础直接上手java跨平台桌面程序,使用javafx(四)用Apache POI读取excel文件。-LMLPHP

亏好我眼尖,在最下方,有5.23的老版,可以用一下。也没多老,还能接受。

零基础直接上手java跨平台桌面程序,使用javafx(四)用Apache POI读取excel文件。-LMLPHP

零基础直接上手java跨平台桌面程序,使用javafx(四)用Apache POI读取excel文件。-LMLPHP

我们下载好,解压到"D:\java\jdk\poi-bin-5.2.3"

打开项目,点文件|项目结构|模块|依赖|1从JAR或目录,选中"D:\java\jdk\poi-bin-5.2.3"包括子目录的全部JAR文件,并且把前面的勾打上,点应用和确定。我是嫌麻烦,把子目录的全拷到上面了,所以显示的是46个文件。这里面有个文件会提示错误,把它排除掉就可以了。

零基础直接上手java跨平台桌面程序,使用javafx(四)用Apache POI读取excel文件。-LMLPHP

零基础直接上手java跨平台桌面程序,使用javafx(四)用Apache POI读取excel文件。-LMLPHP

我们在module-info.java加上

requires org.apache.poi.poi;
requires org.apache.poi.ooxml;

我们修改HelloController.java的代码为:

package com.example.demo;

import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Label;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.poi.ss.usermodel.*;
import java.io.File;
import java.time.Duration;
import java.time.Instant;

public class HelloController {
    @FXML
    private Label welcomeText;

    @FXML
    protected void openclick1()
    {
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("文件打开对话框");
        fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("电子表格", "*.xlsx", "*.xls", "*.ods", "*.txt", "*.csv"));
        // 设置文件选择框的初始目录(可选)
        //fileChooser.setInitialDirectory(new File(System.getProperty("user.home")));
        // 显示文件选择框并获取所选文件
        File selectedFile = fileChooser.showOpenDialog(new Stage());

        if (selectedFile != null)
        {
            String fileName = selectedFile.getName();
            try {
                Instant startTime = Instant.now(); // 记录操作开始时间
                Workbook workbook = WorkbookFactory.create(selectedFile);
                Sheet sheet = workbook.getSheetAt(0); // 假设我们只读取第一个工作表
                int irowcount = 0;
                int iCellcount = 0;
                // 遍历工作表内容并处理数据
                for (Row row : sheet) {
                    for (Cell cell : row) {

                        iCellcount++;
                    }
                    irowcount++;
                }
                Instant endTime = Instant.now(); // 记录操作结束时间
                Duration timeElapsed = Duration.between(startTime, endTime); // 计算耗时
                // 使用提示框显示单元格计数
                final int finalirowcount = irowcount;
                final int finaliCellcount = iCellcount;
                javafx.application.Platform.runLater(() -> {
                    javafx.scene.control.Alert alert = new javafx.scene.control.Alert(javafx.scene.control.Alert.AlertType.INFORMATION);
                    alert.setTitle("单元格计数");
                    alert.setHeaderText(null);
                    alert.setContentText(sheet.getSheetName() + "行总数为:" + finalirowcount + "  单元格总数为:" + finaliCellcount +
                            "\n耗时: " + timeElapsed.toHours() + "小时 " + timeElapsed.toMinutesPart() + "分钟 " +
                            timeElapsed.toSecondsPart() + "秒 " + timeElapsed.toMillisPart() + "毫秒");
                    alert.showAndWait();
                });
                workbook.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

好我们运行程序,选择一下excel文件,系统就读取了它的行数和单元格数量并提示:

零基础直接上手java跨平台桌面程序,使用javafx(四)用Apache POI读取excel文件。-LMLPHP

这里啰嗦一句,这个办法只能处理小型电子表格。如果是超过50MB这种表,得另外处理了。

06-15 12:06