鏈接地址:【QT】word文檔操作實例——根據word模板生成word報表
引言
在QT5.3中,在.pro使用的是:QT += widgets gui axcontainer 來使用ActiveQt框架中的QAxContainer模塊(Qt4版本添加Qt += qaxcontainer)=),所以在項目在頭文件中包含QAxWidget和QAxObject。
簡單介紹ActiveQt框架由兩個模塊組成:
QAxContainer模塊允許我們使用COM對象並且可以在Qt應用程序中嵌入QActive控件。
QAxServer模塊允許我們導出使用Qt編寫的自定義的COM對象和Active控件。
一、word模板准備
模板的准備至關重要,而其中更重要的是模板中書簽的設置命名,因為接下來的程序代碼中,程序就是根據書簽的名字,來定位word文檔中的位置,從而進行數據的插入修改
當設計好表格,並且設計好書簽的名稱,便將文檔保存為 .dot格式
二、WordDemo實現
代碼中都有詳盡的注釋
1、mainwindow.ui
2、mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void init_UI(); //初始化界面函數
void clear_UI(); //重置界面函數
private slots:
void reshow(); //重置界面的槽函數
void create_word(); //創建報表的槽函數
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
3、mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QAxObject>
#include <QAxWidget>
#include <QMessageBox>
#include <QFileDialog>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
init_UI();
connect(ui->btu_create,SIGNAL(clicked(bool)),this,SLOT(create_word()));
connect(ui->btu_create,SIGNAL(clicked(bool)), this, SLOT(reshow()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::create_word()
{
//新建一個word應用程序
QAxWidget *word = new QAxWidget("Word.Application",0,Qt::MSWindowsOwnDC);
//並設置為不可見
word->setProperty("Visible",false);
//獲取所有的工作文檔
QAxObject *documents = word->querySubObject("Documents");
//以test2.dot為模板新建一個文檔
documents->dynamicCall("Add(QString)",QString::fromLocal8Bit("E:/MyQtWorkSpace/Word/test2.dot"));
//獲取當前激活的文檔
QAxObject *document = word->querySubObject("ActiveDocument");
/********修改一個位置的內容*********/
//獲取文檔中名字為equ的標簽
QAxObject *bookmark_equ = document->querySubObject("Bookmarks(QVariant)","equ");
//選中標簽,將字符textg插入到標簽位置
if(!bookmark_equ->isNull())
{
QString sText=ui->lineEdit_equ->text(); //此處為替換內容
qDebug()<<sText;
bookmark_equ->dynamicCall("Select(void)"); //選中要選中的區域
bookmark_equ->querySubObject("Range")->setProperty("Text",sText); //進行替換操作
}
/********修改一個位置的內容*********/
//獲取文檔中名字為temp的標簽
QAxObject *bookmark_temp = document->querySubObject("Bookmarks(QVariant)","temp");
//選中標簽,將字符textg插入到標簽位置
if(!bookmark_equ->isNull())
{
QString pText=ui->lineEdit_temp->text(); //此處為替換內容
bookmark_temp->dynamicCall("Select(void)"); //選中要選中的區域
bookmark_temp->querySubObject("Range")->setProperty("Text",pText); //進行替換操作
}
/********修改一個位置的內容*********/
//獲取文檔中名字為bas的標簽
QAxObject *bookmark_bas = document->querySubObject("Bookmarks(QVariant)","bas");
//選中標簽,將字符textg插入到標簽位置
if(!bookmark_equ->isNull())
{
QString bText=ui->lineEdit_bas->text(); //此處為替換內容
bookmark_bas->dynamicCall("Select(void)"); //選中要選中的區域
bookmark_bas->querySubObject("Range")->setProperty("Text",bText); //進行替換操作
}
qDebug()<<"方法";
//修改word中的表格
QString sheethead = "序號";
for(int j=1;j<=4;j++)
{
QString addrowhead=QString("%1").arg(j);
QString sheetheadnumber = QString("%1%2").arg(sheethead).arg(addrowhead);
qDebug()<<sheetheadnumber;
QAxObject *sheethead = document->querySubObject("Bookmarks(QVariant)",sheetheadnumber);
QString sheettexthead=ui->tableWidget->item(j-1,0)->text(); //此處為替換內容
sheethead->dynamicCall("Select(void)"); //選中要選中的區域
sheethead->querySubObject("Range")->setProperty("Text",sheettexthead); //進行替換操作
}
QString sheetfrist = "數據";
for(int i=1;i<=4;i++)
{
for(int j=1;j<5;j++)
{
QString addrow=QString("%1").arg(i);
QString addcolum=QString("%1").arg(j);
QString sheetlabel = QString("%1%2%3").arg(sheetfrist).arg(addrow).arg(addcolum);
qDebug()<<sheetlabel;
QAxObject *sheetdata = document->querySubObject("Bookmarks(QString)",sheetlabel);
QString sheettext=ui->tableWidget->item(i-1,j)->text(); //此處為替換內容,必須要加入.text().這樣返回值才會正確
sheetdata->dynamicCall("Select(void)"); //選中要選中的區域
sheetdata->querySubObject("Range")->setProperty("Text",sheettext); //進行替換操作
}
}
//將文件保存為doc,同樣可以生成docx文檔
QString pathsave = QFileDialog::getSaveFileName(this,"Save","../","word(*doc)");
if(pathsave.isEmpty()==true)
{
return;
}
document->dynamicCall("SaveAs(const QString&))",QDir::toNativeSeparators(pathsave));
document->dynamicCall("Close (boolean)",false);
word->dynamicCall("Quit()");
QMessageBox::warning(this,"完成","文件已經保存",QMessageBox::Yes);
}
void MainWindow::init_UI()
{
int col = 5;
int row = 4;
ui->tableWidget->setColumnCount(col);
ui->tableWidget->setRowCount(row);
QStringList header; //表頭寫入表格
header <<QString::fromUtf8("序號")
<<QString::fromUtf8("測試數據1")<<QString::fromUtf8("測試數據2")
<<QString::fromUtf8("測試數據3")<<QString::fromUtf8("測試數據4");
ui->tableWidget->setHorizontalHeaderLabels(header);
ui->tableWidget->horizontalHeader()->setStretchLastSection(true); //自動調整寬度
ui->tableWidget->verticalHeader()->hide();
QString num[4]={"1","2","3","4"};
for(int i=0;i<row;i++) //序號填充
{
ui->tableWidget->setItem(i,0,new QTableWidgetItem(num[i]));
}
QString data[4][4]={{"5","7","8","6"},
{"4","6","5","9"},
{"7","5","5","6"},
{"8","3","4","6"}};
for(int i=0;i<4;i++) //隨機數據填充
{
for(int j=1;j<5;j++)
{
ui->tableWidget->setItem(i,j,new QTableWidgetItem(data[i][j]));
}
}
}
void MainWindow::clear_UI()
{
ui->lineEdit_bas->clear();
ui->lineEdit_equ->clear();
ui->lineEdit_temp->clear();
}
void MainWindow::reshow()
{
clear_UI();
this->show();
}
三、實現效果
修改數據
點擊生成
點擊保存
點擊Yes
完成效果
如有不足之處,還望指正 [1]。
如果對您有幫助可以點贊、收藏、關注,將會是我最大的動力 ↩︎