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这种表,得另外处理了。