my-QT专栏

QT 写word和转Pdf

2021-09-03  本文已影响0人  c之气三段

pro

win32: QT += axcontainer

.h

#ifndef WRITEDOC_H
#define WRITEDOC_H

#include <QAxObject>



class WriteDoc : public QObject
{
    Q_OBJECT
public:
    explicit WriteDoc(QObject *parent = nullptr);
    enum Alignment
    {
        WdAlignParagraphCenter,//剧中对其
        WdAlignParagraphLeft,//左对齐
        WdAlignParagraphRight,//右对齐
        WdAlignParagraphJustify,//两端对齐
        WdAlignParagraphDistribute//分散对其
    };
    bool open();
    //字体大小
    void setFontSize(int size);
    //字体格式
    void setFontStyle(const QString &strStyle);
    //对齐方式
    void setAlignment(WriteDoc::Alignment alignType);
    //写文本
    void writeText(const QString &str);
    //回车换行
    void insertEnter();
    //光标移动到最后跳出单元格
    void moveForEnd();
    //创建表格
    QAxObject *createTable(int rowCount,const QStringList &headList);
    //填充表格单元格
    void setCellText(QAxObject *table, int row, int column, const QString &text);
    //通过QPixmap,插入一张图片
    void insertPicture(const QPixmap &picture,const QString &picName);
    //创建并填充表格图,两列写死
    void creatFillTableOfPictures(const QMap<QString, QPixmap> &pixmaps);
    void close();
    void save(QString strSavePath);
    //写word结束关闭后,再调用转pdf函数
    bool saveToPdf(const QString &wordpathName,const QString &PdfpathName);
    static WriteDoc *getinstence();
private:
    void setCellPictureName(QAxObject *table, int row, int column, const QString &strPicName);
    void setCellPicture(QAxObject *table, int row, int column, const QPixmap &pixmap);
private:
    QAxObject *m_pWord;      //指向整个Word应用程序
    QAxObject *m_pWorkDocuments;  //指向文档集,Word有很多文档
    QAxObject *m_pWorkDocument;   //指向m_sFile对应的文档,就是要操作的文档
};

#endif // WRITEDOC_H

.cpp

#include "WriteDoc.h"
#include <QClipboard>
#include <QApplication>
#include <QDir>
#include <QPixmap>
#include<QDebug>
WriteDoc::WriteDoc(QObject *parent) : QObject(parent)
{

}

bool WriteDoc::open()
{
    m_pWord = new QAxObject();
    bool flag = m_pWord->setControl("kwps.Application");
    if(!flag)
    {
        flag = m_pWord->setControl("Word.Application");
        if(!flag)
        {
            return false;
        }
    }
    m_pWord->setProperty("Visible", true);
    QAxObject *documents = m_pWord->querySubObject("Documents");
    if(!documents)
    {
        return false;
    }
    m_pWorkDocuments = documents;
    m_pWorkDocuments->dynamicCall("Add (void)");
    //获取当前激活的文档
    m_pWorkDocument = m_pWord->querySubObject("ActiveDocument");
    if(!m_pWorkDocument)
    {
        return false;
    }
    return true;
}

void WriteDoc::setFontSize(int size)
{
    QAxObject* selection = m_pWord->querySubObject("Selection");
    if(!selection)
    {
        return;
    }
    selection->querySubObject("Font")->setProperty("Size",size);
}

void WriteDoc::setFontStyle(const QString &strStyle)
{
    QAxObject* selection = m_pWord->querySubObject("Selection");
    if(!selection)
    {
        return;
    }
    selection->querySubObject("Font")->setProperty("Name",strStyle);
}

void WriteDoc::setAlignment(WriteDoc::Alignment alignType)
{
    QAxObject *selection = m_pWord->querySubObject("Selection");
    if(!selection)
    {
        return;
    }
    switch (alignType) {
    case WriteDoc::Alignment::WdAlignParagraphCenter:
        selection->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphCenter");
        break;
    case WriteDoc::Alignment::WdAlignParagraphLeft:
        selection->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphLeft");
        break;
    case WriteDoc::Alignment::WdAlignParagraphRight:
        selection->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphRight");
        break;
    case WriteDoc::Alignment::WdAlignParagraphJustify:
        selection->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphJustify");
        break;
    case WriteDoc::Alignment::WdAlignParagraphDistribute:
        selection->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphDistribute");
        break;
    }
}

void WriteDoc::writeText(const QString &str)
{
    QAxObject* selection  = m_pWord->querySubObject("Selection");
    if(!selection)
    {
        return;
    }
    selection->dynamicCall("TypeText(const QString&)",str);
}

void WriteDoc::insertPicture(const QPixmap &picture,const QString &picName)
{
    //设置剪贴板内容
    QAxObject* selection  = m_pWord->querySubObject("Selection");
    if(!selection)
    {
        return;
    }
    QAxObject *range = selection->querySubObject("Range");
    QAxObject *tables = m_pWorkDocument->querySubObject("Tables");
    if(!tables)
    {
        return;
    }
    QAxObject *table = tables->querySubObject("Add(QVariant,int,int)",range->asVariant(), 2, 1); //1row 2column
    //表格自动拉伸列 0是固定 1是根据内容调整  2根据窗口调整
    table->dynamicCall("AutoFitBehavior(WdAutoFitBehavior)",1);
    QClipboard *clipboard = QApplication::clipboard();//获取系统剪贴板指针
    clipboard->setPixmap(picture);
    QAxObject* cell_pic = table->querySubObject("Cell(int, int)",1,1);
    QAxObject* cellRange_pic = cell_pic->querySubObject("Range");
    cellRange_pic->dynamicCall("Paste()");
    if(!picName.isEmpty())
    {
        clipboard->setText(picName);
        QAxObject* cell_picName = table->querySubObject("Cell(int, int)",2,1);
        QAxObject* cellRange_picName = cell_picName->querySubObject("Range");
        cellRange_picName->dynamicCall("Paste()");
    }

    //设置表格边框
    for (int i=1;i<=6;i++)
    {
        QString m_str = QString("Borders(-%1)").arg(i);
        QAxObject *borders = table->querySubObject(m_str.toLatin1().constData());
        borders->dynamicCall("SetLineStyle(int)", 0);
    }
    moveForEnd();
}

void WriteDoc::insertEnter()
{
    QAxObject* selection  = m_pWord->querySubObject("Selection");
    if(!selection)
    {
        return;
    }
    selection->dynamicCall("TypeParagraph(void)");
}

void WriteDoc::moveForEnd()
{
    QAxObject* selection = m_pWord->querySubObject("Selection");
    if(!selection)
    {
        return;
    }
    QVariantList params;
    params.append(6);
    params.append(0);
    selection->dynamicCall("EndOf(QVariant&, QVariant&)", params).toInt();
}

QAxObject *WriteDoc::createTable(int rowCount,const QStringList &headList)
{
    QAxObject* selection  = m_pWord->querySubObject("Selection");
    if(!selection)
    {
        return nullptr;
    }
    selection->querySubObject("ParagraphFormat")->dynamicCall("Alignment","wdAlignParagraphCenter");
    QAxObject *range = selection->querySubObject("Range");
    QAxObject *tables = m_pWorkDocument->querySubObject("Tables");
    if(!tables)
    {
        return nullptr;
    }
    QAxObject *table = tables->querySubObject("Add(QVariant,int,int)",range->asVariant(),rowCount,headList.size());

    //表格自动拉伸列 0固定  1根据内容调整  2 根据窗口调整
    table->dynamicCall("AutoFitBehavior(WdAutoFitBehavior)", 2);

    //设置表头
    for(int i=0;i<headList.size();i++)
    {
        table->querySubObject("Cell(int,int)",1,i+1)->querySubObject("Range")->dynamicCall("SetText(QString)", headList.at(i));
        //加粗
        table->querySubObject("Cell(int,int)",1,i+1)->querySubObject("Range")->dynamicCall("SetBold(int)", true);
    }
    //设置表格边框
    for (int i=1;i<=6;i++)
    {
        QString str = QString("Borders(-%1)").arg(i);
        QAxObject *borders = table->querySubObject(str.toLatin1().constData());
        borders->dynamicCall("SetLineStyle(int)",1);
    }
    return table;
}

void WriteDoc::setCellText(QAxObject *table, int row, int column,const QString &text)
{
    QAxObject* range = table->querySubObject("Cell(int, int)",row+1,column+1)->querySubObject("Range");
    if(!range)
    {
        return;
    }
    range->dynamicCall("SetText(QString)", text);
}

