当前位置: 首页 > news >正文

零基础直接上手java跨平台桌面程序,使用javafx(五)TableView显示excel表

       我们在窗口的中间加上TableVie:

      在hello-view.fxml的文本中,要增加一些代码。在TableView定义中加上fx:id="TableView1",这样java代码才方便访问,在java代码中要加上@FXML private TableView TableView1;表示定义TableView1这个变量,它关联的是界面上的fx:id="TableView1"的控件。然后我们在单击事件中完善取数并给控件赋值数据的代码,下面我把这两个文件的代码都共享给大家:

hello-view.fxml:

<?xml version="1.0" encoding="UTF-8"?><?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?><BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="899.0" prefWidth="1199.0" xmlns="http://javafx.com/javafx/11.0.14-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.demo.HelloController"><top><Pane prefHeight="898.0" prefWidth="1198.0" BorderPane.alignment="CENTER"><children><Button layoutX="386.0" layoutY="46.0" mnemonicParsing="false" onMouseClicked="#openclick1" text="打开文件" /><Button layoutX="492.0" layoutY="46.0" mnemonicParsing="false" text="保存文件" /><TableView fx:id="TableView1" layoutX="8.0" layoutY="100.0" prefHeight="794.0" prefWidth="1171.0"><columns><TableColumn prefWidth="75.0" text="C1" /><TableColumn prefWidth="75.0" text="C2" /></columns></TableView></children></Pane></top>
</BorderPane>

HelloController.java:

package com.example.demo;import javafx.application.Platform;
import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Label;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.TextFieldTableCell;
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;import java.util.HashMap;
import java.util.Map;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.TableColumn;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import javafx.beans.property.SimpleStringProperty;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
//
import javafx.application.Application;
import javafx.scene.Scene;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.ArrayList;public class HelloController {@FXMLprivate TableView TableView1;@FXMLprivate Label welcomeText;@FXMLprotected void openclick2(){}@FXMLprotected 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 {// 使用 Apache POI 读取工作簿Workbook workbook = WorkbookFactory.create(selectedFile);Sheet sheet = workbook.getSheetAt(0); // 假设我们只读取第一个工作表TableView1.getColumns().clear(); // 清除原先的列// 如果没有行或列,直接返回if (sheet.getPhysicalNumberOfRows() == 0 || sheet.getRow(0).getPhysicalNumberOfCells() == 0) {return;}// 创建表头for (int i = 0; i < sheet.getRow(0).getLastCellNum(); i++) {String header = sheet.getRow(0).getCell(i).toString();TableColumn<Map<String, Object>, Object> column = new TableColumn<>(header);final int colIndex = i;column.setCellValueFactory(cellData ->new SimpleObjectProperty<>(cellData.getValue().get(header)));// 判断列是否应显示为日期格式column.setCellFactory(col -> new TextFieldTableCell<>(new CustomStringConverter()));TableView1.getColumns().add(column);}// 创建数据行ObservableList<Map<String, Object>> data = FXCollections.observableArrayList();// 获取列标题Row headerRow = sheet.getRow(0);List<String> headers = new ArrayList<>();for (Cell cell : headerRow) {headers.add(cell.toString());}for (int rowIndex = 1; rowIndex <= sheet.getLastRowNum(); rowIndex++) {Row row = sheet.getRow(rowIndex);if (row != null) {Map<String, Object> rowData = new HashMap<>();for (int colIndex = 0; colIndex < headers.size(); colIndex++) {Cell cell = row.getCell(colIndex);if (cell != null) {switch (cell.getCellType()) {case STRING:rowData.put(headers.get(colIndex), cell.getStringCellValue());break;case NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {rowData.put(headers.get(colIndex), cell.getDateCellValue());} else {rowData.put(headers.get(colIndex), cell.getNumericCellValue());}break;case BOOLEAN:rowData.put(headers.get(colIndex), cell.getBooleanCellValue());break;case FORMULA:rowData.put(headers.get(colIndex), cell.getCellFormula());break;case BLANK:rowData.put(headers.get(colIndex), "");break;default:rowData.put(headers.get(colIndex), "不支持的单元格类型");break;}} else {rowData.put(headers.get(colIndex), "");}}data.add(rowData);}}TableView1.setItems(data);workbook.close();} catch (IOException e) {e.printStackTrace();}}}
}

我们运行程序,打开一个电子表格,就能看到电子表中的内容了:样式有点丑,我们以后再调整。

相关文章:

  • MySQL Hints:控制查询优化器的选择
  • python 实现各种数据分析方法
  • 解决用Three.js实现嘴型和语音同步时只能播放部分部位的问题 Three.js同时渲染播放多个组件变形动画的方法
  • MATLAB画图时添加标注显示有效数字的位数,可以编辑此函数
  • 使用Kotlin编写一个Http服务器
  • MEMS:Lecture 19 Wafer bonding package
  • Vue 3 中的状态管理:使用 reactive 函数实现组件间通信和状态管理
  • Flutter 应用加速之本地缓存管理
  • zookeeper、kakfa添加用户加密
  • k8s基础命令集合
  • Wake Lock API:保持设备唤醒的利器
  • Oracle阅读Java帮助文档
  • Pytorch-Padding Layers
  • 【定义通讯数据类型】LCM搭建系统通讯
  • 重温react-01
  • 2017年终总结、随想
  • 2018一半小结一波
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • HTTP中的ETag在移动客户端的应用
  • Java程序员幽默爆笑锦集
  • Median of Two Sorted Arrays
  • python 装饰器(一)
  • Sass 快速入门教程
  • Vue2 SSR 的优化之旅
  • Vue2.x学习三:事件处理生命周期钩子
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 时间复杂度与空间复杂度分析
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 微信小程序填坑清单
  • 一个项目push到多个远程Git仓库
  • 因为阿里,他们成了“杭漂”
  • Android开发者必备:推荐一款助力开发的开源APP
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • #if和#ifdef区别
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (3)选择元素——(17)练习(Exercises)
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (四)linux文件内容查看
  • (转)ABI是什么
  • (转)c++ std::pair 与 std::make
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)linux 命令大全
  • (转)memcache、redis缓存
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net core 控制台应用程序读取配置文件app.config
  • .Net Memory Profiler的使用举例
  • .Net MVC4 上传大文件,并保存表单
  • .net MVC中使用angularJs刷新页面数据列表