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

概要说明

使用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

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);
}

调用示例

#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()));
}

效果展示

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

猜你喜欢

转载自blog.csdn.net/weixin_40355471/article/details/106585064
今日推荐