基于Qt中的QAxObject实现指定表格合并数据进行word表格的合并

基于Qt中的QAxObject实现指定表格合并数据进行word表格的合并

合并规则

cpp 复制代码
"{3,1}@{3,1}@{3,1}@{1,6}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{1,1}@{1,1}@{1,2}@{1,1}@{1,2}@{1,1}@{1,2}@{1,1}#"
"{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{1,1}@{2,2}@{1,1}@{1,1}@{2,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{4,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{3,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{2,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{3,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{2,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{3,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{3,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{2,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
"{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}"

上方数据代表26行9列的表格,其中{}中的数据代表单元格的合并行数以及合并列数,例如{3,1}代表合并3行1列数据

代码

cpp 复制代码
#include <QAxObject>
#include <QApplication>
#include <QFile>
#include <QDebug>


QString getCellPoint(int rowIn, int colIn)
{
    QString rS = QString::number(rowIn);
    QString cS = QString::number(colIn);
    QString rSw = rS.rightJustified(2,'0');
    QString cSw = cS.rightJustified(2,'0');
    QString cellPoint = "("+rSw+","+cSw+")";
    return cellPoint;
}

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    //testPython();
    QString tableDataStr= "{3,1}@{3,1}@{3,1}@{1,6}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{1,1}@{1,1}@{1,2}@{1,1}@{1,2}@{1,1}@{1,2}@{1,1}#"
                          "{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{1,1}@{2,2}@{1,1}@{1,1}@{2,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{4,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{3,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{2,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{3,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{2,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{3,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{3,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{2,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}#"
                          "{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}@{1,1}";
    QStringList rowList = tableDataStr.split("#");
    QMap<QString,QMap<QString,QVariant>> tableCellMap;
    QMap<QString,QStringList> acTableList;
    QMap<QString,QString> skipMap;
    int rowCount = rowList.size();
    int columnCount = 0;
    int rowIn = 1;

    for(QString rowS:rowList){
        QStringList colList = rowS.split("@");
        if(columnCount<colList.size()){
            columnCount = colList.size();
        }
        int colIn = 1;
        for(QString colS:colList){
            QString xy = getCellPoint(rowIn, colIn);
            QString cellSS = colS.mid(1,colS.length()-2);
            QStringList cellList = cellSS.split(",");
            int rowspan = cellList.at(0).toInt();
            int colspan = cellList.at(1).toInt();
            int mrc = rowspan-1;
            int mcc = colspan-1;
            int sr = rowIn;
            int sc = colIn;
            int er = sr+mrc;
            int ec = sc+mcc;
            QString endPoint = getCellPoint(er,ec);
            QString sxy = getCellPoint(sr, sc);
            QString exy = getCellPoint(er, ec);
            QMap<QString,QVariant> cellMap;
            cellMap.insert("x",rowIn);
            cellMap.insert("y",colIn);
            cellMap.insert("mrc",mrc);
            cellMap.insert("mcc",mcc);
            cellMap.insert("xy",xy);
            cellMap.insert("sr",sr);
            cellMap.insert("sc",sc);
            cellMap.insert("er",er);
            cellMap.insert("ec",ec);
            cellMap.insert("sxy",sxy);
            cellMap.insert("exy",exy);
            cellMap.insert("text",xy);
            cellMap.insert("rowspan",rowspan);
            cellMap.insert("colspan",colspan);
            if(!skipMap.contains(xy)){
                acTableList.insert(xy,QStringList());
                for(int rs=rowIn;rs<=er;rs++){
                    for(int cs=colIn;cs<=ec;cs++){
                        QString exy = getCellPoint(rs,cs);
                        if(exy!=xy){
                            skipMap.insert(exy,xy);
                            QStringList exyL = acTableList.value(xy);
                            if(!exyL.contains(exy)){
                                exyL.append(exy);
                                acTableList.insert(xy,exyL);
                            }
                        }
                    }
                }
            }
            tableCellMap.insert(xy,cellMap);
            colIn++;
        }
        rowIn++;
    }
    QString filepath = "C://Users//tirkl//Desktop//docTest//testTable//1.docx";
    QFile file(filepath);
    if(file.exists()){
        file.exists();
    }
    QAxObject m_word;
    bool flag = m_word.setControl("Word.Application");
    if (!flag)
    {
        flag = m_word.setControl("kwps.Application");//尝试用wps打开
        if (!flag)
            return  0;
    }
    QAxObject* m_documents = m_word.querySubObject("Documents");
    if(!m_documents){
        return 0;
    }
    //打开表格文档
    m_documents->dynamicCall("Add(void)");
    //表格文档对象
    QAxObject* tableDocument = m_word.querySubObject("ActiveDocument");
    if(!tableDocument){
        return 0;
    }
    QAxObject* Content = tableDocument->querySubObject("Content");
    if(!Content){
        return 0;
    }
    //表格范围
    QAxObject* Tables = tableDocument->querySubObject("Tables");
    if(!Tables){
        return 0;
    }

    QAxObject* Table = Tables->querySubObject("Add(QAxObject*,int&,int&)",Content->asVariant(),rowCount,columnCount);
    if(!Table){
        return 0;
    }
    QStringList acTableKeyList = acTableList.keys();
    while(!acTableKeyList.isEmpty()){
        QString xyKey = acTableKeyList.takeLast();
        QMap<QString,QVariant> cellMap = tableCellMap.value(xyKey);
        int sr = cellMap.value("sr").toInt();
        int sc = cellMap.value("sc").toInt();
        int er = cellMap.value("er").toInt();
        int ec = cellMap.value("ec").toInt();
        QString text = cellMap.value("text").toString();
        QAxObject* Cell = Table->querySubObject("Cell(int&,int&)",sr,sc);
        if(Cell){
            if(!(sr==er && sc==ec)){
                QAxObject* MergeCell = Table->querySubObject("Cell(int&,int&)",er,ec);
                if(MergeCell){
                    Cell->querySubObject("Merge(QAxObject*)",MergeCell->asVariant());
                }
            }
            QAxObject* CellRange = Cell->querySubObject("Range");
            if(CellRange){
                CellRange->setProperty("Text",text);
            }
        }

    }
    Table->setProperty("Style","网格型");
    tableDocument->querySubObject("SaveAs2(QString&)",filepath);
    //关闭表格文档
    tableDocument->dynamicCall("Close(boolean)", false);
    //退出word
    m_word.dynamicCall("Quit()");
    return app.exec();
}

注意合并单元格时若正序合并,前面合并的单元格会影响后面单元格的合并,导致后面单元格的起始坐标发生偏移,此处采用倒序进行合并。

合并效果

相关推荐
齐雅彤4 分钟前
Bash语言的并发编程
开发语言·后端·golang
AitTech13 分钟前
C#性能优化技巧:利用Lazy<T>实现集合元素的延迟加载
开发语言·windows·c#
翻晒时光13 分钟前
深入解析Java集合框架:春招面试要点
java·开发语言·面试
峰子201219 分钟前
B站评论系统的多级存储架构
开发语言·数据库·分布式·后端·golang·tidb
Channing Lewis1 小时前
python如何使得pdf加水印后的大小尽可能小
开发语言·python·pdf
_.Switch1 小时前
Python Web开发:使用FastAPI构建视频流媒体平台
开发语言·前端·python·微服务·架构·fastapi·媒体
yyytucj2 小时前
python--列表list切分(超详细)
linux·开发语言·python
xiaocao_10232 小时前
手机备忘录:安全存储与管理个人笔记的理想选择
笔记·安全·智能手机
索然无味io2 小时前
XML外部实体注入--漏洞利用
xml·前端·笔记·学习·web安全·网络安全·php
肖田变强不变秃2 小时前
C++实现有限元计算 矩阵装配Assembly类
开发语言·c++·矩阵·有限元·ansys