Qt tableWidget导入\导出Excel表格 自用

首先在.pro文件中添加以下代码:QT+=axcontainer
代码是转载的,找不到源博客链接

void excel_01::on_pushButton_clicked()
{//导出ui->progressBar->setValue(0);   //设置进度条的值为0QString fileName = QFileDialog::getSaveFileName(this,tr("Excle file"),QString("./paper_list.xlsx"),tr("Excel Files(*.xlsx)"));    //设置保存的文件名if(fileName != ""){    ui->progressBar->show();    //进度条需要在ui文件中加个progressBar控件ui->progressBar->setValue(10);QAxObject *excel = new QAxObject;if(excel->setControl("Excel.Application")){excel->dynamicCall("SetVisible (bool Visible)",false);excel->setProperty("DisplayAlerts",false);QAxObject *workbooks = excel->querySubObject("WorkBooks");            //获取工作簿集合workbooks->dynamicCall("Add");                                        //新建一个工作簿QAxObject *workbook = excel->querySubObject("ActiveWorkBook");        //获取当前工作簿QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);QAxObject *cell;/*添加Excel表头数据*/for(int i = 1; i <= ui->tableWidget->columnCount(); i++){cell=worksheet->querySubObject("Cells(int,int)", 1, i);cell->setProperty("RowHeight", 40);cell->dynamicCall("SetValue(const QString&)", ui->tableWidget->horizontalHeaderItem(i-1)->data(0).toString());if(ui->progressBar->value()<=50){ui->progressBar->setValue(10+i*5);}}/*将form列表中的数据依此保存到Excel文件中*/for(int j = 2; j<=ui->tableWidget->rowCount()+1;j++){for(int k = 1;k<=ui->tableWidget->columnCount();k++){cell=worksheet->querySubObject("Cells(int,int)", j, k);if(ui->tableWidget->item(j-2,k-1)!=NULL){cell->dynamicCall("SetValue(const QString&)",ui->tableWidget->item(j-2,k-1)->text()+ "\t");}}if(ui->progressBar->value()<80){ui->progressBar->setValue(50+j*5);}}/*将生成的Excel文件保存到指定目录下*/workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(fileName)); //保存至fileNameworkbook->dynamicCall("Close()");                                                   //关闭工作簿excel->dynamicCall("Quit()");                                                       //关闭exceldelete excel;excel=NULL;ui->progressBar->setValue(100);if (QMessageBox::question(NULL,QString::fromUtf8("完成"),QString::fromUtf8("文件已经导出,是否现在打开?"),QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes){QDesktopServices::openUrl(QUrl("file:///" + QDir::toNativeSeparators(fileName)));}ui->progressBar->setValue(0);ui->progressBar->hide();}}}void excel_01::on_pushButton_2_clicked()
{//导入ui->progressBar->setValue(0);   //设置进度条的值为0QString path = QFileDialog::getOpenFileName(this,"open","../","execl(*.xlsx)");//指定父对象(this),“open”具体操作,打开,“../”默认,之后可以添加要打开文件的格式if(path.isEmpty()==false){//文件对象QFile file(path);//打开文件,默认为utf8变量,bool flag = file.open(QIODevice::ReadOnly);if(flag == true)//打开成功{ui->progressBar->show();    //进度条需要在ui文件中加个progressBar控件ui->progressBar->setValue(10);QAxObject *excel = new QAxObject(this);//建立excel操作对象excel->setControl("Excel.Application");//连接Excel控件excel->setProperty("Visible", false);//不显示窗体看效果excel->setProperty("DisplayAlerts", false);//不显示警告看效果/*********获取COM文件的一种方式************/QAxObject *workbooks = excel->querySubObject("WorkBooks");//获取工作簿(excel文件)集合workbooks->dynamicCall("Open(const QString&)", path);//path至关重要,获取excel文件的路径//打开一个excel文件QAxObject *workbook = excel->querySubObject("ActiveWorkBook");QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",1);//访问excel中的工作表中第一个单元格QAxObject *usedRange = worksheet->querySubObject("UsedRange");//sheet的范围/*********获取COM文件的一种方式************///获取打开excel的起始行数和列数和总共的行数和列数int intRowStart = usedRange->property("Row").toInt();//起始行数int intColStart = usedRange->property("Column").toInt(); //起始列数QAxObject *rows, *columns;rows = usedRange->querySubObject("Rows");//行columns = usedRange->querySubObject("Columns");//列int intRow = rows->property("Count").toInt();//行数int intCol = columns->property("Count").toInt();//列数//起始行列号//qDebug()<<intRowStart;//qDebug()<<intColStart;//行数和列数//qDebug()<<intRow;//qDebug()<<intCol;int a,b;a=intRow-intRowStart+1,b=intCol-intColStart+1;QByteArray text[a][b];QString exceldata[a][b];int coerow=0,coecol=0;for (int i = intRowStart; i < intRowStart + intRow; i++,coerow++){coecol=0;//务必是要恢复初值的for (int j = intColStart; j < intColStart + intCol; j++,coecol++){auto cell = excel->querySubObject("Cells(Int, Int)", i, j );QVariant cellValue = cell->dynamicCall("value");text[coerow][coecol]=cellValue.toByteArray();//QVariant转换为QByteArrayexceldata[coerow][coecol]=QString(text[coerow][coecol]);//QByteArray转换为QStringif(ui->progressBar->value()<=60){ui->progressBar->setValue(10+i*5);}//qDebug()<<exceldata[coerow][coecol]<<coerow<<" "<<coecol;}}ui->tableWidget->setRowCount(a-1);for(int i=1;i<a;++i)for(int j=0;j<b;++j){ui->tableWidget->setItem(i-1, j, new QTableWidgetItem(exceldata[i][j]));if(ui->progressBar->value()<=80){ui->progressBar->setValue(60+i*5);}}workbook->dynamicCall( "Close(Boolean)", false );excel->dynamicCall( "Quit(void)" );delete excel;ui->progressBar->setValue(100);QMessageBox::warning(this,tr("读取情况"),tr("读取完成!"),QMessageBox::Yes);ui->progressBar->hide();ui->progressBar->setValue(0);}file.close();}
}

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

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

相关文章

基于HubServing的PaddleOCR部署

前提要求 服务器的部署需要鉴于先前安装配置的docker环境&#xff0c;因此相关步骤查看我之前的博客 参考链接 服务部署 先前介绍 参考链接 官方推荐本博客采用基于HubServing的部署&#xff0c;这种方式已经集成到PaddleOCR里面&#xff0c;在先前的docker镜像里面就可以…

我的职业生涯规划学习日记(软件工程)整理时间线

学习路线 语言只是工具不过学c一直都做不出来东西是为什么呢&#xff0c;下图要第六部才做项目 概述 大一上学期&#xff1a;C&#xff0c;C&#xff0c;数据结构&#xff0c;cstl源码&#xff0c;python爬虫进入物联网实验室python方向&#xff0c;进入算法协会运维部学习算…

PaddleOCR和ChineseOCR的对比

PaddleOCR和ChineseOCR的对比 ChineseOCRPaddleOCR 对比 识别时间 chineseOCR识别的速度相对于PaddleOCR较慢&#xff0c;单纯使用CPU对于单张图片的识别时间可以达到20秒&#xff0c;如果使用GPU识别的时间一般控制在5秒以内&#xff08;图片包含的文字比较少的情形&#x…

C++内存管理(1)

根据侯捷老师的视频&#xff1a;https://www.bilibili.com/video/BV1Kb411B7N8 这篇文章归纳内存管理的面试题和一些知识点梳理 正在更新中 首先为什么想要内存管理 不知道有没有人好奇delete[]或者delete的时候为什么系统会自动这个变量 占了多少字节。 答案是因为cookies&a…

web3@0.20.1 在依据abi创建智能合约的时候报错 TypeError: web3.eth.contract is not a function

前面的代码不变 var web3 new Web3(new Web3.providers.HttpProvider("Http://localhost:8545")); var abi JSON.parse([{"constant":true,"inputs":[{"name":"candidate","type":"bytes32"}],"…

Linux学习笔记(一)------实操排雷

参考兄弟连b站网课 1.1如果没有ifconfig 使用sudo apt install net-tools 下载&#xff1b;&#xff08;ifconfig已经被淘汰所以需要另外下载&#xff09; 1.2如果网卡是ens33&#xff1b; &#xff08;1&#xff09;. vi /etc/sysconfig/network-scripts/ifcfg-ens33 将里面的…

Dapp简单的投票小例子

准备工作 相关命令 mkdir simple_voting_dapp //创建文件夹cd simple_voting_dapp //进入文件夹npm init //初始化npm包管理文件&#xff0c;输入ls 可以看到创建的package.json文件npm intsall web30.20.1 //安装web3npm install solc0.4.25 //安装solcnpm install -g ga…

使用mocha进行测试 区块链

mocha安装 npm install mocha --save-dev mocha简介 mocha是一个JavaScript的单元测试的框架&#xff0c;既可以运行在浏览器环境中&#xff0c;也可以运行在node.js环境中&#xff0c;只需要编写测试用例&#xff0c;mocha就会将测试自动的运行&#xff0c;并且给出测试的结…

Linux学习笔记(六)

参考书籍&#xff1a;linux就该这么学 6.存储结构与磁盘划分 6.1 文件系统与数据资料 6.2 挂载硬件设备 6.2.1 mount 命令用于挂载文件系统 6.2.2 umount 命令用于撤销已经挂载的设备文件 6.3 添加硬盘 6.3.1 fdisk 命令用于管理磁盘分区 6.3.2 用于查看文件数据占用量的 du 命…

实现Linux系统外部和容器内部的文件传输

主机和容器之间进行文件传输&#xff0c;需要使用容器的ID即可 获取方法如下 输入指令 docker ps -a只需要CONTAINER ID传输命令 docker cp 本地文件路径 容器ID:容器的路径将文件从容器拷贝到本地的原理是一致的&#xff0c;只需要将对应路径的位置进行更换即可

Linux学习笔记(五)

参考书籍&#xff1a;linux就该这么学 5 用户身份与文件权限 5.1 用户身份与能力 强烈推荐大家在学习时使用 root 管理员权限&#xff01;因为在 Linux 的学习过程中如果使用普通用户身份进行操作&#xff0c;则在配置服务之后出现错误时很难判断是系统自身的问题还是因为权限不…

清除Docker的占用空间问题

使用命令查看磁盘的空间 docker system df &#xff0c;类似于Linux的df命令&#xff0c;用于查看Docker使用的磁盘空间Docker镜像占据了4.789GBDocker容器占据了348BDocker数据卷占据了0B 执行删除命令 docker system prune命令可以用于清理磁盘&#xff0c;删除关闭的容器、…

集训01-03 (c++实现)

#include<bits/stdc.h>与using namespace std;在第一第二行加上就行&#xff0c;无需了解 cin cout endl为c的输入&#xff0c;输出与换行符 Istringsteam 是string流,用来string转换为int 五个函数&#xff08;需要稍微了解c迭代器&#xff0c;lambda(类似函数)&#xf…

区块链的完整流程 自动化执行代码

通过npm script机制&#xff0c; 在package.json文件中&#xff0c;输入对应的代码&#xff0c;就可以自动化执行相关的函数使用npm run test执行package.json中的内容&#xff0c;因为package.json包含test&#xff0c;所以可行&#xff0c;但是使用npm run compile会报错

集训04-06 (c++实现)

极力推荐《算法笔记》这本书&#xff01;&#xff01;&#xff01; 极力推荐《算法笔记》这本书&#xff01;&#xff01;&#xff01; 极力推荐《算法笔记》这本书&#xff01;&#xff01;&#xff01; &#xff08;重要的事情说三遍&#xff09; 数据结构和算法讲的很好&…

数字签名和数字信封之间的介绍

介绍 公钥密码体制在实际应用中包含数字签名和数字信封两种方式 数字签名 指用户用自己的【私钥】对原始数据的哈希摘要进行加密所得的数据。数字签名定义两种互补的运算&#xff1a;一个用于签名&#xff0c;另一个用于验证。"私钥签名,公钥验证"签名&#xff1a;…

Linux学习笔记(三)

参考书籍&#xff1a;Linux就该怎么学 3 管道符、重定向与环境变量 3.1.1 输入输出重定向 ➢ 标准输入重定向&#xff08;STDIN&#xff0c;文件描述符为 0&#xff09;&#xff1a;默认从键盘输入&#xff0c;也可从其他文件或命令中输入。 ➢ 标准输出重定向&#xff08;STDO…

windows版本的clion软件除了使用wsl配置Ubuntu子系统外,还可以使用MinGW-w64来配置gcc和g++

主要内容 MinGW-w64安装CMake安装环境配置参考链接 MinGW-w64安装配置 安装配置分为在线版本和离线版本&#xff0c;推荐使用离线版本&#xff0c;因为在线版本很慢&#xff0c;需要插入网线进行操作参考链接 这个是百度云下载地址&#xff0c;相对于从官网下载速度稍微快一些…

python学习路线

自用 Task1: 如果对一个列表&#xff0c;既要遍历索引又要遍历元素时&#xff0c;首先可以这样写&#xff1a; list1 ["这", "是", "一个", "测试"] for i in range (len(list1)):print i ,list1[i]#上述方法有些累赘&#xff0c…

解决使用MinGW编译C++代码报cannot find -lxxxx的问题

报错的截图如下面所示 我一开始使用target_link_libraries(ThreadTest libsdf_core.dll)这条命令来将dll库文件和项目文件关联起来&#xff0c;但是解决不了问题也尝试在编译代码的环境时候&#xff0c;将dll库文件的绝对路径加入到编译环境中&#xff0c;但是也没有用解决办法…