当前位置:   article > 正文

Qt随手笔记(五)vs+qt使用QAxObject读取word(内容、句子、段落、表格)_qt5中使用qaxobject ,setgeometry(rect)、setcontrol(file

qt5中使用qaxobject ,setgeometry(rect)、setcontrol(filename),显示word文件,win

一、配置环境
1、配置环境
本案例使用的vs2019、qt5.12.10和word2016
a) 使用vs2019新建一个QtWidgetsApplication项目
b)加载头文件和库
打开项目的属性
在这里插入图片描述

添加头文件目录
目录为qt安装路径中的Active
在这里插入图片描述
添加库目录
目录为qt安装路径下的lib
在这里插入图片描述
添加附加依赖项
Qt5AxContainerd.lib;Qt5Axbased.lib
在这里插入图片描述
二、设计ui界面
添加一个button按钮,objectName为pushButton
和一个textEdit控件,objectName为textEdit
在这里插入图片描述
点击保存
再点击窗体->查看代码
在这里插入图片描述
在弹出的窗口中,点击保存
在这里插入图片描述
然后关闭ui界面
右击项目,重新扫描解决方案,重新生成;在这里插入图片描述
三、项目代码如下
头文件:

#pragma once
#pragma execution_character_set("utf-8")

#include <QtWidgets/QMainWindow>
#include "ui_QtWidgetsApplication1.h"

//****************************************
//新添加头文件
#include <qfiledialog.h>
#include <QAxObject>
//****************************************



class QtWidgetsApplication1 : public QMainWindow
{
    Q_OBJECT

public:
    QtWidgetsApplication1(QWidget *parent = Q_NULLPTR);
    ~QtWidgetsApplication1();//添加析构函数
private:
    Ui::QtWidgetsApplication1Class ui;


//************************************************************
//以下为新添加
public slots:
    void pushButton();//添加槽函数

public:
    void OpenWord(QString& filename);     //打开word文档

    QString getLine(int start, int end);  //读取文档中第几个字到第几个字
    QString getAllText();                 //直接获取word中所有文本

    
    void getSentences();    //获取word中的所有句子
    void getParagraphs();   //获取word中的所有段落
    void readTables();      //获取word中所有表格

private:
    QAxObject* m_word;
    QAxObject* m_document;
    QAxObject* m_doc;

};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

cpp文件

#include "QtWidgetsApplication1.h"




QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    //******************************************************************
    //添加按钮的信号与槽函数
    connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(pushButton()));
   
    //******************************************************************
    //新添加
    m_word = new QAxObject("Word.Application");       //启动word应用进程
    m_document = m_word->querySubObject("Documents"); //获取Documents对象
   //*******************************************************************
}

//******************************************************
 //新添加(析构函数)
QtWidgetsApplication1:: ~QtWidgetsApplication1()
{
   
    m_word->dynamicCall("Quit()");//关闭word进程

    delete m_doc;
    m_doc = nullptr;

    delete m_document;
    m_document = nullptr;

    delete m_word;
    m_word = nullptr;
}


//******************************************************
//槽函数
void QtWidgetsApplication1::pushButton()
{
    QFileDialog dialog;
    dialog.setFileMode(QFileDialog::ExistingFile);
    dialog.setViewMode(QFileDialog::Detail);
    dialog.setOption(QFileDialog::ReadOnly, true);
    dialog.setWindowTitle(QString("QAXwidget操作文件"));
    dialog.setDirectory(QString("./"));
    dialog.setNameFilter(QString("所有文件(*.*);;excel(*.xlsx);;word(*.docx *.doc);;pdf(*.pdf)"));
    if (dialog.exec())
    {
        //根据文件后缀打开
        QStringList files = dialog.selectedFiles();
        for (auto filename : files)
        {
            if (filename.endsWith(".xlsx"))
            {
                //this->OpenExcel(filename);
            }
            else if (filename.endsWith(".docx") || filename.endsWith(".doc"))
            {
                this->OpenWord(filename);
            }

            /*if (filename.endsWith(".docx") || filename.endsWith(".doc"))
            {
                this->OpenWord(filename);
            }*/
        }
    }
}

