零基础直接上手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这种表,得另外处理了。

相关推荐
专职12 分钟前
spring boot中实现手动分页
java·spring boot·后端
神探阿航28 分钟前
第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组
java·算法·蓝桥杯
梓沂38 分钟前
idea修改模块名导致程序编译出错
java·ide·intellij-idea
m0_748230441 小时前
创建一个Spring Boot项目
java·spring boot·后端
卿着飞翔1 小时前
Java面试题2025-Mysql
java·spring boot·后端
心之语歌2 小时前
LiteFlow Spring boot使用方式
java·开发语言
计算机-秋大田2 小时前
基于微信小程序的校园失物招领系统设计与实现(LW+源码+讲解)
java·前端·后端·微信小程序·小程序·课程设计
綦枫Maple2 小时前
Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题
java·spring boot·后端
极客先躯2 小时前
高级java每日一道面试题-2025年01月23日-数据库篇-主键与索引有什么区别 ?
java·数据库·java高级·高级面试题·选择合适的主键·谨慎创建索引·定期评估索引的有效性
码至终章2 小时前
kafka常用目录文件解析
java·分布式·后端·kafka·mq