1. 程式人生 > >Qt-Excel-vba筆記

Qt-Excel-vba筆記



VBA簡介

VBAVisual Basic for Application的縮寫,是一種應用程式自動化語音。所謂應用程式自動化,是指通過程式或者指令碼讓應用程式,例如讓Microsoft ExcelWord自動化完成一些工作。

VBA具有VB語言的大多數特徵和易用性,它最大特點就是將Excel作為開發平臺來開發應用程式,可以應用Excel的所有已有功能,例如資料處理、圖表繪製、資料庫連線、內建函式等等。

VBA開發環境

VBA整合開發環境(IDEIntegrated Development Environment)是進行VBA程式設計和程式碼編寫的地方,同一版本的Office

共享同一IDEVBA程式碼和Excel檔案是儲存在一起的,可以通過點選“工具——巨集——Visual Basic編輯器”開啟VBAIDE環境,進行程式設計和程式碼編寫。

Excel物件的主要層次結構

Application物件->Workbook物件->Worksheet物件->Range物件

QT操作Excel

使用QAxObject元件可以方便的使用Office套件的API,QAxObjectCOM物件進行了封裝,QAxObject派生自QAxBase,而QAxBase提供了一組API,該API通過IUnknown指標直接訪問COM物件,我們這裡講的Excel

也是一個COM物件,可以通過QAxObject來操作它。

新建一個excel

QAxObject*pApplication=NULL;

QAxObject*pWorkBooks=NULL;

QAxObject*pWorkBook=NULL;

QAxObject*pSheets=NULL;

QAxObject*pSheet=NULL;

voidnewExcel(constQString&fileName)

{

pApplication=newQAxObject();

pApplication->setControl("Excel.Application"

);//連線Excel控制元件

pApplication->dynamicCall("SetVisible(bool)",false);//false不顯示窗體

pApplication->setProperty("DisplayAlerts",false);//不顯示任何警告資訊。

pWorkBooks=pApplication->querySubObject("Workbooks");

QFilefile(fileName);

if(file.exists())

{

pWorkBook=pWorkBooks->querySubObject("Open(constQString&)",fileName);

}

else

{

pWorkBooks->dynamicCall("Add");

pWorkBook=pApplication->querySubObject("ActiveWorkBook");

}

pSheets=pWorkBook->querySubObject("Sheets");// 得到Sheets物件的指標

pSheet=pSheets->querySubObject("Item(int)",1);// 得到第一個sheet物件的指標

//pSheet=pSheets->querySubObject("Item(const QVariant)",QVariant(“AAA”));// 得到第一個sheet物件的指標}

}

增加1Worksheet(插入至最後一行)

voidappendSheet(constQString&sheetName)
{
int cnt = pSheets->querySubObject(“Item(int)”).toInt();// 獲取工作表數目
QAxObject*pLastSheet=pSheets->querySubObject("Item(int)",cnt);
pSheets->querySubObject("Add(QVariant)",pLastSheet->asVariant());
pSheet=pSheets->querySubObject("Item(int)",cnt);
pLastSheet->dynamicCall("Move(QVariant)",pSheet->asVariant());
pSheet->setProperty("Name",sheetName);
}

刪除1Worksheet

voiddeletedSheet(constQString&sheetName)
{

pSheet=pSheets->querySubObject("Item(const QVariant)",QVariant(sheetName));

pSheet->dynamicCall(“Delete”);

}

Excel單元格中寫入資料

voidsetCellValue(introw,intcolumn,constQString&value)
{
QAxObject*pRange=pSheet->querySubObject("Cells(int,int)",row,column);
pRange->dynamicCall("Value",value);
}

釋放Excel

void  freeExcel()

{
if(pApplication!=NULL)
{
pApplication->dynamicCall("Quit()");
deletepApplication;
pApplication=NULL;
}
}

 //獲取標題

QVarianttitle_value = excel.property("Caption");

//操作單元格(第2行第2列)

QAxObject *cell =work_sheet->querySubObject("Cells(int,int)", 2, 2);

//設定單元格值

cell->setProperty("Value","ABC");  

//設定單元格行高

cell->setProperty("RowHeight",50);

//設定單元格列寬

cell->setProperty("ColumnWidth",30);  

//左對齊(xlLeft):-4131  居中(xlCenter):-4108  右對齊(xlRight):-4152

cell->setProperty("HorizontalAlignment",-4108);

//上對齊(xlTop-4160 居中(xlCenter):-4108  下對齊(xlBottom):-4107

cell->setProperty("VerticalAlignment",-4108);  

 //內容過多,自動換行

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));

//自動儲存檔案

work_book->dynamicCall("Save()");

 //另存為另一個檔案

 work_book->dynamicCall("SaveAs(constQString&)", "E:\\test2.xlsx");

//關閉檔案

work_book->dynamicCall("Close(Boolean)",false);

//退出

excel.dynamicCall("Quit(void)"); 

//合併單元格
//mergeRange = sheet->querySubObject("Rows(int)", iRowCount);
mergeRange = sheet->querySubObject("Range(QVariant)",tr("A%1:L%2").arg(iRowCount).arg(iRowCount));
mergeRange->dynamicCall("Merge(QVariant)", "false");
//自動展開到合適寬度
QAxObject *autoFitRange = sheet->querySubObject("Columns(A:I)");
autoFitRange->dynamicCall("AutoFit");

void EvaExcel::ToExcel(char* strPath,const Result* pResult)

{

try

{

// 獲取一個Excel物件

//QAxWidget excel("Excel.Application");//Widgets must be created in the GUIthread

QAxObject excel("Excel.Application");

if(excel.isNull()) return;

// 得到Workbooks集合的指標

QAxObject* workbooks= excel.querySubObject("Workbooks");

if(workbooks == NULL ) return;

workbooks->dynamicCall(("Open(const QString&"),strPath);

excel.setProperty("Caption","QtExcel");

////新增一個新的工作簿

//workbooks->dynamicCall("Add");

//獲取當前工作簿

QAxObject* workbook= excel.querySubObject("ActiveWorkBook");

if(workbook == NULL ) return;

//得到Sheets物件的指標

QAxObject* sheets= workbook->querySubObject("Sheets");

if(sheets == NULL ) return;

//獲取工作表集合中的工作表,即sheet1

QAxObject* worksheet= sheets->querySubObject("Item(const QVariant &)",QVariant("Sheet1"));

if(worksheet == NULL ) return;

//設定sheet1工作為選中狀態

worksheet->dynamicCall("Select()");

//獲取起始行

QAxObject *used_range= worksheet->querySubObject("UsedRange");

QAxObject *rows= used_range->querySubObject("Rows");

int row_start = used_range->property("Row").toInt();

//獲取行數

int row_count = rows->property("Count").toInt();

worksheet->querySubObject("Rows(int)",1)->querySubObject("insert()");

worksheet->querySubObject("Rows(int)",2)->querySubObject("insert()");

worksheet->querySubObject("Rows(int)",3)->querySubObject("insert()");

worksheet->querySubObject("Rows(int)",4)->querySubObject("insert()");

worksheet->querySubObject("Range(