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

news/2024/9/13 22:49:52/ 标签: qt, 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.ppmy.cn/news/1516275.html

相关文章

下载B站视频作为PPT素材

下载B站视频作为PPT素材 1. 下载原理2. 网页分析3. 请求页面&#xff0c;找到数据4. 数据解析5. 音频、视频下载6. 合并音频与视频7. 完整代码 其实使用爬虫也不是第一次了&#xff0c;之前从网站爬过图片&#xff0c;下载过大型文件&#xff0c;如今从下载视频开始才想到要写一…

【C++算法/学习】位运算详解

✨ 忍能对面不相识&#xff0c;仰面欲语泪现流 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;算法学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &…

Spring MVC (面试篇)

目录 什么是Spring MVC&#xff1f; 简单介绍下你对Spring MVC的理解&#xff1f; SpringMVC的优点 Spring MVC的主要组件&#xff1f; Spring MVC常用的注解由哪些&#xff1f; Controller注解的作用 加油兄弟们 &#xff01; &#xff01; ! 什么是Spring MVC&#xff1…

HAL库:中断 方式按键检测:抬起执行、按下执行、长按短按检测、延时执行

目录 HAL库&#xff1a;中断 方式按键检测&#xff1a;抬起执行、按下执行、长按短按检测、延时执行 注意事项&#xff1a; 初始化部分&#xff1a; 回调函数部分 HAL库&#xff1a;中断 方式按键检测&#xff1a;抬起执行、按下执行、长按短按检测、延时执行 注意事项&am…

《黑神话·悟空》:国产3A大作背后是用什么语言开发的?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言&#xff1a; 近年来&#xff0c;国产游戏产业发展迅速&#xff0c;涌现出了许多优秀的作品。《黑神话悟空》作为一款备受瞩…

LeetCode Hot100:128、最长连续序列

题目&#xff1a;最长连续序列 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 方案一&#xff1a;哈希表 class Solution { public…

用爬虫玩转石墨文档细解

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 石墨文档是一款受欢迎的在线协作工具&#xff0c;它允许多人实时编辑和共享文档。通过爬虫技术&#xff0c;我们可以自动化地获取石墨文档中的内容&#xff0c;进行数据分析或备份。不过&#xff0c;在使用爬虫技术时&a…

Python 爬虫入门(十二):正则表达式「详细介绍」

Python 爬虫入门&#xff08;十二&#xff09;&#xff1a;正则表达式 前言一、正则表达式的用途二、正则表达式的基本组成元素2.1 特殊字符2.2 量词2.3 位置锚点2.4 断言2.5 字符集2.6 字符类2.6.1 基本字符类2.6.2 常见字符类简写2.6.3 POSIX字符类2.6.4 组合使用 三、 正则表…

DVWA靶场通关(CSRF)

CSRF 是跨站请求伪造&#xff0c;是指利用受害者尚未失效的身份认证信息&#xff08;cookie、会话等&#xff09;&#xff0c;诱骗其点击恶意链接或者访问包含攻击代码的页面&#xff0c;在受害人不知情的情况下以受害者的身份向&#xff08;身份认证信息所对应的&#xff09;服…

第七章 项目布局实现(7.4.4)——全屏功能

7.4.4 全屏功能 全屏功能通过 VueUse 实现。VueUse 基于 Vue 组合式 API 的实用工具集,功能非常丰富。 官网:https://vueuse.org/ 安装 npm i @vueuse/core当前 package.json 文件: {"name": "yumi-admin","private":

前端宝典十五:设计模式之前端开发5大设计原则

本文主要探讨前端开发设计原则&#xff1a; 单一职责原则 开闭原则 里氏替换原则 接口隔离原则 依赖倒置原则 一、单一职责原则&#xff08;Single Responsibility Principle&#xff0c;SRP&#xff09; 1、介绍&#xff1a; 一个类应该只有一个引起它变化的原因。这意味着…

基于Modbus的MFC智能控制

1. 系统概述 利用LabVIEW通过Modbus 485协议实现对七星&#xff08;Sevenstar&#xff09;品牌质量流量控制器&#xff08;MFC&#xff09;的智能化控制。该系统将自动控制多个MFC的流速&#xff0c;实时监控其状态&#xff0c;并根据需要进行调整。 2. 硬件配置 MFCs: 七星品…

Python和MATLAB梯度下降导图

&#x1f3af;要点 寻找局部最小值普通最小二乘法和随机梯度下降的动量线性回归媒体广告销售光学字符识别和最小化均方误差男女医疗费用最快速下降方向函数优化等高线图可视化共轭梯度下降可视化损失函数、动量、涅斯特洛夫动量、权衰减量化不确定性拓扑结构算法分类中权重归一…

SE11 没有激活的名称表存 No active nametab exists for

背景&#xff1a; SE11中减少某个非空表的字段的长度后&#xff0c;在SE14中的操作不当&#xff0c;并且对该表进行了删除重建的操作后&#xff0c;发生SE11激活该表报错。 原因&#xff1a; 出现了一些未知原因&#xff0c;导致该表在底层数据库存在&#xff0c;但是运行时对…

cpu steal非常高

steal代表非自愿等待&#xff0c;这个值出现说明服务器cpu争用很严重&#xff0c;cpu资源不足 ctxt&#xff0c;这个值代表cpu上下文切换次数/proc/stat 是一个伪文件系统&#xff08;procfs&#xff09;中的文件&#xff0c;它提供了系统级别的统计信息。这个文件包含了CPU使用…

Spring + Boot + Cloud + JDK8 + Elasticsearch 单节点 模式下实现全文检索高亮-分页显示 快速入门案例

1. 安装elasticsearchik分词器插件 sudo wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-8.13.4.zip sudo mkdir -p ./es_plugins/analysis-ik sudo mkdir ./es_data sudo unzip elasticsearch-analysis-ik-8.13.4.zip -d ./es_plugins/a…

数据结构-全部由1组成的子矩形数量

给定一个二维数组matrix, 其中的值不是0就是1&#xff0c; 返回全部由1组成的子矩形数量。 import java.util.Stack;public class CountSubmatricesWithAllOnes {public static void main(String[] args) {int[][] mat {{1,1,1,1,1,1},{1,1,1,1,1,1},{1,1,1,1,1,1}};System.o…

腾讯云是什么?为什么选择它?

腾讯云是什么&#xff1f; 腾讯云&#xff08;Tencent Cloud&#xff09;是全球领先的云计算服务提供商&#xff0c;凭借其强大的技术实力和丰富的行业经验&#xff0c;腾讯云为全球超过100万用户提供稳定、可靠、高效的云计算服务。无论是初创企业&#xff0c;还是大型企业&a…

22. K8S及DevOps

22. K8S及DevOps 一. 章节简介二. DevOps1. 简介2. CICD三. Kubernetes[1. 官网](https://kubernetes.io/zh-cn/)--------------------------------------------------------------------------------------------------------一. 章节简介 二. DevOps 1. 简介 2. CICD

element表格导出

element表格导出 使用了xlsx插件做表格下载 1、首先安装xlsx插件 import XLSX from ‘xlsx’ 2、在el-table上添加ref 3、导出方法 downloadFun() {const tableElement this.$refs.table.$elconst ws XLSX.utils.table_to_sheet(tableElement)// 创建工作簿并添加工作表…