QT中使用QAxObject类读取xlsx文件内容并显示在ui界面

news2025/2/23 11:19:30

一、源码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private:
    void readFile();
    bool isXlsxFile(const QString &filePath);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDir>
#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
#include <QFileInfo>
#include <QDebug>
#include <QAxObject>
#include <QVariant>
#include <QMap>
#include <QStandardItemModel>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    readFile();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::readFile()
{
    connect(ui->pushButton, &QPushButton::clicked, this, [=](){
        QString currentpath = QDir::homePath();
        QString openfiletitle = "请选择文件";
        QString filefilter = "all(*.*)";
        QString filepath = QFileDialog::getOpenFileName(this, openfiletitle, currentpath, filefilter);

        if(filepath.isEmpty())
        {
            QMessageBox::warning(this, "警告!!", "文件夹不能为空!");
            return;
        }

        QFileInfo info(filepath);//获取文件信息
        ui->lineEdit->setText(info.fileName());

        //excel表格读取
        QAxObject *excel = new QAxObject(this);
        excel->dynamicCall("Visible(bool)", false);
        if (isXlsxFile(filepath))
        {
            excel->setControl("Excel.Application");// 加载 Microsoft Excel 控件
        }
        else
        {
            excel->setControl("ket.Application");  // 加载 WPS Excel 控件
        }

        excel->setProperty("Visible", false);  // 不显示 Excel 窗体
        QAxObject* workBooks = excel->querySubObject("WorkBooks");  //获取工作簿集合
        workBooks->dynamicCall("Open(const QString&)", filepath); //打开打开已存在的工作簿
        QAxObject* workBook = excel->querySubObject("ActiveWorkBook"); //获取当前工作簿

        QAxObject* sheets = workBook->querySubObject("Sheets");  //获取工作表集合,Sheets也可换用WorkSheets
        QAxObject* sheet = workBook->querySubObject("WorkSheets(int)", 1);//获取工作表集合的工作表1,即sheet1

        //获取该sheet的使用范围对象(一般读取 Excel 时会选取全部范围)
        QAxObject* usedRange = sheet->querySubObject("UsedRange");

        /*
        //获取 sheet 的指定范围(一般写入数据时,会选取指定范围)
        QAxObject* usedRange = sheet->querySubObject("Range(const QString)", "A1:C12");

        //获取 sheet 的指定范围(一般修改数据时,会选取指定单元格)
        QAxObject* usedRange = sheet->querySubObject("Range(QVariant,QVariant)", "A6");
        */

        //读取单元格内容
        QVariant var = usedRange->dynamicCall("Value");
        delete usedRange;

//        qDebug() << var;

        //数据转换
        QList<QList<QVariant>> xls_data;

        QVariantList varRows = var.toList();
        if (varRows.isEmpty()) {
            return;
        }

        const int rowCount = varRows.size();

        QVariantList rowData;

        for (int i = 0; i < rowCount; i++){
            rowData = varRows[i].toList();
            int clumnCount = rowData.size();
            if(rowData.count() > clumnCount)
            {
                clumnCount = rowData.count();
            }
            xls_data.push_back(rowData);

//            qDebug() << rowData;
        }

        //写进UI表格
        // 创建模型
        QStandardItemModel *model = new QStandardItemModel(rowCount, rowData.size(), this);
        for (int i = 0; i < xls_data.count(); i++) {
            for (int j = 0; j < xls_data.at(i).count(); j++) {
                QStandardItem *item = new QStandardItem(QString(xls_data.at(i).at(j).toByteArray()));
                model->setItem(i, j, item);
//                delete item;
            }
        }
        ui->tableView->setModel(model);

        // 隐藏行号和列号
        ui->tableView->verticalHeader()->hide();
        ui->tableView->horizontalHeader()->hide();
    });
}

bool MainWindow::isXlsxFile(const QString &filePath)
{
    QFileInfo fileInfo(filePath);
    QString extension = fileInfo.suffix().toLower();

    // 列出常见的文本文件扩展名
    static const QStringList textExtensions = {"txt", "csv", "log", "xml", "json", "xlsx"};

    return textExtensions.contains(extension);
}

注意,QAxObject使用需要在pro文件添加axcontainer模块。

