Qt下Excel操作_第1頁(yè)
Qt下Excel操作_第2頁(yè)
Qt下Excel操作_第3頁(yè)
Qt下Excel操作_第4頁(yè)
Qt下Excel操作_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Qt之操作Excel  (2013-12-06 13:57:20)轉(zhuǎn)載標(biāo)簽: qt qaxobject qt操作excel qtvba excelvba分類(lèi): Qt    Visual Basic for Applications(VBA)是一種Visual Basic的一種宏語(yǔ)言,主要能用來(lái)擴(kuò)展Windows的應(yīng)用程式功能,特別是Microsoft Office軟件。也可說(shuō)是一種應(yīng)用程式視覺(jué)化的Basic Script。1994年發(fā)行的Excel 5.0版本中,即具備了VBA的宏功能

2、。    在VBA的參考手冊(cè)中就可以看到具體函數(shù)、屬性的用法,Qt操作Excel主要通過(guò) QAxObject + Excel VBA來(lái)實(shí)現(xiàn)!    關(guān)于Qt對(duì)Excel的操作,網(wǎng)上的資料挺多的,但大多數(shù)都是比較基礎(chǔ)的,關(guān)于插入工作表(至最后一行)、刪除工作表、合并/拆分單元格、設(shè)置單元格背景色、設(shè)置單元格邊框色、設(shè)置單元格字體(類(lèi)型、大小、加粗、斜體、下劃線、顏色等)、以及設(shè)置單元格對(duì)齊方式等用法都沒(méi)有怎么提到,今天就總結(jié)一下有關(guān)Qt對(duì)Excel的操作。   

3、60;Qt操作Excel,無(wú)論后綴是xls還是xlsx都可以。    如下,是我下載的一個(gè)Excel VBA參考手冊(cè),內(nèi)容不算太全!Excel讀取        為了便于測(cè)試,假設(shè)已存在一個(gè)excel文件,操作內(nèi)容已經(jīng)被紅色標(biāo)記出來(lái)。如下所示:主要讀取內(nèi)容:· 標(biāo)題· 工作表數(shù)目· 工作表名稱(chēng)· 起始行· 起始列· 行數(shù)· 列數(shù)· 單元格內(nèi)容代碼如下: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");  /獲取標(biāo)題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();  /獲取工作表數(shù)目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();  /獲取工作表名稱(chēng)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();  /獲取行數(shù)int column_count = columns->property(&qu

10、ot;Count").toInt();  /獲取列數(shù)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");  /獲取單元格內(nèi)容QString message = QString("row-&quo

11、t;)+QString:number(i, 10)+QString("-column-")+QString:number(j, 10)+QString(":");qDebug()<<message<<cell_value;      效果如下:Excel增、刪、改主要操作:· 設(shè)置標(biāo)題· 插入工作表(至最后一行)· 設(shè)置工作表名稱(chēng)· 刪除工作表· 設(shè)置單元格內(nèi)容· 設(shè)置單元格字體(類(lèi)型、大小、加粗、斜體、下劃線、顏色等)· 設(shè)置單元

12、格對(duì)齊方式· 設(shè)置單元格高度、寬度· 設(shè)置單元格背景色、邊框色· 合并/拆分單元格· 清空單元格代碼如下: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/刪除工作表(刪除第一個(gè))Q

14、AxObject *first_sheet = work_sheets->querySubObject("Item(int)", 1);first_sheet->dynamicCall("delete");/插入工作表(插入至最后一行)int sheet_count = work_sheets->property("Count").toInt();  /獲取工作表數(shù)目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");  /設(shè)置工作表名稱(chēng)/操作單元格(

16、第2行第2列)QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", 2, 2);cell->setProperty("Value", "Java C+ C# PHP Perl Python Delphi Ruby");  /設(shè)置單元格值cell->setProperty("RowHeight", 50);  /設(shè)置單元格行高cell->setProperty("ColumnWidth&quo

17、t;, 30);  /設(shè)置單元格列寬cell->setProperty("HorizontalAlignment", -4108); /左對(duì)齊(xlLeft):-4131  居中(xlCenter):-4108  右對(duì)齊(xlRight):-4152cell->setProperty("VerticalAlignment", -4108);  /上對(duì)齊(xlTop)-4160 居中(xlCenter):-4108  下對(duì)齊(xlBottom):-4107cell->setProperty

