1. 程式人生 > >Qt之操作Excel

Qt之操作Excel

#include #include #include #include #include int main(int argc, char *argv[]) {     //QCoreApplication a(argc, argv);     // 在後臺執行緒中使用QAxObject必須先初始化     CoInitializeEx(NULL, COINIT_MULTITHREADED);     QAxObject excel("Excel.Application");     excel.setProperty("Visible", true);     QAxObject * workBooks = excel.querySubObject("WorkBooks");     workBooks->dynamicCall("Open(const QString&)", QString("D:\\Development\\Trunk09\\testw.xlsx"));     QVariant titleValue = excel.property("Caption");    // 獲取標題     qDebug() << "excel title : " << titleValue;     QAxObject * workBook = excel.querySubObject("ActiveWorkBook");     QAxObject * workSheets = workBook->querySubObject("Sheets");    // Sheets也可換作WorkSheets     // 刪除工作表(刪除第一個)     QAxObject * firstSheet = workSheets->querySubObject("Item(int)", 1);     firstSheet->dynamicCall("delete");     // 插入工作表(插入到最後一行)     int sheetCount = workSheets->property("Count").toInt();    // 獲取工作表數目     QAxObject * lastSheet = workSheets->querySubObject("Item(int)", sheetCount);     QAxObject * workSheet = workSheets->querySubObject("Add(QVariant", lastSheet->asVariant());     lastSheet->dynamicCall("Move(QVariant)", workSheet->asVariant());     // 設定工作表名稱     workSheet->setProperty("Name", "Qt Sheet");     // 操作單元格(第二行第二列)     QAxObject * cell = workSheet->querySubObject("Cells(int, int)", 2, 2);     cell->setProperty("Value", "Java C++ C# PHP Perl Python Delphi Ruby");    // 設單元格的值     cell->setProperty("RowHight", 50);     cell->setProperty("ColumnWidth", 30);     cell->setProperty("HoriontalAligment", -4108);    // 左對齊(xlLeft):-4131 ;居中(xlCenter):-4108 ;右對齊(xlRight):-4152     cell->setProperty("VerticalAligment", -4108);    // 上對齊(xlTop):-4160 ;居中(xlCenter):4108 ;下對齊(xlBottom):-4107     cell->setProperty("WrapText", true);    // 內容過多,自動換行     //cell->dynamicCall("ClearContents()");    // 清空單元格內容     QAxObject* interior = cell->querySubObject("Interior");     interior->setProperty("Color", QColor(0, 255, 0));   //設定單元格背景色(綠色)     QAxObject* border = cell->querySubObject("Borders");     border->setProperty("Color", QColor(0, 0, 255));   //設定單元格邊框色(藍色)     QAxObject *font = cell->querySubObject("Font");  //獲取單元格字型     font->setProperty("Name", QStringLiteral("華文彩雲"));  //設定單元格字型     font->setProperty("Bold", true);  //設定單元格字型加粗     font->setProperty("Size", 20);  //設定單元格字型大小     font->setProperty("Italic", true);  //設定單元格字型斜體     font->setProperty("Underline", 2);  //設定單元格下劃線     font->setProperty("Color", QColor(255, 0, 0));  //設定單元格字型顏色(紅色)     //設定單元格內容,併合並單元格(第5行第3列-第8行第5列)     QAxObject *cell_5_6 = workSheet->querySubObject("Cells(int,int)", 5, 3);     cell_5_6->setProperty("Value", "Java");  //設定單元格值     QAxObject *cell_8_5 = workSheet->querySubObject("Cells(int,int)", 8, 5);     cell_8_5->setProperty("Value", "C++");     QString merge_cell;     merge_cell.append(QChar(3 - 1 + 'A'));  //初始列     merge_cell.append(QString::number(5));  //初始行     merge_cell.append(":");     merge_cell.append(QChar(5 - 1 + 'A'));  //終止列     merge_cell.append(QString::number(8));  //終止行     QAxObject *merge_range = workSheet->querySubObject("Range(const QString&)", merge_cell);     merge_range->setProperty("HorizontalAlignment", -4108);     merge_range->setProperty("VerticalAlignment", -4108);     merge_range->setProperty("WrapText", true);     merge_range->setProperty("MergeCells", true);  //合併單元格     //merge_range->setProperty("MergeCells", false);  //拆分單元格     //work_book->dynamicCall("Save()");  //儲存檔案(為了對比test與下面的test2檔案,這裡不做儲存操作) work_book->dynamicCall("SaveAs(const QString&)", "E:\\test2.xlsx");  //另存為另一個檔案     workBook->dynamicCall("Close(Boolean)", false);  //關閉檔案     excel.dynamicCall("Quit(void)");  //退出     //return a.exec(); } 四、專案實踐 將主介面的資料儲存到excel,由於儲存時間比較長,所以開執行緒執行該操作。 void SaveReportThread::run() {     // 在後臺執行緒中使用QAxObject必須先初始化     CoInitializeEx(NULL, COINIT_MULTITHREADED);     //SaveToExcel();     SaveToWord();     emit SIGNAL_SaveReportFinish(); } void SaveReportThread::SaveToExcel() {     QAxObject* pExcelApp = new QAxObject("Excel.Application");  // 建立EXCEL物件,啟動Excel.exe程序     pExcelApp->setProperty("DisplayAlerts", false);             // 儲存時不提示覆蓋     //pExcelApp->setProperty("Visible", true);                  // 操作時可以看見EXCEL視窗,除錯用     // 開啟測試報告模板     QAxObject* pWorkBooks = pExcelApp->querySubObject("WorkBooks");     pWorkBooks->dynamicCall("Open(const QString&)", QCoreApplication::applicationDirPath() + "/TestReportTemplate.xlsx");     QAxObject* pWorkBook = pExcelApp->querySubObject("ActiveWorkBook");     // 如果要儲存全部測試報告,先在模板檔案中複製多份sheet模板     QAxObject* pWorkSheet = pWorkBook->querySubObject("WorkSheets(int)", 1);     if (m_bSaveAll)     {         for (int i = 1; i < m_pMainwindow->m_vecItemList.size(); i++)             pWorkSheet->dynamicCall("Copy(const QVariant&)", pWorkSheet->asVariant());     }     // for迴圈流程相容儲存單個和全部報告     for (int i = 0; i < m_pMainwindow->m_vecItemList.size(); i++)     {         if (m_bSaveAll)             emit SIGNAL_ItemSelected(i);   // 通知UI切換測試項,同步操作         // 1.修改sheet名稱         pWorkSheet = pWorkBook->querySubObject("WorkSheets(int)", i + 1);         pWorkSheet->dynamicCall("Select()");    // 必須先select當前sheet         pWorkSheet->setProperty("Name", m_pMainwindow->m_strCurrentItemName);         // 2.填寫測試基本資訊         int iRow = 2;         pWorkSheet->querySubObject("Cells(int,int)", iRow++, 2)->setProperty("Value", QDate::currentDate().toString("yyyy-MM-dd"));         pWorkSheet->querySubObject("Cells(int,int)", iRow++, 2)->setProperty("Value", QTime::currentTime().toString());         pWorkSheet->querySubObject("Cells(int,int)", iRow++, 2)->setProperty("Value", "user");         foreach (QString strInfo, m_listBaseInfo)             pWorkSheet->querySubObject("Cells(int,int)", iRow++, 3)->setProperty("Value", strInfo);         // 3.填寫測試項名稱和最終結果         iRow = 18;         pWorkSheet->querySubObject("Cells(int,int)", iRow, 1)->setProperty("Value", m_pMainwindow->m_strCurrentItemName);         pWorkSheet->querySubObject("Cells(int,int)", iRow, 2)->setProperty("Value", m_pMainwindow->m_vecItemList[m_pMainwindow->m_iCurrentItemIndex]->GetTestPassOrFail());         // 4.填寫靜態引數         iRow = 21;         int iCount = m_pMainwindow->ui->listStaticParams->count();         // 有需要手工輸入的靜態引數也寫進測試報告中         QVector vecUserParams;         if (m_pMainwindow->ui->doubleSpinBoxPower->isVisible())         {             QStringList listPower;             listPower.append(C_PARA_Power);             listPower.append(m_pMainwindow->ui->doubleSpinBoxPower->text());             vecUserParams.push_back(listPower);             iCount++;         }         if (m_pMainwindow->ui->doubleSpinBoxFrequency->isVisible())         {             QStringList listFreq;             listFreq.append(C_PARA_Freq);             listFreq.append(m_pMainwindow->ui->doubleSpinBoxFrequency->text());             vecUserParams.push_back(listFreq);             iCount++;         }         for (int i = 0; i < iCount; i++)         {             QStringList listParam;             if (i < m_pMainwindow->ui->listStaticParams->count())                 listParam = m_pMainwindow->ui->listStaticParams->item(i)->text().split("=");   // 靜態引數框控制元件中的內容             else                 listParam = vecUserParams[i - m_pMainwindow->ui->listStaticParams->count()];   // 手工輸入的引數             if (i > 0)             {                 // 除了第一行,每次都要複製前一行再插入一行,因為報告模板中有第一行的模板                 QAxObject* pRow = pWorkSheet->querySubObject("Rows(int)", iRow);                 pRow->dynamicCall("Select()");                 pRow->dynamicCall("Copy()");                 pRow = pWorkSheet->querySubObject("Rows(int)", ++iRow);                 pRow->dynamicCall("Select()");                 pRow->dynamicCall("Insert()");             }             pWorkSheet->querySubObject("Cells(int,int)", iRow, 1)->setProperty("Value", listParam[0]);             pWorkSheet->querySubObject("Cells(int,int)", iRow, 2)->setProperty("Value", listParam[1]);         }         // 5.填寫結果列表         iRow += 3;         for (int i = 0; i < m_pMainwindow->ui->tableResult->rowCount(); i++)         {             if (i > 0)             {                 // 除了第一行,每次都要複製前一行再插入一行,因為報告模板中有第一行的模板                 QAxObject* pRow = pWorkSheet->querySubObject("Rows(int)", iRow);                 pRow->dynamicCall("Select()");                 pRow->dynamicCall("Copy()");                 pRow = pWorkSheet->querySubObject("Rows(int)", ++iRow);                 pRow->dynamicCall("Select()");                 pRow->dynamicCall("Insert()");             }             if (m_pMainwindow->ui->tableResult->item(i, 0) != NULL)                 pWorkSheet->querySubObject("Cells(int,int)", iRow, 1)->setProperty("Value", m_pMainwindow->ui->tableResult->item(i, 0)->text());             if (m_pMainwindow->ui->tableResult->item(i, 1) != NULL)                 pWorkSheet->querySubObject("Cells(int,int)", iRow, 2)->setProperty("Value", m_pMainwindow->ui->tableResult->item(i, 1)->text());             if (m_pMainwindow->ui->tableResult->item(i, 2) != NULL)                 pWorkSheet->querySubObject("Cells(int,int)", iRow, 3)->setProperty("Value", m_pMainwindow->ui->tableResult->item(i, 2)->text());             if (m_pMainwindow->ui->tableResult->item(i, 3) != NULL)                 pWorkSheet->querySubObject("Cells(int,int)", iRow, 4)->setProperty("Value", m_pMainwindow->ui->tableResult->item(i, 3)->text());             if (m_pMainwindow->ui->tableResult->item(i, 4) != NULL)                 pWorkSheet->querySubObject("Cells(int,int)", iRow, 5)->setProperty("Value", m_pMainwindow->ui->tableResult->item(i, 4)->text());             if (m_pMainwindow->ui->tableResult->item(i, 5) != NULL)                 pWorkSheet->querySubObject("Cells(int,int)", iRow, 6)->setProperty("Value", m_pMainwindow->ui->tableResult->item(i, 5)->text());         }         // 6.插入成功率圖         iRow += 2;         QString strImagePath = QDir::toNativeSeparators(QCoreApplication::applicationDirPath() + "/pic.png"); // 必須把路徑中的'/'轉換成'\\'         emit SIGNAL_ExportPicture(strImagePath);   // 通知UI執行緒儲存成功率圖片,同步操作         if (QFile::exists(strImagePath))         {             QImage image(strImagePath);             double dRowHeight = pWorkSheet->querySubObject("Cells(int,int)", iRow, 1)->property("Height").toDouble();   // 每一行的高度,單位磅             double width = image.width() * 0.75;       // 圖片相對於左上角偏移的寬度,單位磅             double height = image.height() * 0.75;     // 圖片相對於左上角偏移的高度,單位磅             QAxObject* pShapes = pWorkSheet->querySubObject("Shapes");             pShapes->dynamicCall("AddPicture(QString&,bool,bool,double,double,double,double)", strImagePath, false, true, 0, iRow * dRowHeight, width, height);             QFile::remove(strImagePath);         }         // 調整列寬         QAxObject* pAllCells = pWorkSheet->querySubObject("Cells()");         pAllCells->dynamicCall("Select()");         pAllCells->querySubObject("EntireColumn()")->dynamicCall("AutoFit()");         pWorkSheet->querySubObject("Cells(int,int)", 1, 1)->dynamicCall("Select()");    // 預設選中第一個單元格         if (!m_bSaveAll)             break;     }     // 預設選中第一個sheet     pWorkSheet = pWorkBook->querySubObject("WorkSheets(int)", 1);     pWorkSheet->dynamicCall("Select()");     // 另存為測試報告檔案     QString ReportPath = QDir::toNativeSeparators(QCoreApplication::applicationDirPath());  // 必須把路徑中的'/'轉換成'\\'     if (m_bSaveAll)         ReportPath += "\\TestReport_All.xlsx";     else         ReportPath += "\\TestReport_" + m_pMainwindow->m_strCurrentItemName + ".xlsx";     pWorkBook->dynamicCall("SaveAs(const QString&)", ReportPath);     pWorkBook->dynamicCall("Close()");     pWorkBooks->dynamicCall("Close()");     delete pExcelApp;     pExcelApp = NULL; }

