1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 【QT】word文档操作实例——根据word模板生成word报表

【QT】word文档操作实例——根据word模板生成word报表

时间:2024-06-12 05:20:09

相关推荐

【QT】word文档操作实例——根据word模板生成word报表

文章目录

引言一、word模板准备二、WordDemo实现1、mainwindow.ui2、mainwindow.h3、mainwindow.cpp 三、实现效果

引言

在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_NAMESPACEnamespace Ui {class MainWindow; }QT_END_NAMESPACEclass MainWindow : public QMainWindow{Q_OBJECTpublic: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。

如果对您有帮助可以点赞、收藏、关注,将会是我最大的动力 ↩︎

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。