零基础直接上手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 {
    @FXML
    private TableView TableView1;
    @FXML
    private Label welcomeText;
    @FXML
    protected void openclick2()
    {



    }

    @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 {
                // 使用 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();
            }
        }
    }
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/700992.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JDBC开发之四大核心API:DriverManager Connection Statement ResultSet

DriverManager 方法都是静态的 注册驱动 在Mysql5之后我们就不用注册驱动了 在jar包里已经写好了 读取文件 第二个方法 如果连接的是主机mysql并且端口是默认的3306 则可以简化书写 代码书写 import java.sql.Connection; import java.sql.DriverManager; import java.sql.S…

应急管理大泽动力6寸柴油水泵的使用方法

6寸柴油水泵的使用方法可以按照以下步骤进行&#xff0c;以确保操作的安全&#xff1a; 一、准备阶段 检查设备&#xff1a;确保6寸柴油水泵及其配件完好无损&#xff0c;特别是检查水泵的密封性能&#xff0c;确保无泄漏。 准备油料&#xff1a;根据参考文章1&#xff0c;为…

解决cmd命令出现乱码问题

方法1&#xff1a;修改CMD或PS显示编码(临时且不一定生效) CMD的默认编码为gdk&#xff08;简体中文&#xff09;&#xff0c;需修改为utf-8&#xff08;万国码&#xff09; 在命令行窗口输入 CHCP 65001窗口关闭后又会恢复成默认的gdk编码形式 方法2&#xff1a;更改系统设…

注意力机制篇 | YOLOv8改进之在C2f模块引入SpatialGroupEnhance注意力模块

前言:Hello大家好,我是小哥谈。这篇文章介绍了一种轻量级的神经网络模块SGE,它可以调整卷积神经网络中每个子特征的重要性,从而提高图像识别任务的性能。SGE通过生成注意力因子来调整每个子特征的强度,有效抑制噪声。与流行的CNN主干网络集成时,SGE可以显著提高图像识别性…

ConstraintLayout遇到的坑

背景 为了降低app的卡顿率&#xff0c;项目做了一次优化&#xff0c;将首页的的滑动控件viewPager改成了viewPager2&#xff0c;前者是一次性加载所有的布局文件&#xff0c;后者只会加载目标页面的布局文件&#xff0c;减少了计算和绘制的时间。在开发完后&#xff0c;发现了…

Vue 路由传递参数 query、params

1、to的对象写法,绑定参数 <template> 2 <ul> 3 <li v-for"m in messlist" :key"m.id"> 4 <router-link :to"{ //使用params时&#xff0c;这个路径必须用name及别名......name: xiangqing, path: /bbb/message/deta…

【GreenHills】解决GHS对于“//”注释符号进行报错的问题

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决GHS对于使用“//”进行注释内容进行报错的问题 2、 问题场景 在代码中经常使用“//”进行内容注释。但是&#xff0c;在GHS中发现所有的注释信息都被显示了报错。报错信息如下图2-1。 图2-1 3、软硬件环境 1&a…

关于LayUI弹出层请求一次其他网页后无法再次点击按钮问题

问题描述 使用layer弹出层去请求另一个页面&#xff0c;关闭弹窗后本页面按钮无法点击也不报错,如下面弹窗代码 layer.open({type: 1,area: [500px, 400px],title: 编辑信息,shade: 0.6,shadeClose: true,maxmin: false,anim: 0,success: function (layero, index) {$.ajax({u…

【网络编程开发】7.TCP可靠传输的原理

7.TCP可靠传输的原理 TCP实现可靠传输的原理主要基于序列号和确认应答、超时重传、滑动窗口、连接管理机制以及拥塞控制等多重机制。 TCP&#xff08;Transmission Control Protocol&#xff09;&#xff0c;即传输控制协议&#xff0c;是网络通信中的一种重要协议&#xff0…

守护云端数据安全—安当透明加密TDE解决方案

