Qt之操作Excel

來源:互聯網
上載者:User

標籤:

  Visual Basic for Applications(VBA)是一種Visual Basic的一種宏語言,主要能用來擴充Windows的應用程式功能,特別是Microsoft Office軟體。也可說是一種應用程式視覺化的Basic Script。1994年發行的Excel 5.0版本中,即具備了VBA的宏功能。

    在VBA的參考手冊中就可以看到具體函數、屬性的用法,Qt操作Excel主要通過 QAxObject + Excel VBA來實現!    關於Qt對Excel的操作,網上的資料挺多的,但大多數都是比較基礎的,關於插入工作表(至最後一行)、刪除工作表、合并/拆分儲存格、設定儲存格背景色、設定儲存格邊框色、設定儲存格字型(類型、大小、加粗、斜體、底線、顏色等)、以及設定儲存格對齊等用法都沒有怎麼提到,今天就總結一下有關Qt對Excel的操作。    Qt操作Excel,無論尾碼是xls還是xlsx都可以。    如下,是我下載的一個Excel VBA參考手冊,內容不算太全!   Excel讀取         為了便於測試,假設已存在一個excel檔案,操作內容已經被紅色標記出來。如下所示:  主要讀取內容:
  • 標題
  • 工作表數目
  • 工作表名稱
  • 起始行
  • 起始列
  • 行數
  • 列數
  • 儲存格內容
 代碼如下: QAxObject excel("Excel.Application");  excel.setProperty("Visible", true);  QAxObject *work_books = excel.querySubObject("WorkBooks");  work_books->dynamicCall("Open (const QString&)", QString("E:/test.xlsx"));QVariant title_value = excel.property("Caption");  //擷取標題qDebug()<<QString("excel title : ")<<title_value;  QAxObject *work_book = excel.querySubObject("ActiveWorkBook");  QAxObject *work_sheets = work_book->querySubObject("Sheets");  //Sheets也可換用WorkSheets int sheet_count = 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)也可換用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_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");  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("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-")+QString::number(i, 10)+QString("-column-")+QString::number(j, 10)+QString(":");qDebug()<<message<<cell_value;  }  }  } 效果如下: 

Excel增、刪、改 主要操作:
  • 設定標題
  • 插入工作表(至最後一行)
  • 設定工作表名稱
  • 刪除工作表
  • 設定儲存格內容
  • 設定儲存格字型(類型、大小、加粗、斜體、底線、顏色等)
  • 設定儲存格對齊
  • 設定儲存格高度、寬度
  • 設定儲存格背景色、邊框色
  • 合并/拆分儲存格
  • 清空儲存格
代碼如下: QAxObject excel("Excel.Application");  excel.setProperty("Visible", true);  QAxObject *work_books = excel.querySubObject("WorkBooks");  work_books->dynamicCall("Open(const QString&)", "E:\\test.xlsx");excel.setProperty("Caption", "Qt Excel");QAxObject *work_book = excel.querySubObject("ActiveWorkBook");  QAxObject *work_sheets = work_book->querySubObject("Sheets");  //Sheets也可換用WorkSheets //刪除工作表(刪除第一個)QAxObject *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)", 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");  //設定工作表名稱 //操作儲存格(第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", 30);  //設定儲存格列寬cell->setProperty("HorizontalAlignment", -4108); //靠左對齊(xlLeft):-4131  置中(xlCenter):-4108  靠右對齊(xlRight):-4152cell->setProperty("VerticalAlignment", -4108);  //上對齊(xlTop)-4160 置中(xlCenter):-4108  下對齊(xlBottom):-4107cell->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 = 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_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 = work_sheet->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");  //另存新檔另一個檔案 work_book->dynamicCall("Close(Boolean)", false);  //關閉檔案excel.dynamicCall("Quit(void)");  //退出 效果如下: 操作前:  操作後:     到這裡很多人也許都在納悶,儲存格的宏怎麼擷取的?比如對齊(置中對齊),為什麼值是-4108,而不是其他值呢?當然那不是我隨便寫的,自己可以錄製宏,然後跟蹤。看: 如上所講,已經基本可以滿足常用的操作,如有更多專業需求,請參考Excel VBA...
  • Excel Object Model Reference.

Qt之操作Excel

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.