Qt:如何生成word报表

在工作学习中,有时会需要将采集的数据生成word报表的形式,如设备可靠性检测报告,检定报告等。

本文将主要陈述如何利用Qt生成word报表。

除去必要的代码,生成word报表还需要开发人员自己创建一个word模板,关于模板的样式,根据工程需要而定,只需要将文本需要替换的地方插入书签即可,关于word模板的设置后面会进行陈述。

  • UI界面展示

《Qt:如何生成word报表》

说明:

  1. 前界面的①实验设备②检测温度③鉴定依据均需要后期人员输入
  2. 右侧表格中的数值,是程序预设好的,模拟实际的数据采集(使用QTableWidget创建)

     

  • 程序说明

TableWidget部分(右侧表格创建过程)

void Widget::table()
{
    tablenet = new QTableWidget(this);//指定父对象
    tablenet->move(400,20);//设置表格在前UI中的位置
    tablenet->setRowCount(5);//行数
    tablenet->setColumnCount(7);//列数
    tablenet->resize(740,200);//表格的尺寸
    QStringList horheader;//设置表头
    horheader<<"序号"<<"测量数据1"<<"测量数据2"<<"测量数据3"<<"测量数据4"<<"测量数据5"<<"测量数据6";
    tablenet->setHorizontalHeaderLabels(horheader);//设置表头(横)
    tablenet->horizontalHeader()->setFixedHeight(30); //设置表头的高度为25
    tablenet->verticalHeader()->hide();
    for(int row=0;row<5;row++)//序号
    {
        tablenet->setItem( row,0,new QTableWidgetItem( number[row] ));
    }
    //随便插入一些数据
    for(int i=0;i<5;i++)
    {
        for(int j=1;j<7;j++)
        {
           tablenet->setItem(i,j,new QTableWidgetItem(data[i][j-1]));
           //qDebug()<<exsheet[i][j];
        }

    }
    //tablenet->setItem(3,3,new QTableWidgetItem(3));
    tablenet->show();

}

生成WORD报表

