当前位置: 首页 > article >正文

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

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

  • 合并规则
  • 代码
  • 合并效果

合并规则

"{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列数据

代码

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

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

合并效果

在这里插入图片描述


http://www.kler.cn/a/515937.html

相关文章:

  • skynet 源码阅读 -- 启动主流程
  • 2024 行远自迩,笃行不怠
  • WPF实战案例 | C# WPF实现大学选课系统
  • AIGC浪潮下,图文内容社区数据指标体系如何构建?
  • “推理”(Inference)在深度学习和机器学习的语境
  • 如何实现网页不用刷新也能更新
  • 安装成功:VMwarePro17虚拟机安装MacOS13苹果系统和安装VMware TooLS详细教程
  • Sql Server数据库远程连接访问配置
  • 测试在项目过程中,经常会遇到什么问题?如何解决
  • 01-硬件入门学习/嵌入式教程-CH340C使用教程
  • 2025年第三届智能制造与自动化前沿国际会议 | Ei、Scopus双检索
  • 爬取NBA球员信息并可视化小白入门
  • AI应用、轻量云、虚拟化|云轴科技ZStack参编金融行标与报告
  • HTML-拓展知识 字符实体与URL地址
  • 国产低功耗带LCD驱动和触摸按键功能的MCU
  • ToDesk云电脑安全性探秘,如何确保数据安全无忧?
  • QT之CMAKE教程
  • docker的前世今生
  • 数据结构初阶之双向链表的介绍与双向链表的实现
  • SpringAI 之AI 模型输出与 POJO 映射
  • 数据分析 six库
  • 步入响应式编程篇(二)之Reactor API
  • 每天五分钟深度学习pytorch:基于VGG神经网络完成CAFIR10的识别
  • Kafak 单例生产者实现-C#操作
  • 工厂模式 - 工厂方法模式、抽象工厂模式
  • 软件测试丨SDK 功能测试