18、("WrapText", true);  /內(nèi)容過(guò)多,自動(dòng)換行/cell->dynamicCall("ClearContents()");  /清空單元格內(nèi)容QAxObject* interior = cell->querySubObject("Interior");interior->setProperty("Color", QColor(0, 255, 0);   /設(shè)置單元格背景色(綠色)QAxObject* border = cell->que

19、rySubObject("Borders"); border->setProperty("Color", QColor(0, 0, 255);   /設(shè)置單元格邊框色(藍(lán)色)QAxObject *font = cell->querySubObject("Font");  /獲取單元格字體font->setProperty("Name", QStringLiteral("華文彩云");  /設(shè)置單元格字體font->setP

20、roperty("Bold", true);  /設(shè)置單元格字體加粗font->setProperty("Size", 20);  /設(shè)置單元格字體大小font->setProperty("Italic", true);  /設(shè)置單元格字體斜體font->setProperty("Underline", 2);  /設(shè)置單元格下劃線font->setProperty("Color", QColor(255, 0, 0);  

21、;/設(shè)置單元格字體顏色(紅色)/設(shè)置單元格內(nèi)容,并合并單元格(第5行第3列-第8行第5列)QAxObject *cell_5_6 = work_sheet->querySubObject("Cells(int,int)", 5, 3);cell_5_6->setProperty("Value", "Java");  /設(shè)置單元格值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()");  /保存文件(為了對(duì)比test與下面的test2文件,這里不做保存操作) work_book->dynamicCall("SaveAs(const QString&)&

25、quot;, "E:test2.xlsx");  /另存為另一個(gè)文件 work_book->dynamicCall("Close(Boolean)", false);  /關(guān)閉文件excel.dynamicCall("Quit(void)");  /退出效果如下:操作前:操作后:    到這里很多人也許都在納悶,單元格的宏怎么獲取的?比如對(duì)齊方式(居中對(duì)齊),為什么值是-4108,而不是其他值呢?當(dāng)然那不是我隨便寫(xiě)的,自己可以錄制宏,然后跟蹤??聪聢D

26、:如上所講,已經(jīng)基本可以滿足常用的操作,如有更多專(zhuān)業(yè)需求,請(qǐng)參考Excel VBA.· Excel Object Model Reference. 最近寫(xiě)程序中需要將數(shù)據(jù)輸出保存到Excel文件中。翻看C+ GUI Programming with Qt 4(Second Edition)發(fā)現(xiàn)可以在Qt中運(yùn)用ActiveX控件,這真是太好了。        看了很久教程也沒(méi)有學(xué)會(huì),畢竟是新手,平時(shí)也沒(méi)學(xué)過(guò)ActiveX編程。一些在VB中可以方便使用的函數(shù)在Qt中都沒(méi)法兒運(yùn)行。網(wǎng)上的方法也很多解決不了問(wèn)題,還會(huì)報(bào)錯(cuò)。也許是版本問(wèn)題吧,Q

27、t都更新了好幾次了。所以只好自己多試幾次。經(jīng)過(guò)摸索我的方法如下:首先在.pro文件中添加CONFIG += qaxcontainer接著程序?qū)崿F(xiàn)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那么在關(guān)閉是會(huì)出現(xiàn)類(lèi)似“文件已修改,是否保存”的

30、提示  7.   8.         QAxObject *workbooks = excel->querySubObject("WorkBooks");/獲取工作簿集合  9.         workbooks->dynamicCall("Add");/新建一個(gè)工作簿  

31、10.         QAxObject *workbook = excel->querySubObject("ActiveWorkBook");/獲取當(dāng)前工作簿  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);/設(shè)置要操作的單元格,如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();/設(shè)置單元格的值  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將路徑中的"/"轉(zhuǎn)換為"",不然一定保存不了。 &#

38、160;24.         workbook->dynamicCall("Close()");/關(guān)閉工作簿  25.         excel->dynamicCall("Quit()");/關(guān)閉excel  26.         delete excel;  

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論