二、效果

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Andrid异步更新UI:Handler(二)深入了解:Message你真的会创建?它是如何子线程和主线程通知?

目录 为什么会有HandlerHandler的原理&#xff0c;以及对象讲解主线程的loop在哪里&#xff0c;为什么主线程loop没有阻塞呢&#xff1f;Looper如何保证唯一Handler为什么会引发内存泄漏呢&#xff1f;Message应该如何创建它&#xff1f; 一、为什么会有Handler 线程分为主线…

软件工程造价师习题练习 18

1.在软件估算过程中&#xff0c;我们主要对项目的规模&#xff0c;质量&#xff0c;进度和成本进行估算 错误 正确 软件估算不对质量进行估算&#xff0c;只对项目的规模&#xff0c;进度&#xff0c;成本进行估算。 答案&#xff1a;错误 2.在使用类比法进行估算时&#xf…

基于单片机的电子指南针设计

摘要&#xff1a;随着科技的进步与发展&#xff0c;尤其是电子技术的推动下社会逐渐向智能化、信息化和人工智能等方面发展。与此同时市场更加需要掌握精确的方位角度信息&#xff0c;服务到生活、产业、出行、航行等各方各面。传统的指南针由于本身的物理特性&#xff0c;抗干…

深度剖析C++string(上篇)

