




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Qt之操作Excel (2013-12-06 13:57:20)轉載標簽: qt qaxobject qt操作excel qtvba excelvba分類: Qt Visual Basic for Applications(VBA)是一種Visual Basic的一種宏語言,主要能用來擴展Windows的應用程式功能,特別是Microsoft Office軟件。也可說是一種應用程式視覺化的Basic Script。1994年發行的Excel 5.0版本中,即具備了VBA的宏功能
2、。 在VBA的參考手冊中就可以看到具體函數、屬性的用法,Qt操作Excel主要通過 QAxObject + Excel VBA來實現! 關于Qt對Excel的操作,網上的資料挺多的,但大多數都是比較基礎的,關于插入工作表(至最后一行)、刪除工作表、合并/拆分單元格、設置單元格背景色、設置單元格邊框色、設置單元格字體(類型、大小、加粗、斜體、下劃線、顏色等)、以及設置單元格對齊方式等用法都沒有怎么提到,今天就總結一下有關Qt對Excel的操作。
3、60;Qt操作Excel,無論后綴是xls還是xlsx都可以。 如下,是我下載的一個Excel VBA參考手冊,內容不算太全!Excel讀取 為了便于測試,假設已存在一個excel文件,操作內容已經被紅色標記出來。如下所示:主要讀取內容:· 標題· 工作表數目· 工作表名稱· 起始行· 起始列· 行數· 列數· 單元格內容代碼如下:QAxObject excel("E
4、xcel.Application"); excel.setProperty("Visible", true); QAxObject *work_books = excel.querySubObject("WorkBooks"); work_books->dynamicCall("Open (const QString&)", QString("E:/test.xlsx");QVariant title_value = perty(&quo
5、t;Caption"); /獲取標題qDebug()<<QString("excel title : ")<<title_value; QAxObject *work_book = excel.querySubObject("ActiveWorkBook"); QAxObject *work_sheets = work_book->querySubObject("Sheets"); /Sheets也可換用WorkSheetsint sheet_co
6、unt = work_sheets->property("Count").toInt(); /獲取工作表數目qDebug()<<QString("sheet count : ")<<sheet_count; for(int i=1; i<=sheet_count; i+) QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", i); /Sheets(int)
7、也可換用Worksheets(int)QString work_sheet_name = work_sheet->property("Name").toString(); /獲取工作表名稱QString message = QString("sheet ")+QString:number(i, 10)+ QString(" name");qDebug()<<message<<work_sheet_name; if(sheet_count > 0)QAxObject *work
8、_sheet = work_book->querySubObject("Sheets(int)", 1); QAxObject *used_range = work_sheet->querySubObject("UsedRange"); QAxObject *rows = used_range->querySubObject("Rows"); QAxObject *columns = used_range->querySubObject("Columns"
9、); int row_start = used_range->property("Row").toInt(); /獲取起始行 int column_start = used_range->property("Column").toInt(); /獲取起始列int row_count = rows->property("Count").toInt(); /獲取行數int column_count = columns->property(&qu
10、ot;Count").toInt(); /獲取列數for(int i=row_start; i for(int j=column_start; j QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", i, j); QVariant cell_value = cell->property("Value"); /獲取單元格內容QString message = QString("row-&quo
11、t;)+QString:number(i, 10)+QString("-column-")+QString:number(j, 10)+QString(":");qDebug()<<message<<cell_value; 效果如下:Excel增、刪、改主要操作:· 設置標題· 插入工作表(至最后一行)· 設置工作表名稱· 刪除工作表· 設置單元格內容· 設置單元格字體(類型、大小、加粗、斜體、下劃線、顏色等)· 設置單元
12、格對齊方式· 設置單元格高度、寬度· 設置單元格背景色、邊框色· 合并/拆分單元格· 清空單元格代碼如下:QAxObject excel("Excel.Application"); excel.setProperty("Visible", true); QAxObject *work_books = excel.querySubObject("WorkBooks"); work_books->dynamicCall("Open(const QS
13、tring&)", "E:test.xlsx");excel.setProperty("Caption", "Qt Excel");QAxObject *work_book = excel.querySubObject("ActiveWorkBook"); QAxObject *work_sheets = work_book->querySubObject("Sheets"); /Sheets也可換用WorkSheets/刪除工作表(刪除第一個)Q
14、AxObject *first_sheet = work_sheets->querySubObject("Item(int)", 1);first_sheet->dynamicCall("delete");/插入工作表(插入至最后一行)int sheet_count = work_sheets->property("Count").toInt(); /獲取工作表數目QAxObject *last_sheet = work_sheets->querySubObject("Item(int)&
15、quot;, sheet_count);QAxObject *work_sheet = work_sheets->querySubObject("Add(QVariant)", last_sheet->asVariant();last_sheet->dynamicCall("Move(QVariant)", work_sheet->asVariant();work_sheet->setProperty("Name", "Qt Sheet"); /設置工作表名稱/操作單元格(
16、第2行第2列)QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", 2, 2);cell->setProperty("Value", "Java C+ C# PHP Perl Python Delphi Ruby"); /設置單元格值cell->setProperty("RowHeight", 50); /設置單元格行高cell->setProperty("ColumnWidth&quo
17、t;, 30); /設置單元格列寬cell->setProperty("HorizontalAlignment", -4108); /左對齊(xlLeft):-4131 居中(xlCenter):-4108 右對齊(xlRight):-4152cell->setProperty("VerticalAlignment", -4108); /上對齊(xlTop)-4160 居中(xlCenter):-4108 下對齊(xlBottom):-4107cell->setProperty
18、("WrapText", true); /內容過多,自動換行/cell->dynamicCall("ClearContents()"); /清空單元格內容QAxObject* interior = cell->querySubObject("Interior");interior->setProperty("Color", QColor(0, 255, 0); /設置單元格背景色(綠色)QAxObject* border = cell->que
19、rySubObject("Borders"); border->setProperty("Color", QColor(0, 0, 255); /設置單元格邊框色(藍色)QAxObject *font = cell->querySubObject("Font"); /獲取單元格字體font->setProperty("Name", QStringLiteral("華文彩云"); /設置單元格字體font->setP
20、roperty("Bold", true); /設置單元格字體加粗font->setProperty("Size", 20); /設置單元格字體大小font->setProperty("Italic", true); /設置單元格字體斜體font->setProperty("Underline", 2); /設置單元格下劃線font->setProperty("Color", QColor(255, 0, 0);
21、;/設置單元格字體顏色(紅色)/設置單元格內容,并合并單元格(第5行第3列-第8行第5列)QAxObject *cell_5_6 = work_sheet->querySubObject("Cells(int,int)", 5, 3);cell_5_6->setProperty("Value", "Java"); /設置單元格值QAxObject *cell_8_5 = work_sheet->querySubObject("Cells(int,int)", 8, 5);cell_8_
22、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);
23、 /終止行QAxObject *merge_range = work_sheet->querySubObject("Range(const QString&)", merge_cell);merge_range->setProperty("HorizontalAlignment", -4108);merge_range->setProperty("VerticalAlignment", -4108);merge_range->setProperty("WrapText",
24、 true);merge_range->setProperty("MergeCells", true); /合并單元格/merge_range->setProperty("MergeCells", false); /拆分單元格/work_book->dynamicCall("Save()"); /保存文件(為了對比test與下面的test2文件,這里不做保存操作) work_book->dynamicCall("SaveAs(const QString&)&
25、quot;, "E:test2.xlsx"); /另存為另一個文件 work_book->dynamicCall("Close(Boolean)", false); /關閉文件excel.dynamicCall("Quit(void)"); /退出效果如下:操作前:操作后: 到這里很多人也許都在納悶,單元格的宏怎么獲取的?比如對齊方式(居中對齊),為什么值是-4108,而不是其他值呢?當然那不是我隨便寫的,自己可以錄制宏,然后跟蹤。看下圖
26、:如上所講,已經基本可以滿足常用的操作,如有更多專業需求,請參考Excel VBA.· Excel Object Model Reference. 最近寫程序中需要將數據輸出保存到Excel文件中。翻看C+ GUI Programming with Qt 4(Second Edition)發現可以在Qt中運用ActiveX控件,這真是太好了。 看了很久教程也沒有學會,畢竟是新手,平時也沒學過ActiveX編程。一些在VB中可以方便使用的函數在Qt中都沒法兒運行。網上的方法也很多解決不了問題,還會報錯。也許是版本問題吧,Q
27、t都更新了好幾次了。所以只好自己多試幾次。經過摸索我的方法如下:首先在.pro文件中添加CONFIG += qaxcontainer接著程序實現cpp view plaincopy1. QString filepath=QFileDialog:getSaveFileName(this,tr("Save orbit"),".",tr("Microsoft Office 2007 (*.xlsx)");/獲取保存路徑 2.
28、; if(!filepath.isEmpty() 3. QAxObject *excel = new QAxObject(this); 4. excel->setControl("Excel.Application");/連接Excel控件 5.
29、60; excel->dynamicCall("SetVisible (bool Visible)","false");/不顯示窗體 6. excel->setProperty("DisplayAlerts", false);/不顯示任何警告信息。如果為true那么在關閉是會出現類似“文件已修改,是否保存”的
30、提示 7. 8. QAxObject *workbooks = excel->querySubObject("WorkBooks");/獲取工作簿集合 9. workbooks->dynamicCall("Add");/新建一個工作簿
31、10. QAxObject *workbook = excel->querySubObject("ActiveWorkBook");/獲取當前工作簿 11. QAxObject *worksheets = workbook->querySubObject("Sheets")
32、;/獲取工作表集合 12. QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);/獲取工作表集合的工作表1,即sheet1 13. QAxObject *cellX,*cellY; 14.
33、0; for(int i=0;i<curRow;i+) 15. QString X="A"+QString:number(i+1);/設置要操作的單元格,如A1 16.
34、60; QString Y="B"+QString:number(i+1); 17. cellX = worksheet->querySubObject("Range(QVariant, QVariant)",X);/獲取單元格 18.
35、60; cellY = worksheet->querySubObject("Range(QVariant, QVariant)",Y); 19. cellX->dynamicCall("SetValue(const QVariant&)",QVariant(ui
36、->tableWidget->formula(i,0).toInt();/設置單元格的值 20. cellY->dynamicCall("SetValue(const QVariant&)",QVariant(ui->tableWidget->formula(i,1).toInt(); 21.
37、 22. 23. workbook->dynamicCall("SaveAs(const QString&)",QDir:toNativeSeparators(filepath);/保存至filepath,注意一定要用QDir:toNativeSeparators將路徑中的"/"轉換為"",不然一定保存不了。
38、160;24. workbook->dynamicCall("Close()");/關閉工作簿 25. excel->dynamicCall("Quit()");/關閉excel 26. delete excel;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 41780.3-2025物聯網邊緣計算第3部分:節點接口要求
- 港口城市規劃和發展考核試卷
- 砼構件預制件生產質量控制考核試卷
- 礦山法律法規解讀考核試卷
- 包裝設備的虛擬現實培訓考核試卷
- 漁業機械的設計優化與生產效率提升考核試卷
- 電機在農業植保機械的應用考核試卷
- 皮革服裝設計中的功能性產品開發考核試卷
- 木結構建筑的日照與采光分析考核試卷
- 海水養殖智能化與自動化技術考核試卷
- 上市公司固定資產減值研究 -以美的集團股份有限公司為例
- DB14T+2779-2023營造林工程監理規范
- 運動會運營服務投標方案(技術標 )
- 雷達原理(第6版) 習題及答案匯總 丁鷺飛 ch01-ch09
- 完整版供應商質量審核檢查評分表(供應商審核表)
- 公司接待流程圖
- 常用急救技術-環甲膜穿刺、切開術(急救技術課件)
- 新團員入團儀式PPT模板
- 鐵粒幼細胞貧血教學課件
- 土木工程畢業設計計算書(含建筑設計+結構設計+設計圖紙)
- 02jrc901b電子海圖操作jan中文說明書
評論
0/150
提交評論