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