相關推薦

Qt操作Excel

#include #include #include #include #include int main(int argc, char *argv[]) {     //QCoreApplication a(argc, argv);     // 在後臺執行緒中使用QAxObject必須先初始化    

Python操作Excel、異常處理、網絡編程

方法 ssi request 對象的引用 深拷貝 code text 索引超出 編號 知識補充: 1.falsk模塊中一些方法總結 import flask from flask import request,jsonify server = flask.Flask(_

Python操作excel

多少 單元格 原來 for in lin 一行 line 拷貝 index 一、寫excel import xlwt book=xlwt.Workbook() #創建excel sheet=book.add_sheet(‘sheet1‘) #加一個sheet

python3 接口測試數據驅動操作 excel 文件

驅動 新建 格式化 地址 The turn ply option 推薦 18.4 操作 excel 文件 Python 中一般使用 xlrd 庫來讀取 Excel 文件, xlrd 庫是 Python 的第三方庫。 18.4.1 xlrd 庫安裝 Xlrd 庫跟其他第

Qt操作資料庫(SQLite)例項

QtSql模組提供了與平臺以及資料庫種類無關的訪問SQL資料庫的介面,這個介面由利用Qt的模型檢視結構將資料庫與使用者介面整合的一套類來支援。 QSqlDatabase物件象徵了資料庫的關聯。Qt使用驅動程式與各種資料庫的應用程式設計介面進行通訊。Qt的桌面版(Deskto

VB操作excel後不能關閉excel程序的原因及解決方法

一、問題: 使用如下程式碼開啟、取值及關閉excel: Public Function ImportFromExcel(excelFile As String) As Long Dim xlApp As Excel.Application Dim xlBook As Ex

Qt批量操作Excel

最近在做一個專案,客戶要求把查詢到的資料匯出Excel,而網上大部分資料描述的都很侷限、很簡單。 由於要匯出的資料量很大(QTableView中大約有幾十萬條資料),一開始我是找到一個單元格就寫入一個值,但這樣的話程式就會把大量的時間花費線上程切換中,導致效率太低(5000

Qt QAxObject操作excel檔案過程總結

最近由於需要Qt來操作Excel檔案,所以想把QAxObject用起來,此次使用也是機緣巧合,記錄了一下心路歷程。 此前走了很多彎路,希望做同樣事情的人就別糾纏於同樣的錯誤就好。 配製方面: 1、確保Excel軟體在本地伺服器註冊成功,沒註冊成功的可以通過 在執行中"E:\

Java操作ExcelPOI簡單例子

comm last pre cto ada tabs cnblogs encrypted hssf 21 /** 22 * 利用POI操作Excel表單 23 * 24 * 需要jar包: 25 * HSSF針對03及以前版本,即.xls後綴

python編程賦值和拷貝的區別概述及操作excel數據庫(圖)

may 格式 work val 原子 註意 更遠 當我 就是 python編程之賦值和拷貝的區別概述及操作excel數據庫(圖)一、賦值在Python中,對象的賦值就是簡單的對象引用,這點和C++不同,如下所示:a = [1,2,”hello”,[‘python’, ‘C+

QTINI檔案和登錄檔操作方法學習筆記

INI檔案格式 節[section] 引數(KEY/VALUE)   name=value 註釋 註釋使用分號表示(;)。在分號後面的文字,直到該行結尾都全部為註釋 QCoreApplication::applicationDirPath()為應用程式當前的絕

QT操作Excel學習記錄

1、QAxBase是一個提供用來初始化和訪問COM物件和Active空間的API抽閒類; 2、QAxObject是一個包裝了COM物件的QObject。 3、QAxWidget是一個包裝了ActiveX控制元件的QWidget。 4、QAxScriptManager /QAxScri

vbs excel 使用VBScript 操作excel

開啟excel及新建工作薄 '' 2. Method ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' 2.1 CreateObject Method ' 語

python操作Excel檔案openpyxl

安裝和配置 安裝openpyxl模組: pip install openpyxl 若想使用插入圖片的功能: pip install pillow 知識點講解 workbook 工作薄:一個Excel 檔案是一個工作薄 worksheet 工作表:一個工作薄

qtmysql增、刪、改、查、基本操作--------實現一個註冊登陸功能。

專案描述:實現一個登入介面,登入成功後切換到另一個介面。 登入介面實現的功能有: 1. qt連線mysql建立表.2。註冊賬號,往mysql表裡面新增賬號和密碼。實現登入功能。 另外一個介面實現的功能有: 1.刪​​除mysql資料庫的資料.2。查詢資料庫內容。

qt實現一個登陸介面-------------------qtmysql增、刪、改、查、基本操作

https://www.cnblogs.com/baimt/p/5688517.html安裝的MySQL的的步驟可以參考該博主的文章。 專案描述:實現一個登入介面,登入成功後切換到另一個介面。 登入介面實現的功能有: 1. qt連線mysql建立表.2。註冊賬號,往mysql表裡面新增賬

QT操作EXCEL

 介紹一下最基本的QT對EXCEL的讀寫操作。 宣告:轉載於:http://blog.csdn.net/czyt1988/article/details/52121360   在使用QT的操作資料庫的時候,可能會出現(一般都會出現) #include<

poi操作excel: 將NUMERIC轉換成TEXT

沒辦法,企業業務系統總是避免不了要使用excel進行匯入和匯出,本程式碼使用的poi版本是3.16: 一、NUMERIC TO TEXT(生成excel) 程式碼生成一個excel檔案: public static void generateExc

jxl 操作Excel表格Sheet

      這篇文章主要是講工作表相關的操作,包括得到單元格、工作表的相關屬性等。 import java.io.*; import java.util.regex.Pattern; import jxl.*; import jxl.read.biff.BiffExcep

C#中NPOI操作excel讀取和寫入excel

一、下載引用 下載需要引用的dll,即:NPOI.dll,NPOI.OOXML.dll,NPOI.OpenXml4Net.dll,ICSharpCode.SharpZipLib.dll(offic