目录 前言 1.C string类 2.string类中的常见构造 3.string类对象的容量操作 4.. string类对象的访问及遍历操作 5. auto和范围for(补充&#xff09; auto关键字 范围for 结束语 前言 C语言我们学习了字符串和字符串的相关函数&#xff0c;在C语言中&#xff0c;字符串是…

【Redis基础1】——使用场景-缓存穿透

目录 1-引言&#xff1a;初始缓存穿透1-1 缓存穿透是什么&#xff1f;(What)1-2 缓存穿透是怎么造成的&#xff1f;(Why) 2- 核心&#xff1a;如何避免缓存穿透&#xff08;How&#xff09;2-1 方案1&#xff1a;缓存空数据2-2 方案2&#xff1a;布隆过滤器2-2-1 布隆过滤器原理…

计算机毕业设计Hive+Hadoop深圳共享单车预测系统 共享单车数据分析可视化大屏 共享单车爬虫 共享单车数据仓库 机器学习 深度学习 PySpark

步骤&#xff1a; 1.Python采集深圳政府公开数据平台的共享单车数据(最大可采集上亿2017-2021数据)&#xff0c;并用百度逆地理编码服务解析经纬度获取位置信息。并将数据上传hdfs&#xff1b; 2.可使用sklearn、卷积神经网络等算法对数据进行分析&#xff0c;对共享单车的订单…

树链剖分学习

1.算法适用&#xff1a;维护树上一段或者某个点的子树权值和&#xff0c;同时支持树上路径大小修改&#xff0c;子树修改 2.实现&#xff1a;将树剖分成一条一条链&#xff0c;重链和轻链。其中&#xff0c;轻链连接非重儿子&#xff0c;重链相反。 3.主体部分&#xff1a; …

Array List 练习(添加手机对象并返回要求的数据)

package ArrayListDemo;import java.util.ArrayList;public class ArrayListDemo7 {public static void main(String[] args) {//1.创建集合对象ArrayList<Phone> list new ArrayList<Phone>();//2.创建手机对象Phone ph1 new Phone("小米",1000);Pho…

06-07 - 文件系统(下)

---- 整理自 王利涛老师 课程 实验环境&#xff1a;宅学部落 www.zhaixue.cc 文章目录 15. 根文件系统15.1 根文件系统的基本概念15.2 挂载根文件系统的三种方式15.3 根文件系统的挂载15.3.1 rootfs 文件系统的概念15.3.2 root 参数分析15.3.3 根目录“ / ” 16. 使用 initrd 作…

智能家居:‌未来生活的崭新篇章

随着科技的飞速发展&#xff0c;‌智能家居正逐渐从概念走向现实&#xff0c;‌为我们的日常生活带来前所未有的便捷与舒适。‌智能家居&#xff0c;‌简而言之&#xff0c;‌就是利用先进的物联网技术、‌人工智能、‌大数据分析等&#xff0c;‌将家中的各种设备连接起来&…

text token通过cross attention来编辑图片

https://zhuanlan.zhihu.com/p/645249016https://zhuanlan.zhihu.com/p/645249016diffusers中的cross-attention实现_diffusers.models.attention.crossattention-CSDN博客文章浏览阅读71次。在models/unets/unet_2d_condition.py中,如何在Unet中将原注意力类替换,Unet中的at…

笔记:Echarts柱状图 实现滚轮条 数据太多

效果&#x1f447;&#x1f447;&#x1f447; 配置&#xff1a;&#x1f447; let option {dataZoom: [{type: "slider",show: true,zoomLock: true,start: 0,end: 20,bottom: 60,height: 10,textStyle: {color: "transparent",fontSize: 9,},fillerColo…

WEB应用服务器 -- Tomcat详解及案例实现

一、Web前端三大核心技术 1.1 HTML HTML&#xff08;HyperText Markup Language&#xff09;超文本标记语言&#xff0c;它不同于一般的编程语言。超文本即超出纯文本的范畴&#xff0c;例如&#xff1a;描述文本颜色、大小、字体等信息&#xff0c;或使用图片、音频、视频等…

Linux 操作系统全览:从文件管理到系统状态掌控

在当今的计算机技术领域&#xff0c;Linux 操作系统以其稳定性、安全性和高度的可定制性而备受青睐。本文将深入探讨 Linux 操作系统的多个重要方面&#xff0c;包括文件管理、文本操作、软件安装、用户和权限管理以及网络和系统状态管理。 一、Linux 文件管理 Linux 的文件系…

哈工深、NUS等联合提出全新信息抽取基准任务:细粒度定位的统一多模态信息抽取...

信息抽取是 NLP 领域长久以来最经典的研究方向之一。信息抽取的研究经历过了多模态抽取阶段&#xff0c;以及大一统的抽取阶段。在大语言模型和多模态时代&#xff0c;信息抽取的发展何去何从&#xff0c;目前社区仍在积极探索中。 近期&#xff0c;由哈工深和新加坡国立大学等…

131-横向移动-Kerberos攻击SPN扫描WinRMWinRSRDP

1、RDP协议 Remote Desktop Protocol 远程桌面协议通常开放3389 &#xff0c;Windows上面使用mstsc就可以弹出最常见的远程桌面连接方式&#xff0c;一般都是使用明文进行连接其实还可以使用hash进行 在内网中使用RDP协议一般是需要进行代理转发或者建立节点的 端口扫描 shel…

实现AOP机制 + Spring总结

文章目录 1.目录2.SmartAnimal.java 接口&#xff08;JDK代理必须有接口&#xff09;3.SmartDog.java4.SmartAnimalAspect.java5.SunSpringApplicationContext.java1.在Bean的后置处理器之后使用动态代理2.完整代码 6.测试1.AppMain.java 调用被代理的类的方法2.结果 7.Spring底…

维特——六九轴陀螺仪传感器代码的移植方法

使用的是如图所示的这款陀螺仪&#xff0c;相比MPU6050&#xff0c;它可以做到Z轴不漂的效果。 官方给的代码是使用两个串口&#xff0c;一个用来和上位机通信&#xff0c;一个用来于该模块通信。在实际使用中&#xff0c;我们只需要单片机和该模块通信即可&#xff0c;所以我…

Centos安装Jenkins教程详解版(JDK8+Jenkins2.346.1)

本教程基于 JDK8 和 Jenkins2.346.1 JDK安装 下载OpenJDK8文件 wget https://mirrors.tuna.tsinghua.edu.cn/Adoptium/8/jdk/x64/linux/OpenJDK8U-jdk_x64_linux_hotspot_8u422b05.tar.gz解压到指定目录 # 创建目录 mkdir -p /usr/local/software# 解压文件到指定目录&#…

uniapp点击预览图片,两种效果

背景&#xff1a; 在使用uniapp框架中&#xff0c;我们对图片的展示需要点击放大展示(单张)&#xff1b;如果是多张图片&#xff0c;要支持左右滑动查看多张图片(多张)。 官网链接&#xff1a;点击跳转官网 一、单张&#xff0c;点击放大 代码&#xff1a; <template> …