国家安全部官微6月5日消息&#xff0c;云存储是一种新兴网络存储技术。近年来&#xff0c;随着网络“云”功能不断普及&#xff0c;“云端”数据也成为了境外间谍情报机关关注的重点&#xff0c;他们通过网络攻击、植入木马等各种手段&#xff0c;试图窃取我敏感信息和涉密数据…

将你的IOS升级到18

一、登录到苹果开发者网站 Apple Developer 二、选择IOS 18 三、选择Download 四、登录appleid 五、显示下载页面 六、登录你的手机

一款优秀的下载和共享工具

一、简介 1、它以舒适和快速的方式下载Internet文件&#xff0c;同时支持断点续传和嗅探视频音频的功能。 它具有站点抓取、批量下载队列和计划任务下载等功能&#xff0c;可以接管所有浏览器的下载任务&#xff0c;包括Edge&#xff0c;Firefox和Chrome等主流浏览器。 对于用…

螺栓拧紧力矩标准

据德国VOITH提供Nm换算所得 螺栓扭矩表 (单位&#xff1a;Nm、Kgm) Nm0.101972mKg M6~M24螺钉或螺母的拧紧力矩操作者参考 ★对于设计图纸有明确力矩要求的;应按图纸要求执行… 套管螺母紧固力矩Q/STB B07833-1998 材料 HPb63-3Y2 直通式压注油杯 Q/STB B07020-1998螺纹M6、…

【测试开发】

1.一个优秀的软件测试人员具备的素质 综合能力 沟通能力快速学习的能力开发能力文字能力 掌握自动化测试技术 掌握自动化测试技术&#xff0c;可以把你从大量重复性劳动中解脱出来&#xff0c;这样可以把更多的经历都花在更多类型的测试上 优秀的测试用例设计能力 测试用例设计…

基于springboot实现高校专业实习管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现高校专业实习管理系统的设计演示 摘要 随着国内市场经济这几十年来的蓬勃发展&#xff0c;突然遇到了从国外传入国内的互联网技术&#xff0c;互联网产业从开始的群众不信任&#xff0c;到现在的离不开&#xff0c;中间经历了很多挫折。本次开发的高校专业实…

Hausdorff距离定义与计算方法

当谈论距离时&#xff0c;我们通常指的是最短距离&#xff1a;例如&#xff0c;如果说点 X 距离多边形 P 的距离为 D&#xff0c;我们通常假设 D 是从 X 到 P 的最近点的距离。同样的逻辑也适用于多边形&#xff1a;如果两个多边形 A 和 B 彼此相距一定距离&#xff0c;我们通常…

前端 JS 经典:动态执行 JS

前言&#xff1a;怎么将字符串当代码执行。有 4 中方式实现 eval、setTimeout、创建 script 标签、new Function 1. eval 特点&#xff1a;同步执行&#xff0c;当前作用域 var name "yq"; function exec(string) {var name "yqcoder";eval(string); …

数据结构---力扣232.用栈实现队列(C

链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;【点击即可跳转】 思路&#xff1a; 栈 是 后进先出 队列 是 先进先出 让一个栈&#xff08;s1&#xff09;作为空栈&#xff0c;入队列的栈 另一个&#xff08;s2&#xff09;作为非空栈&#xff0c;出队列的栈…

经典的带环链表问题(链表补充)

环形链表1 运用快慢指针的方法&#xff0c;fast ,slow从头节点出发&#xff0c;快指针走两步&#xff0c;慢指针走一步&#xff0c;若有环&#xff0c;快指针先进环&#xff0c;后续如果慢指针和快指针相遇&#xff0c;则链表带环。转换成了追击问题。 struct ListNode {int v…

品牌与产品:消费者决策的经济逻辑与品牌宣传的战略意义

在当今日益全球化的经济环境中&#xff0c;品牌与产品之间的关系对于企业的成功与否起着至关重要的作用。然而&#xff0c;在消费者做出购买决策时&#xff0c;他们到底是在选择产品本身&#xff0c;还是在选择附着在产品之上的品牌价值&#xff1f;同样&#xff0c;当客户选择…