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.pswp.cn/news/447154.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447154.shtml
英文地址,請注明出處:http://en.pswp.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;但是也沒有用解決辦法…