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

Qt篇——QTableWidget保存表格数据到Excel文件中,读Excel内容到QTableWidget

表格和excel例子如下图所示: 

一、QTableWidget保存表格数据到Excel文件中

代码如下:

(pro文件中添加QT += axcontainer)

#include <QAxObject>void MainWindow::saveTableToExcel() {QDateTime current_date_time =QDateTime::currentDateTime();QString excelName = "data_" + current_date_time.toString("yyyy-MM-dd_hh-mm-ss");QString filePath = QFileDialog::getSaveFileName(this, "Save Data", excelName, "Microsoft Excel 2013(*.xlsx)");int row = ui->originDataTable->rowCount();int col = ui->originDataTable->columnCount();QAxObject* excel = new QAxObject(this);//excel->setControl("ket.Application");//wpsexcel->setControl("Excel.Application"); //Excelexcel->dynamicCall("SetVisible(bool Visible)", false);excel->setProperty("DisplayAlerts", false);QAxObject* workbooks = excel->querySubObject("WorkBooks");workbooks->dynamicCall("Add");QAxObject* workbook = excel->querySubObject("ActiveWorkBook");QAxObject* worksheets = workbook->querySubObject("Sheets");QAxObject* worksheet = worksheets->querySubObject("Item(int)", 1);for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {QAxObject* Range = worksheet->querySubObject("Cells(int,int)", i + 1, j + 1);Range->dynamicCall("SetValue(const QString &)", ui->originDataTable->item(i, j)->text());}}workbook->dynamicCall("SaveAs(const QString &)", QDir::toNativeSeparators(filePath));if (excel != NULL) {excel->dynamicCall("Quit()");delete excel;excel = NULL;}QMessageBox::information(this, QStringLiteral("提示"), "保存成功");
}

二、读Excel文件内容到QTableWidget表格中

#include <QAxObject>void MainWindow::saveTableToExcel() {QString strFile = QFileDialog::getOpenFileName(this,QStringLiteral("选择Excel文件"),"","Exel file(*.xls *.xlsx)");if (strFile.isEmpty()){return;}QAxObject excel("Excel.Application");excel.setProperty("Visible", false);QAxObject *work_books = excel.querySubObject("WorkBooks");//打开指定文件work_books->dynamicCall("Open (const QString&)", strFile);QAxObject *work_book = excel.querySubObject("ActiveWorkBook");QString ExcelName;static int row_count = 0, column_count = 0;QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", 1);QAxObject *used_range = work_sheet->querySubObject("UsedRange");QAxObject *rows = used_range->querySubObject("Rows");row_count = rows->property("Count").toInt();QAxObject *column = used_range->querySubObject("Columns");column_count = column->property("Count").toInt();//这里先清空QTableWidget表格数据ui->originDataTable->clearContents();ui->setRowCount(0);for (int i = 1; i <= row_count; i++) {QStringList dataList;for (int j = 1; j <= column_count;j++) {QAxObject *range = work_sheet->querySubObject("Cells(int,int)",i,j); //获取cell的值QString strVal = range->dynamicCall("Value2()").toString();dataList << strVal;}int row = ui->originDataTable->rowCount();ui->originDataTable->insertRow(row);for (int col = 0; col < dataList.size(); ++col) {QTableWidgetItem *pItem = new QTableWidgetItem(dataList[col]);ui->originDataTable->setItem(row, col, pItem);}}work_book->dynamicCall("Close(Boolean)", false);  //关闭文件excel.dynamicCall("Quit(void)");  //退出
}

总结:

QAxObject读取excel较为方便,不必使用第三方库;缺点是读取excel文件时非常慢,一个内容很少的excel文件读取都需要几秒钟。 用第三方库读取效率会高一些,我用的是xlsx的库,需要的可以在评论区留下自己的邮箱,我将在有空时回复并发到邮箱。

相关文章:

  • 人工智能之Tensorflow程序结构
  • 信息安全计划
  • hive中如何取交集并集和差集
  • ES项目应用
  • 用html编写的小广告板
  • MongoDB之MongoDBConnectorBI安装与使用
  • 算法【线性表的查找-顺序查找】
  • 4核8g服务器能支持多少人访问?
  • 二次供水物联网:HiWoo Cloud助力城市水务管理升级
  • 七、ChatGPT为什么会被热炒?
  • Elasticsearch从入门到精通-01认识Elasticsearch
  • 东芝工控机维修东芝电脑PC机维修FA3100A
  • R语言在数据分析中的应用案例
  • Python数据处理(三)-txt文件指定数据提取并可视化作图
  • Java架构师之路八、安全技术:Web安全、网络安全、系统安全、数据安全等
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • CODING 缺陷管理功能正式开始公测
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JavaScript-Array类型
  • Java新版本的开发已正式进入轨道,版本号18.3
  • js中的正则表达式入门
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • php面试题 汇集2
  • Python进阶细节
  • SpingCloudBus整合RabbitMQ
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • SQLServer插入数据
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Web设计流程优化:网页效果图设计新思路
  • 技术:超级实用的电脑小技巧
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 山寨一个 Promise
  • 使用权重正则化较少模型过拟合
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 用 Swift 编写面向协议的视图
  • 用Python写一份独特的元宵节祝福
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • #HarmonyOS:Web组件的使用
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (C++20) consteval立即函数
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (转)菜鸟学数据库(三)——存储过程
  • (转载)Linux 多线程条件变量同步
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .stream().map与.stream().flatMap的使用
  • /proc/stat文件详解(翻译)