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

一、源码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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也可换用WorkSheetsQAxObject* 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.rhkb.cn/news/407538.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式

运行机制 共享好端端的一词&#xff0c;近些年被玩坏了&#xff0c;共享单车,共享充电宝,共享办公室&#xff0c;共享雨伞… 甚至还有共享女朋友&#xff0c;真是人有多大胆&#xff0c;共享有多大产。但凡事太尽就容易恶心到人&#xff0c;自己也一度被 共享内存 恶心到了&am…

看图学sql之sql中的子查询

&#xfeff;&#xfeff; &#xfeff;where子句子查询 语法&#xff1a; SELECT column_name [, column_name ] FROM table1 [, table2 ] WHERE column_name OPERATOR(SELECT column_name [, column_name ]FROM table1 [, table2 ][WHERE]) 子查询需要放在括号( )内。O…

解决git checkout -b 拉取远端某分支到本地时报错

问题描述 日常开发场景中&#xff0c;经常会出现切分支的情况&#xff0c;所以git checkout 命令是非常高频的 git checkout -b feature/xxx默认情况下&#xff0c;这条命令是基于当前所在分支来开辟新分支feature/xxx 但是&#xff0c;还有一些情况&#xff0c;我们需要基于…

appium下载及安装

下载地址&#xff1a;https://github.com/appium/appium-desktop/releases 双击安装就可以

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(三)---创建自定义激光雷达Componet组件

前言 本系列教程旨在使用UE5配置一个具备激光雷达深度摄像机的仿真小车&#xff0c;并使用通过跨平台的方式进行ROS2和UE5仿真的通讯&#xff0c;达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础&#xff0c;Nav2相关的学习教程可以参考本人的其他博…

数学建模学习(115):主成分分析(PCA)与Python实践

文章目录 一.主成分分析简介1.1 数学背景与维度诅咒1.2 PCA的定义与应用二.协方差矩阵——特征值和特征向量三.如何为数据集选择主成分数量四.特征提取方法五.LDA——与PCA的区别六.PCA的应用七.PCA在异常检测中的应用八.总结一.主成分分析简介 1.1 数学背景与维度诅咒 主成成…

视频智能分析平台烟火检测视频安防监控烟火算法识别应用方案

烟火检测算法的应用方案主要围绕其核心技术——深度学习&#xff08;特别是卷积神经网络CNN&#xff09;和计算机视觉技术展开&#xff0c;旨在实现对监控视频中的烟雾和火焰进行实时、准确的检测与识别。以下是一个详细的烟火检测算法应用方案&#xff1a; 一、技术原理 烟火…

高并发集群饿了么后端的登录模块

高并发集群饿了么后端的登录模块 1.数据库 非交互式python&#xff1a; 非交互式: 2.数据库的负载均衡&#xff1a;阿里巴巴的mycat 修改配置文件 /usr/local/mycat/conf/server.xml :对外的账号 密码 数据库 /usr/local/mycat/conf/schema.xml 如果出现启动异常&…

【微信小程序】自定义组件 - 数据监听器

1. 什么是数据监听器 2. 数据监听器的基本用法 组件的 UI 结构如下&#xff1a; 组件的 .js 文件代码如下&#xff1a; 3. 监听对象属性的变化 数据监听器 - 案例 案例效果 2. 渲染 UI 结构 3. 定义 button 的事件处理函数 4. 监听对象中指定属性的变化 5. 监听对象中所…

readpaper在读论文时候的默认规定

红色代表主旨思想 蓝色代表专业名词解析

【MySQL】 黑马 MySQL进阶 笔记

文章目录 存储引擎MySQL的体系结构存储引擎概念存储引擎特点InnoDBMyISAMMemory 存储引擎选择 索引概述结构B Tree(多路平衡查找树)B TreeHash为什么InnoDB存储引擎选择使用Btree索引结构? 分类思考题 语法SQL性能分析&#xff08;索引相关&#xff09;SQL执行频率慢查询日志p…

XSS game复现(DOM型)

目录 1.Ma Spaghet! 2.Jefff 3.Ugandan Knuckles 4.Ricardo Milos 5.Ah Thats Hawt 6.Ligma 7.Mafia 8.Ok, Boomer 1.Ma Spaghet! 通过简单的尝试发现传递参数可以直接进入h2标签 接下来我们尝试传入一个alert(1) 可以看到并没有触发。原因是在innerHTML中官方禁用了sc…

MySQL InnoDB引擎四大特性ACID实现方案分析

文章目录 概要InnoDb引擎ACID模型的实现方案小结 概要 对于Mysql&#xff0c;事物的支撑并不依赖于Server层&#xff0c;不同的存储引擎对于事物的支持也不一样&#xff0c;对于我们常用的InnoDB引擎&#xff0c;其提供了一套基于【ACID模型】的事物完整的解决方案。为什么MyIS…

【AI Agent极限挑战赛】三大赛题揭晓

由AIGC开放社区联合联想拯救者、英特尔共同主办的【2024 AI Agent极限挑战赛】于8月17日在上海中庚聚龙酒店成功举办。赛事全面考察参赛者将AI技术应用于实际问题的能力。比赛内容包括对大语言模型的理解、提示词&#xff08;Prompt&#xff09;的结构化调优技术、个人助理Agen…

如何使用ssm实现在线云音乐系统的设计与实现

TOC ssm042在线云音乐系统的设计与实现jsp 第1章 绪论 1.1背景及意义 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于在线云音乐系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如用户管理、歌曲管理、推荐管理等&#xff0c;这给管理者的工作带来了巨…

基于华为昇腾910B和LLaMA Factory多卡微调的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…

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

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

Kubernetes服务发布基础

通过k8s的调度&#xff0c;我们可以成功的将服务部署到Kubernetes&#xff0c;应用部署后&#xff0c;最重要的就是对用户开放。 在传统的架构中&#xff0c;用户访问公司内的服务可能通过了多层代理、网关、防火墙等。在Kubernetes中&#xff0c;访问Kubernetes中的的应用同样…

Windows下使用QT5.14.2编译MySQL8.0对应的最新64位驱动程序步骤

不得不说mysql更新的速度是真的快&#xff0c;最近一两年都更新了好几个的小版本了。如果安装了高版本的 mysql软件&#xff0c;低版本的驱动就不支持了&#xff0c;因此需要重新使用QT来编译对应的mysql驱动。具体办法如下&#xff1a; 1、官网下载最新的mysql8.0安装包。下载…

ABAP 引用变量(TYPE REF TO )和字段符号(FIELD-SYMBOLS)全集

本文主要是记录了一些关于ABAP 引用变量(TYPE REF TO )和字段符号(FIELD-SYMBOLS)的相关内容&#xff0c;有些参考来自多个博客&#xff0c;以及官方文档 文章目录 FIELD-SYMBOLS字段符号官方文档Declaring Field SymbolsTyping Field Symbols 引用变量文章1引用变量介绍测试程…