QT学习:Qt对Office的基本读写
Excel軟件具有完善的電子表格處理和計算功能,可在表格特定行列的 單元格上定義公式,對其中的數據進行批量運算處理,用Qt操作Excel 可輔助執行大量原始數據的計算功能,巧妙地借助單元格的運算功能 就能極大地減輕Qt程序本身的計算負擔。Word是最為常用的辦公軟 件,很多日常工作資料都是以Word文檔格式保存的。用Qt既可以對 Word中的文字也可以對表格中的信息進行讀寫。
下面通過一個例子詳細講解Qt對Excel和Word 的基本讀寫操作。
一、程序界面
創建一個Qt桌面應用程序項目,項目名稱為OfficeHello,為了方便對比Qt對兩種不同類型文檔的 操作,設計程序界面,Qt對Office基本讀寫程序界面如圖所示:
分別用兩個分組框(QGroupBox)演示對相同文字內容的讀寫功能。界面上各控件我們都用數字序號 ①,②,③,…標注,其名稱、類型及屬性設置見下圖:
二、全局變量及方法
為了提高程序代碼的使用效率,通常建議將程序中公用的Office對象的句柄聲明為全局變量,定義在項目.h頭文件中。 后面實現具體讀寫功能的代碼皆在 mainwindow.cpp源文件中。
mainwindow.h頭文件的代碼如下: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QMessageBox> #include <QAxObject> //訪問Office對象類 namespace Ui { class MainWindow; } class MainWindow : public QMainWindow {Q_OBJECT public:explicit MainWindow(QWidget *parent = 0);~MainWindow(); private slots:void on_writeExcelPushButton_clicked(); //寫Excel按鈕單擊事件槽void on_readExcelPushButton_clicked(); //讀Excel按鈕單擊事件槽void on_writeWordPushButton_clicked(); //寫Word按鈕單擊事件槽void on_readWordPushButton_clicked(); //讀Word按鈕單擊事件槽 private:Ui::MainWindow *ui;QAxObject *myexcel; //Excel應用程序指針QAxObject *myworks; //工作簿集指針QAxObject *workbook; //工作簿指針QAxObject *mysheets; //電子表格集指針//QAxObject *myword; //Word應用程序指針QAxObject *mydocs; //文檔集指針QAxObject *document; //文檔指針QAxObject *paragraph; //文本段指針 }; #endif // MAINWINDOW_H三、對Excel的讀寫
對電子表格的基本讀寫,在構造方法中添加如下代碼:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); myexcel = new QAxObject("Excel.Application"); myworks = myexcel->querySubObject("WorkBooks"); //獲取工作簿集 myworks->dynamicCall("Add"); //添加工作簿 workbook = myexcel->querySubObject("ActiveWorkBook"); //獲取當前活動工作簿 mysheets = workbook->querySubObject("Sheets"); //獲取電子表格集 }寫Excel的事件方法代碼:
void MainWindow::on_writeExcelPushButton_clicked() { mysheets->dynamicCall("Add"); //添加一個表 QAxObject *sheet = workbook->querySubObject("ActiveSheet"); //指向當前活動表格 sheet->setProperty("Name", "我愛Qt"); //給表格命名 QAxObject *cell = sheet->querySubObject("Range(QVariant, QVariant)", "C3"); //指向C3單元格 QString inStr = ui->InExcelLineEdit->text(); cell->dynamicCall("SetValue(const QVariant&)", QVariant(inStr)); //向單元格寫入內容 sheet = mysheets->querySubObject("Item(int)", 2); //指向第二個表格 sheet->setProperty("Name", "Hello Qt"); cell = sheet->querySubObject("Range(QVariant, QVariant)", "B5"); cell->dynamicCall("SetValue(const QVariant&)", QVariant("Hello!I love Qt.")); workbook->dynamicCall("SaveAs(const QString&)", "d:\\Qt\\office\\我愛 Qt5.xls"); //保存Excel workbook->dynamicCall("Close()"); myexcel->dynamicCall("Quit()"); QMessageBox::information(this, tr("完畢"), tr("Excel工作表已保存。")); ui->writeExcelPushButton->setEnabled(false); ui->readExcelPushButton->setEnabled(true); }讀Excel的事件方法代碼:
void MainWindow::on_readExcelPushButton_clicked() { myexcel = new QAxObject("Excel.Application"); myworks = myexcel->querySubObject("WorkBooks"); myworks->dynamicCall("Open(const QString&)", "d:\\Qt\\office\\我愛 Qt5.xls"); //打開Excel workbook = myexcel->querySubObject("ActiveWorkBook"); mysheets = workbook->querySubObject("WorkSheets"); QAxObject *sheet = workbook->querySubObject("Sheets(int)", 1); QAxObject *cell = sheet->querySubObject("Range(QVariant, QVariant)", "C3"); QString outStr = cell->dynamicCall("Value2()").toString();//讀出C3單元格內容 ui->OutExcelLabel->setText(outStr); sheet = workbook->querySubObject("Sheets(int)", 2); //定位到第二張表 cell = sheet->querySubObject("Range(QVariant, QVariant)", "B5"); outStr = cell->dynamicCall("Value2()").toString(); //讀出B5單元格內容 workbook->dynamicCall("Close()"); myexcel->dynamicCall("Quit()"); QMessageBox::information(this, tr("消息"), outStr); ui->writeExcelPushButton->setEnabled(true); ui->readExcelPushButton->setEnabled(false); }程序運行后,單擊“寫入”按鈕,彈出消息框提示Excel工作表已保存,即說明界面文本框里的文字 “我愛最新的 Qt 5.11”已成功寫入Excel表格,為試驗英文語句的讀寫,程序在后臺還往Excel另一張表中 寫入了一句“Hello!I love Qt.”。寫入完成后,原“寫入”按鈕變為不可用,“讀出”按鈕則變為可用。 單擊“讀出”按鈕,標簽框中會輸出剛剛寫入保存的Excel單元格內容(“我愛最新的 Qt 5.11”),同時彈出消息框顯示另一句英文文本“Hello!I love Qt.”,如下圖所示:
該程序在計算機d:\Qt\office\路徑下生成了一個名為“我愛Qt5.xls”的Excel文件,打開后可看到之前 Qt寫入Excel表格的內容,如圖所示:
四、對Word的讀寫
用Qt對Word文檔進行最簡單的基本讀寫操作,在構造方法中添加代碼如下:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ... myword = new QAxObject("Word.Application"); mydocs = myword->querySubObject("Documents"); //獲取文檔集 mydocs->dynamicCall("Add(void)"); //添加一個文檔 document = myword->querySubObject("ActiveDocument"); //指向當前活動文檔 paragraph = myword->querySubObject("Selection"); //指向當前選中文本 }寫Word的事件方法代碼:
void MainWindow::on_writeWordPushButton_clicked() { QString inStr = ui->InWordLineEdit->text(); paragraph->dynamicCall("TypeText(const QString&)", inStr);//寫入從界面文本框獲取的文本 paragraph->dynamicCall("TypeText(const QVariant&)",QVariant("\nHello!I love Qt.")); //寫入指定的文本 document->dynamicCall("SaveAs(const QString&)","d:\\Qt\\office\\我愛 Qt5.doc"); //保存文檔 delete paragraph; paragraph = nullptr; document->dynamicCall("Close()"); myword->dynamicCall("Quit()"); QMessageBox::information(this, tr("完畢"), tr("Word文檔已保存。")); ui->writeWordPushButton->setEnabled(false); ui->readWordPushButton->setEnabled(true); }讀Word的事件方法代碼:
void MainWindow::on_readWordPushButton_clicked() { myword = new QAxObject("Word.Application"); mydocs = myword->querySubObject("Documents"); //獲取文檔集 mydocs->dynamicCall("Open(const QString&)","d:\\Qt\\office\\我愛 Qt5.doc"); //打開文檔 document = myword->querySubObject("ActiveDocument"); //指向活動文檔 paragraph = document->querySubObject("Range()"); //指向當前文本 QString outStr = paragraph->property("Text").toString();//讀出文本 ui->OutWordLabel->setText(outStr.split("H").at(0)); paragraph = document->querySubObject("Range(QVariant, QVariant)", 14, 30); outStr = paragraph->property("Text").toString(); delete paragraph; paragraph = nullptr; document->dynamicCall("Close()"); myword->dynamicCall("Quit()"); QmessageBox::information(this, tr("消息"), outStr); ui->writeWordPushButton->setEnabled(true); ui->readWordPushButton->setEnabled(false); }運行效果 與上面Excel讀寫操作類同,運行程序的輸出效果如圖所示:
該程序在計算機d:\Qt\office\路徑下生成了一個名為“我愛 Qt5.doc”的Word文檔,打開后可看到之前Qt寫入Word文檔中的文字,如下圖所示:
總結
以上是生活随笔為你收集整理的QT学习:Qt对Office的基本读写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT学习:AxWidget界面显示
- 下一篇: QT学习:多国语言国际化