void WriteDoc::creatFillTableOfPictures(const QMap<QString, QPixmap > &pixmaps)
{
    if(pixmaps.size()<1)
    {
        return;
    }
    int rowCount = (pixmaps.size()+1)/2;
    int totalCount = rowCount*2;
    QAxObject *selection = m_pWord->querySubObject("Selection");
    if(!selection)
    {
        return;
    }
    insertEnter();
    selection->querySubObject("ParagraphFormat")->dynamicCall("Alignment","wdAlignParagraphCenter");
    QAxObject *range = selection->querySubObject("Range");
    QAxObject *tables = m_pWorkDocument->querySubObject("Tables");
    if(!tables)
    {
        return;
    }
    QAxObject *table = tables->querySubObject("Add(QVariant,int,int)",range->asVariant(), totalCount, 2 /*2, 2*/); //1row 2column
    //表格自动拉伸列 0是固定 1是根据内容调整  2根据窗口调整
    table->dynamicCall("AutoFitBehavior(WdAutoFitBehavior)",2);
    auto iter=pixmaps.begin();pixmaps.toStdMap();
    int rowPic = 0,rowPicName = 1,column = 0;
    while(iter!=pixmaps.end())
    {

        setCellPicture(table,rowPic,column,iter.value());
        setCellPictureName(table,rowPicName,column,iter.key());
        if(column==1)
        {
            rowPic+=2;
            rowPicName = rowPic+1;
        }
        column++;
        iter++;
    }
    //设置表格边框
    for (int i=1;i<=6;i++)
    {
        QString m_str = QString("Borders(-%1)").arg(i);
        QAxObject *borders = table->querySubObject(m_str.toLatin1().constData());
        borders->dynamicCall("SetLineStyle(int)", 0);
    }
}

void WriteDoc::setCellPictureName(QAxObject *table, int row, int column, const QString &strPicName)
{
    QAxObject* cell = table->querySubObject("Cell(int, int)",row+1,column+1);
    QAxObject* range=cell->querySubObject("Range");
    range->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphCenter");
    range->dynamicCall("SetText(QString)", strPicName);
}

void WriteDoc::setCellPicture(QAxObject *table, int row, int column, const QPixmap &pixmap)
{
    QAxObject* cell = table->querySubObject("Cell(int, int)",row+1,column+1);
    QAxObject* range = cell->querySubObject("Range");
    QFile file("temppicture.png");
    if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
    {
        return;
    }
    pixmap.save(&file, "PNG");
    file.close();
    QAxObject* pic = range->querySubObject("InlineShapes");
    pic->dynamicCall("AddPicture(const QString&)",QDir::currentPath() + "/temppicture.png");
}

void WriteDoc::save(QString strSavePath)
{
     if(strSavePath.isEmpty())return;
     m_pWorkDocument->dynamicCall("SaveAs (const QString&)",strSavePath);
}

bool WriteDoc::saveToPdf(const QString &wordpathName,const QString &PdfpathName)
{
    if(wordpathName.isEmpty())false;
    QAxObject *pWordApplication = new QAxObject();
    bool flag = pWordApplication->setControl("kwps.Application");
    if(!flag)
    {
        flag = pWordApplication->setControl("Word.Application");
        if(!flag)
        {
            return false;
        }
    }
    QAxObject *pWordDocuments= pWordApplication->querySubObject("Documents");
    QVariant filename(wordpathName);
        QVariant confirmconversions(false);
        QVariant readonly(true);
        QVariant addtorecentfiles(false);
        QVariant passworddocument("");
        QVariant passwordtemplate("");
        QVariant revert(false);
        //打开
        QAxObject* doc = pWordDocuments->querySubObject("Open(const QVariant&, const QVariant&,const QVariant&, "
                                                     "const QVariant&, const QVariant&, "
                                                     "const QVariant&,const QVariant&)",
                                                     filename,
                                                     confirmconversions,
                                                     readonly,
                                                     addtorecentfiles,
                                                     passworddocument,
                                                     passwordtemplate,
                                                     revert);
    if(PdfpathName.isEmpty())false;
    QVariant OutputFileName(PdfpathName);
    QVariant ExportFormat(17);      //17是pdf
    QVariant OpenAfterExport(false); //保存后是否自动打开
    //转成pdf
    doc->querySubObject("ExportAsFixedFormat(const QVariant&,const QVariant&,const QVariant&)",
                                    OutputFileName,
                                    ExportFormat,
                                    OpenAfterExport);
    //关闭
       doc->dynamicCall("Close(boolean)", false);
       m_pWord->dynamicCall("Quit()");//退出word
       delete pWordApplication;
       return true;
}

void WriteDoc::close()
{
    m_pWorkDocuments->dynamicCall("Close (bool)", true);//关闭文本窗口
    m_pWord->dynamicCall("Quit()");//退出word
    delete m_pWorkDocuments;
    delete m_pWord;
    m_pWorkDocument = nullptr;
    m_pWorkDocuments = nullptr;
}


WriteDoc *WriteDoc::getinstence()
{
    static WriteDoc wirteDoc;
    return &wirteDoc;
}

上一篇 下一篇

猜你喜欢

热点阅读