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

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

合并效果

相关推荐
唐钰小宝B38 分钟前
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
java·开发语言·windows
知识分享小能手1 小时前
C学习教程,从入门到精通,C语言指针 —— 详细知识点总结(10)
c语言·开发语言·学习
熊猫钓鱼>_>1 小时前
开源鸿蒙平台 KMP 三方库 kotlin-csv 适配全流程:从编码假设到沙箱真机互通验证
开发语言·人工智能·华为·kotlin·harmonyos·鸿蒙
张张123y1 小时前
# 后端第七课:FastAPI 实战入门(用刚学的 Python 写第一个 API 接口)
开发语言·python·mysql·api·fastapi
小陈不好吃2 小时前
Java 泛型与类型擦除:从 PECS 原则到 TypeToken 绕过
java·开发语言·windows·pecs 原则·typetoken绕过
ss2732 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 11 PostgreSQL安装部署常见问题排查与解决
数据库·笔记·postgresql
Shaoshing2 小时前
存储引擎与架构
java·开发语言·架构
额额额对了2 小时前
Linux 驱动开发:基于 platform 总线 + misc 设备的 DS18B20 单总线温度驱动
linux·c语言·开发语言·驱动开发·嵌入式硬件
ab1237682 小时前
three.js 完整笔记
笔记·three.js
devilnumber2 小时前
Java 代理模式(简单理解回顾)
java·开发语言·代理模式