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

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

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

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

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

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

我们在module-info.java加上

复制代码
requires org.apache.poi.poi;
requires org.apache.poi.ooxml;

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

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文件,系统就读取了它的行数和单元格数量并提示:

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

相关推荐
LuckyLay11 分钟前
Spring学习笔记_27——@EnableLoadTimeWeaving
java·spring boot·spring
向阳121824 分钟前
Dubbo负载均衡
java·运维·负载均衡·dubbo
Gu Gu Study34 分钟前
【用Java学习数据结构系列】泛型上界与通配符上界
java·开发语言
WaaTong1 小时前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
m0_743048441 小时前
初识Java EE和Spring Boot
java·java-ee
AskHarries1 小时前
Java字节码增强库ByteBuddy
java·后端
小灰灰__1 小时前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea
夜雨翦春韭1 小时前
Java中的动态代理
java·开发语言·aop·动态代理
程序媛小果2 小时前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot
追风林2 小时前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac