当前位置:   article > 正文

QT导出word文档,使用QAxObject类(亲测可用)_qt 导出word

qt 导出word

概要说明

使用QAxObject类,需包含头文件#include
pro文件添加模块:QT += axcontainer
新建word文档,另存为.dot格式,在文档中添加书签,这里添加的书签名要在程序里调用,此时添加的书签在文档中不可见,可以选择文件-选项-高级,勾选显示书签

代码实现

wordengine.h头文件

#ifndef WORDENGINE_H
#define WORDENGINE_H
#include <QObject>
#include <QAxObject>
class WordEngine : public QObject
{
    Q_OBJECT
public:
    explicit WordEngine(QObject *parent = 0);
    ~WordEngine();
    bool open(bool bVisable = false);//打开文件
    bool open(const QString& strFile,bool bVisable = false);//打开文件,重载调用上一个open()
    bool close();//关闭文件
    bool isOpen();//获取文件当前的打开状态
    void save();//保存
    bool saveAs(const QString& strSaveFile);//另存为文件
    bool setMarks(const QString& strMark, const QString& strContent);//设置标签内容
    bool setTitle(const QString& strMark, const QString& strContent);//插入word标题
    bool setBatchMarks(QStringList &itemList,QStringList sometexts);//批量设置标签内容
    void insertTable(int nStart, int nEnd, int row, int column);//插入表格
    QAxObject *insertTable(QString sLabel,int row, int column);//在指定标签插入表格
    void insertPic(QString sLabel,const QString& picPath);//插入图片
    void MergeCells(QAxObject *table, int nStartRow,int nStartCol,int nEndRow,int nEndCol);//合并单元格
    void setColumnWidth(QAxObject *table, int column, int width);//设置表格列宽
    void setCellString(QAxObject *table, int row, int column, const QString& text);//设置表格内容
    void addTableRow(QAxObject *table, int nRow, int rowCount);//为表格添加行
    void setCellFontBold(QAxObject *table, int row, int column, bool isBold);//设置表格内容是否为粗体
    void setCellFontSize(QAxObject *table, int row, int column, int size);//设置表格字体大小
    void insertCellPic(QAxObject *table, int row, int column,const QString& picPath);//在表格中插入图片
signals:
public slots:
private:
    bool m_bOpened;
    QString m_strFilePath;
    QAxObject *m_wordDocuments;
    QAxObject *m_wordWidget;
};
#endif // WORDENGINE_H

  • 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

wordengine.cpp源文件

#include "wordengine.h"
#include <QDebug>
/**
 * @brief 构造函数
 * @param parent 指定父对象
 */
WordEngine::WordEngine(QObject *parent) : QObject(parent)
  ,m_bOpened(false)
  ,m_wordDocuments(NULL)
  ,m_wordWidget(NULL)
{
}

/**
 * @brief 析构函数
 */
WordEngine::~WordEngine()
{
    close();
}

/**
 * @brief 打开文件
 * @param bVisable 是否显示文件
 * @return
 */
bool WordEngine::open(bool bVisable)
{
    m_wordWidget = new QAxObject();
    bool bFlag = m_wordWidget->setControl("word.Application");//初始化COM对象,新建一个word应用程序
    if(!bFlag)
    {
        bFlag = m_wordWidget->setControl("kwps.Application");//尝试用wps打开
        if(!bFlag)
            return false;
    }
    m_wordWidget->setProperty("Visible", bVisable);
    QAxObject* document = m_wordWidget->querySubObject("Documents");//获取所有的工作文档(返回一个指向QAxObject包含的COM对象)
    if(!document)
        return false;
    document->dynamicCall("Add(QString)",m_strFilePath);//以文件template.dot为模版新建一个文档
    m_wordDocuments = m_wordWidget->querySubObject("ActiveDocument");//获取当前激活的文档
    m_bOpened = true;
    return true;
}

/**
 * @brief 打开文件,重载,调用上一个open
 * @param strFilePath 文件路径
 * @param bVisable 是否显示文件
 * @return
 */
bool WordEngine::open(const QString &strFilePath, bool bVisable)
{
    m_strFilePath = strFilePath;
    //close();
    return open(bVisable);
}
/**
 * @brief 关闭文件
 * @return bool
 */
bool WordEngine::close()
{
    if (m_bOpened)
    {
        if(m_wordDocuments)
            m_wordDocuments->dynamicCall("Close (bool)", true);//关闭文本窗口
        if(m_wordWidget)
            m_wordWidget->dynamicCall("Quit()");//退出word
        if(m_wordDocuments)
            delete m_wordDocuments;
        if(m_wordWidget)
            delete m_wordWidget;
        m_bOpened = false;
    }
    return m_bOpened;
}
/**
 * @brief 获取当前的打开状态
 * @return bool
 */
bool WordEngine::isOpen()
{
    return m_bOpened;
}
/**
 * @brief 保存文件
 */
void WordEngine::save()
{
    m_wordDocuments->dynamicCall("Save()");
}

/**
 * @brief 另存为文件
 * @param strSaveFile 保存路径
 * @return
 */
bool WordEngine::saveAs(const QString &strSaveFile)
{
    return m_wordDocuments->dynamicCall("SaveAs (const QString&)",strSaveFile).toBool();
}

/**
 * @brief 设置标签内容(测试可用)
 * @param strMark 标签名
 * @param strContent 标签内容
 * @return
 */
bool WordEngine::setMarks(const QString &strMark, const QString &strContent)
{
    QAxObject* bookmarkCode = NULL;
    bookmarkCode = m_wordDocuments->querySubObject("Bookmarks(QVariant)",strMark);
    //选中标签,将字符textg插入到标签位置
    if(bookmarkCode)
    {
        bookmarkCode->dynamicCall("Select(void)");
        bookmarkCode->querySubObject("Range")->setProperty("Text", strContent);
        return true;
    }
    return false;
}

/**
 * @brief 插入标题 3(测试可用)
 * @param strMark 标签名
 * @param strContent 标签内容
 * @return
 */
bool WordEngine::setTitle(const QString &strMark, const QString &strContent)
{
    QAxObject* bookmarkCode = NULL;
    bookmarkCode = m_wordDocuments->querySubObject("Bookmarks(QVariant)", strMark);
    //选中标签,将字符textg插入到标签位置
    if(bookmarkCode)
    {
        bookmarkCode->dynamicCall("Select(void)");
        bookmarkCode->querySubObject("Range")->setProperty("Text", strContent+"\n");
        //设置该标签为标题3
        bookmarkCode->querySubObject("Range")->dynamicCall("SetStyle(QVariant)", QString::fromLocal8Bit("标题 3"));
        return true;
    }
    return false;
}

/**
 * @brief 批量设置标签内容
 * @param itemList 标签名列表
 * @param sometexts 内容列表
 * @return
 */
bool WordEngine::setBatchMarks(QStringList &itemList, QStringList sometexts)
{
    QAxObject* allBookmarks = NULL;
    allBookmarks = m_wordDocuments->querySubObject("Bookmarks");
    //选中标签,将字符text插入到标签位置
    if(allBookmarks)
    {
        int count = allBookmarks->property("Count").toInt();
        /*填写模板中的书签*/
        for(int i=count;i>0;--i)
        {
            QAxObject *bookmark = allBookmarks->querySubObject("Item(QVariant)", i);
            QString name= bookmark->property("Name").toString();
            int j=0;
            foreach(QString itemName , itemList)
            {
                if (name == itemName)
                {
                    QAxObject *curBM = m_wordDocuments->querySubObject("Bookmarks(QString)", name);
                    curBM->querySubObject("Range")->setProperty("Text", sometexts.at(j));
                    break;
                }
                j++;
            }
        }
        return true;
    }
    return false;
}

/**
 * @brief 插入表格(开始和结束位置参数意义不明确)
 * @param nStart 开始位置
 * @param nEnd 结束位置
 * @param row 行
 * @param column 列
 */
void WordEngine::insertTable(int nStart, int nEnd, int row, int column)
{
    QAxObject* ptst = m_wordDocuments->querySubObject( "Range( Long, Long )",nStart, nEnd );
    QAxObject* pTable = m_wordDocuments->querySubObject( "Tables" );
    QVariantList params;
    params.append(ptst->asVariant());//转换为QVariant类型的COM对象
    params.append(row);
    params.append(column);
    if( pTable )
    {
        pTable->dynamicCall( "Add(QAxObject*, Long ,Long )",params);

    }
}

/**
 * @brief 在指定标签插入表格(测试可用)
 * @param sLabel 标签
 * @param row 行
 * @param column 列
 * @return
 */
QAxObject *WordEngine::insertTable(QString sLabel,int row, int column)
{
    QAxObject *bookmark = m_wordDocuments->querySubObject("Bookmarks(QVariant)", sLabel);
    if(bookmark)
    {
        bookmark->dynamicCall("Select(void)");
        QAxObject *selection = m_wordWidget->querySubObject("Selection");

        selection->dynamicCall("InsertAfter(QString&)", "\n");
        //selection->dynamicCall("MoveLeft(int)", 1);
        selection->querySubObject("ParagraphFormat")->dynamicCall("Alignment", "wdAlignParagraphCenter");
        //selection->dynamicCall("TypeText(QString&)", "Table Test");//设置标题

        QAxObject *range = selection->querySubObject("Range");
        QAxObject *tables = m_wordDocuments->querySubObject("Tables");
        QAxObject *table = tables->querySubObject("Add(QVariant,int,int)",range->asVariant(),row,column);

        for(int i=1;i<=6;i++)
        {
            QString str = QString("Borders(-%1)").arg(i);
            QAxObject *borders = table->querySubObject(str.toLocal8Bit().constData());
            borders->dynamicCall("SetLineStyle(int)",1);
        }
        return table;
    }
    return NULL;
}

/**
 * @brief 插入图片 (测试可用)
 * @param sLabel 标签
 * @param picPath 图片路径(绝对路径)
 */
void WordEngine::insertPic(QString sLabel, const QString &picPath)
{
    QAxObject *bookmark=m_wordDocuments->querySubObject("Bookmarks(QVariant)",sLabel);

    if(bookmark)
    {
        bookmark->dynamicCall("Select(void)");
        QAxObject *selection = m_wordWidget->querySubObject("Selection");
        selection->querySubObject("ParagraphFormat")->dynamicCall("Alignment", "wdAlignParagraphCenter");
        QAxObject *range = bookmark->querySubObject("Range");
        QVariant tmp = range->asVariant();
        QList<QVariant>qList;
        qList<<QVariant(picPath);
        qList<<QVariant(false);
        qList<<QVariant(true);
        qList<<tmp;
        QAxObject *Inlineshapes = m_wordDocuments->querySubObject("InlineShapes");
        Inlineshapes->dynamicCall("AddPicture(const QString&, QVariant, QVariant ,QVariant)",qList);
    }
}

/**
 * @brief 合并单元格(测试可用)
 * @param table 表
 * @param nStartRow 起始行
 * @param nStartCol 起始列
 * @param nEndRow 终止行
 * @param nEndCol 终止列
 */
void WordEngine::MergeCells(QAxObject *table, int nStartRow, int nStartCol, int nEndRow, int nEndCol)
{
    QAxObject* StartCell =table->querySubObject("Cell(int, int)",nStartRow,nStartCol);
    QAxObject* EndCell = table->querySubObject("Cell(int, int)",nEndRow,nEndCol);
    StartCell->dynamicCall("Merge(LPDISPATCH)",EndCell->asVariant());
}

/**
 * @brief 设置表格列宽
 * @param table 表格
 * @param column 列数
 * @param width 宽度
 */
void WordEngine::setColumnWidth(QAxObject *table, int column, int width)
{
    table->querySubObject("Columns(int)", column)->setProperty("Width", width);
}

/**
 * @brief 设置表格内容,行和列下标从1开始(测试可用)
 * @param table表
 * @param row 行号
 * @param column 列号
 * @param text 内容
 */
void WordEngine::setCellString(QAxObject *table, int row, int column, const QString &text)
{
    if(table)
    {
        table->querySubObject("Cell(int, int)", row, column)
                ->querySubObject("Range")
                ->dynamicCall("SetText(QString)", text);
    }
}

/**
 * @brief 为表格添加行
 * @param table
 * @param nRow 插入行
 * @param rowCount 插入的行数
 */
void WordEngine::addTableRow(QAxObject *table, int nRow, int rowCount)
{
    QAxObject* rows = table->querySubObject("Rows");

    int Count = rows->dynamicCall("Count").toInt();
    if(0 <= nRow && nRow <=Count)
    {
        for(int i = 0; i < rowCount; ++i)
        {
            QString sPos = QString("Item(%1)").arg(nRow + i);
            QAxObject* row = rows->querySubObject(sPos.toStdString().c_str());
            QVariant param = row->asVariant();
            rows->dynamicCall("Add(Variant)", param);
        }
    }
}

/**
 * @brief 设置内容是否为粗体(测试可用)
 * @param table表
 * @param row 行号
 * @param column 列号
 * @param isBold 是否为粗体
 */
void WordEngine::setCellFontBold(QAxObject *table, int row, int column, bool isBold)
{
    table->querySubObject("Cell(int, int)",row,column)->querySubObject("Range")->dynamicCall("SetBold(int)", isBold);
}

/**
 * @brief 设置字体大小(测试可用)
 * @param table 表
 * @param row 行号
 * @param column 列号
 * @param size 字体大小
 */
void WordEngine::setCellFontSize(QAxObject *table, int row, int column, int size)
{
    table->querySubObject("Cell(int, int)",row,column)->querySubObject("Range")->querySubObject("Font")->setProperty("Size", size);
}

/**
 * @brief 在表格中插入图片(测试可用)
 * @param table 表
 * @param row 行号
 * @param column 列号
 * @param picPath 图片路径
 */
void WordEngine::insertCellPic(QAxObject *table, int row, int column, const QString &picPath)
{
    QAxObject* range = table->querySubObject("Cell(int, int)", row, column)->querySubObject("Range");
    range->querySubObject("InlineShapes")->dynamicCall("AddPicture(const QString&)", picPath);
}

  • 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
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368

调用示例

#include "widget.h"
#include "ui_widget.h"
#include <QDir>
#include <QDebug>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_pWordEngine = new WordEngine(this);
    QDir dir(".");
    QString str = QString("%1/Doc1.dot").arg(dir.absolutePath());//使用绝对路径
    m_pWordEngine->open(str,true);
    m_pWordEngine->setMarks("text",QStringLiteral("一段正文"));
    m_pWordEngine->setTitle("title",QStringLiteral("一个标题3"));
    QAxObject* table = m_pWordEngine->insertTable("biaoge",3,5);
    m_pWordEngine->setCellString(table,1,1,"Hello");
    m_pWordEngine->MergeCells(table,1,4,2,4);
    m_pWordEngine->saveAs(QString("%1/test.doc").arg(dir.absolutePath()));//使用绝对路径
    m_pWordEngine->insertPic("image",QString("%1/images/face.jpg").arg(dir.absolutePath()));
    m_pWordEngine->setCellFontBold(table,1,1,true);
    m_pWordEngine->setCellFontSize(table,1,1,20);
    m_pWordEngine->insertCellPic(table,1,2,QString("%1/images/taozi.jpg").arg(dir.absolutePath()));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

效果展示

程序当前文件夹生成test.doc文件
在这里插入图片描述

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

闽ICP备14008679号