//打开要读取的word文档
void QtWidgetsApplication1::OpenWord(QString& filename)
{
   

    m_document->dynamicCall("Open(const QString&)", filename);//打开选择的word文档
    m_word->setProperty("Visible", QVariant(false));          //不显示word窗口
    m_doc = m_word->querySubObject("ActiveDocument");         //获取当前工作簿(Documents object)

    //1
    //QString s = getLine(0, 20);//读取文档中第几个字到第几个字
    //ui.textEdit->setText(s);   //在textEdit中显示
    //ui.textEdit->append(s);    //已追加的方式在text中显示

    //2
    QString alltext = getAllText();  //直接获取word中所有文本
    ui.textEdit->setText(alltext);

    //3
    //readTables();    //获取word中所有表格

    //4
    //getSentences();  //获取word中的所有句子(以句号或回车标志为一句)
 
    //5
    //getParagraphs(); //获取word中的所有段落(以回车标志为一段)


    //关闭当前打开的word文档
    m_word->setProperty("Visible", QVariant(false));   //不显示word窗口
    m_document->dynamicCall("Close()");
    m_word->setProperty("Visible", QVariant(false));   //不显示word窗口


}

//获取第start个字到第end个字
QString QtWidgetsApplication1::getLine(int start, int end)
{
    QString text;
    if (NULL == m_doc)
        return text;

    QVariantList params;
    params << start << end;
    QAxObject* pRange = m_doc->querySubObject("Range(QVariant&, QVariant&)", params);
    text = pRange->property("Text").toString();
    delete pRange;
    pRange = NULL;
    return text;
}

//直接获取所有文字
QString QtWidgetsApplication1::getAllText()
{
    QString text;
    if (NULL == m_doc)
        return text;

    QAxObject* pRange = m_doc->querySubObject("Range()");

    if (NULL != pRange)
    {
        text = pRange->property("Text").toString();
        delete pRange; 
        pRange = NULL;
    }
    return text;
}

//获取word中所有表格
void QtWidgetsApplication1::readTables()
{
   
    if (NULL == m_doc) return;
    QAxObject* tables = m_doc->querySubObject("Tables"); //获取所有表格

    int tablecount = -1;
    if (NULL != tables)
    {
        tablecount = tables->dynamicCall("Count").toInt(); //获取表格个数
        delete tables;
        tables = NULL;
    }
    for (int i = 1; i <= tablecount; i++)
    {
        
        QAxObject* table = m_doc->querySubObject("Tables(int)", i); //获取第i个表格
        if (NULL == table) continue;
        QString title = table->property("Text").toString();;//获取表格的标题
        //ui.textEdit->append("表格标题" + title);

        int row = table->querySubObject("Rows")->dynamicCall("Count").toInt(); //获取行数
        int col = table->querySubObject("Columns")->dynamicCall("Count").toInt();//获取列数
        //ui.textEdit->append("行数" + QString::number(row));
        //ui.textEdit->append("列数" + QString::number(col));

        QAxBase::PropertyBag p = table->propertyBag();
        
        for (int j = 1; j <= row; j++)
        {
            for (int z = 1; z <= col; z++)
            {
                //获取表格中第j行第在列的数据
                QAxObject* cell = table->querySubObject("Cell(int,int)", j, z); 
                if (NULL == cell) continue;
                QString sp = cell->querySubObject("Range")->property("Text").toString();
     
                ui.textEdit->append(sp);

                delete cell;
                cell = NULL;
            }

        }
        delete table;
        table = NULL;
    }

    delete tables;
    tables = NULL;
  
}

//获取word中的所有句子
void QtWidgetsApplication1::getSentences()
{
    QAxObject* sentences = m_doc->querySubObject("Sentences");//获取所有的句子
    int count = sentences->dynamicCall("count").toInt();//获取句子的数量

    for (int i = 1; i <= count; i++)
    {
        QAxObject* sentence = sentences->querySubObject("Item(int)", i);//获取第i句
        QString sp = sentence->property("Text").toString();//获取第i句的文字

        ui.textEdit->append(sp);
        //ui.textEdit->append("-----------------");

        delete sentence;
        sentence = nullptr;
    }

    delete sentences;
    sentences = nullptr;
}

//获取word中的所有段落
void QtWidgetsApplication1::getParagraphs()
{
    QAxObject* paragraphs = m_doc->querySubObject("Paragraphs");//获取word中所有段
    int count = paragraphs->dynamicCall("count").toInt();//获取word中段落的数量

    for (int i = 1; i <= count; i++)
    {
        //获取每段话的文字
        QAxObject* par1 = paragraphs->querySubObject("Item(int)", i);//选择第i段
        QAxObject* range = par1->querySubObject("range");
        QString sp = range->property("Text").toString();

        ui.textEdit->append(sp);
        //ui.textEdit->append("-----------------");

        delete par1;
        par1 = nullptr;

        delete range;
        range = nullptr;
    }
    delete paragraphs;
    paragraphs = nullptr;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245

注意:因为关闭word进程的语句放在了析构函数中。
所以关闭时要点击对话框的×号,否则word进程仍然在后台运行,需要调用任务管理器关闭。在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/170537
推荐阅读
相关标签
  

闽ICP备14008679号