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的代码为:
- 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这种表,得另外处理了。