void Widget::on_pushButton_clicked()
{
    //QString path =QFileDialog::getOpenFileName(this,"打开","../","word(*doc)");
    QString path="C://Users//Administrator//Desktop//QT TEXT//words//new测试.doc";//路径从\改成//,此处为论文模板所在路径
    if(path.isEmpty()==false)
    {
           QFile file(path);
           QAxObject *words= new QAxObject(this);//定义一个指针
           words->setControl("word.Application");//指向com文件类型setControl
           words->setProperty("Visible",false);//设置是否提示或者显示对话框setProperty
           QAxObject *workbooks = words->querySubObject("Documents");//获取工作簿(excel文件)集合querySubObject
           workbooks->dynamicCall("Add(QString)", path);//链接到具体的文件dynamicCall
           //path至关重要,获取excel文件的路径
           //打开一个word文件,获取文档
           QAxObject *workbook = words->querySubObject("ActiveDocument");//获取word中已经有数值的区域querySubObject
           /********修改一个位置的内容*********/

           QString sLabel="设备";//此处必须为文档中被标记为书签的内容,下面语句的意思就是确定书签的位置:
           QAxObject *pBookmark = workbook->querySubObject("Bookmarks(QString)",sLabel);//找到活跃区域内的书签querySubObject
           //就是把书签内容直接给你替换了
           QString sText=ui->device->toPlainText();//此处为替换内容
           pBookmark->dynamicCall("Select(void)");//选中要选中的区域
           pBookmark->querySubObject("Range")->setProperty("Text",sText);//进行替换操作

           /********修改一个位置的内容*********/
           QString tLabel="温度";//此处必须为文档中被标记为书签的内容,下面语句的意思就是确定书签的位置:
           qDebug()<<"";
           QAxObject *tBookmarks = workbook->querySubObject("Bookmarks(QString)",tLabel);//找到活跃区域内的书签querySubObject
           qDebug()<<"";
           //就是把书签内容直接给你替换了
           QString tText=ui->temp->toPlainText();//此处为替换内容
           tBookmarks->dynamicCall("Select(void)");//选中要选中的区域
           tBookmarks->querySubObject("Range")->setProperty("Text",tText);//进行替换操作
\
           /********修改一个位置的内容*********/
           QString mLabelt="方法";//此处必须为文档中被标记为书签的内容,下面语句的意思就是确定书签的位置:
           QAxObject *mBookmarks = workbook->querySubObject("Bookmarks(QString)",mLabelt);//找到活跃区域内的书签querySubObject
           //就是把书签内容直接给你替换了
           QString mText=ui->method->toPlainText();//此处为替换内容
           mBookmarks->dynamicCall("Select(void)");//选中要选中的区域
           mBookmarks->querySubObject("Range")->setProperty("Text",mText);//进行替换操作*/
           qDebug()<<"方法";
           //半自动方式修改word中的表格
           QString sheetfrist = "数据";
           for(int i=1;i<6;i++)
           {
               for(int j=1;j<7;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 = workbook->querySubObject("Bookmarks(QString)",sheetlabel);
                   QString sheettext=tablenet->item(i-1,j)->text();//此处为替换内容,必须要加入.text().这样返回值才会正确
                   sheetdata->dynamicCall("Select(void)");//选中要选中的区域
                   sheetdata->querySubObject("Range")->setProperty("Text",sheettext);//进行替换操作
               }
           }

           QString sheethead = "序号";
               for(int j=1;j<6;j++)
               {
                   QString addrowhead=QString("%1").arg(j);

                   QString sheetheadnumber = QString("%1%2").arg(sheethead).arg(addrowhead);

                   QAxObject *sheethead = workbook->querySubObject("Bookmarks(QString)",sheetheadnumber);
                   QString sheettexthead=tablenet->item(j-1,0)->text();//此处为替换内容
                   sheethead->dynamicCall("Select(void)");
                   //选中要选中的区域
                   sheethead->querySubObject("Range")->setProperty("Text",sheettexthead);//进行替换操作
               }

          //表头等内容都是设置好的,直接替换就完事儿了


           /*****保存*******/
           QString pathsave = QFileDialog::getSaveFileName(this,"Save","../","word(*doc)");
           if(pathsave.isEmpty()==true)
           {
               return;
           }
           workbook->dynamicCall("SaveAs(const QString&))",QDir::toNativeSeparators(pathsave));

           //words->setProperty("DisplayAlerts", true);//含有保存的功能,但是无法获得保存的路径,不容易进行下一步操作

           workbook->dynamicCall("Close(bool)", true);
           words->dynamicCall("Quit()");
           delete workbook;
           delete words;
           file.close();
           /*if(QMessageBox::question(this,"完成","文件已经导出,是否需要打开",QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
           {
               QDesktopServices::openUrl(QUrl("file:///"+QDir::toNativeSeparators(pathsave)));
               //qDebug()<<"123";
           }*/
           QMessageBox::warning(this,"完成","文件已经保存",QMessageBox::Yes);



        }
  • WORD部分准备

要完成生成word报表的程序,最重要的一步就是你需要一个提前设置好的word模板。

以下是模板的整体预览

《Qt:如何生成word报表》

其中有几个部分需要注意:

  1. 书签的设置

在内容需要的部分,插入书签,拿本模板为样例:

仪器名称://这个是需要人员输入的,其内容是不固定的,需要后期输入,所以在“仪器名称”后面的横线上添加书签

选择任意文本进行输入,本文选择的是【设备】,之后选中文本

《Qt:如何生成word报表》

插入——书签

《Qt:如何生成word报表》

 

即可。

  • 效果展示

《Qt:如何生成word报表》

界面设置如图(示例)

点击生成

 《Qt:如何生成word报表》

选择保存路径

《Qt:如何生成word报表》 打开文件 《Qt:如何生成word报表》

《Qt:如何生成word报表》

替换完成。

  • 总结

关于word表格的绘制,是开发人员在word模板中提前绘制好的。

表格的绘制也可以通过Qt的代码实现,此部分仍有待学习。

    原文作者:SAW1113
    原文地址: https://blog.csdn.net/qq_41605114/article/details/86596059
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