QT 使用QAxWidget和QAxObject操作DOCX和EXECL文件,包括修改数据、插入图片、修改表格、打印文档、复制SHEET、修改页码数等

您所在的位置:网站首页 office什么组件不可以通过录制宏来记录 QT 使用QAxWidget和QAxObject操作DOCX和EXECL文件,包括修改数据、插入图片、修改表格、打印文档、复制SHEET、修改页码数等

QT 使用QAxWidget和QAxObject操作DOCX和EXECL文件,包括修改数据、插入图片、修改表格、打印文档、复制SHEET、修改页码数等

2024-07-09 03:52| 来源: 网络整理| 查看: 265

目录 简介说明操作DOCX文件提前处理文档--打开word文件修改标签对应值修改表格数据插入图片操作结束 打印或者另存文档 操作EXECL文件打开execl文件新增 sheet表指定sheet页 插入图片修改对应值修改页码数结束操作 打印或者另存文档 扩展 录制宏

简介说明 Qt/Windows桌面版提供了ActiveQt框架,用以为Qt和ActiveX提供完美结合。ActiveQt由两个模块组成:QAxContainer模块允许我们使用COM对象并且可以在Qt应用程序中嵌入QActive控件。QAxServer模块允许我们导出使用Qt编写的自定义的COM对象和Active控件。在这里,我们使用了QAxContainer模块,所以在.pro中,需要使用下面这一项来链接这个QAxContainer模块:CONFIG+=qaxcontainer(注意:在QT5.3中使用的是:QT += widgets gui axcontainer)。在头文件中包含QAxWidget和QAxObject。使用QAxWidget和QAxObject修改WORD或EXECL必须在本地计算机上安装有wps或者office,本质上是调用wps或者office软件接口 操作DOCX文件 提前处理文档–

Qt修改word文件一般通过word的标签修改对应数据,先在word中设置书签名称,在通过QAxObject打开文件并修改对应值:

在这里插入图片描述

打开word文件 QAxWidget *word = new QAxWidget("Word.Application",0,Qt::MSWindowsOwnDC); word->setProperty("Visible",false); //调用本地wps或者office 不显示 QAxObject *documents = word->querySubObject("Documents"); documents->dynamicCall("Open(QString)",QString::fromLocal8Bit(QString(filepaths).toLocal8Bit())); //获取当前激活的文档 QAxObject *document = word->querySubObject("ActiveDocument"); 修改标签对应值 //types 标签名称 QAxObject *bookmark_code = document->querySubObject("Bookmarks(QVariant)","types"); //选中标签,将字符textg插入到标签位置 if(!bookmark_code->isNull()) { bookmark_code->dynamicCall("Select(void)"); //QString("%1(%2)").arg(_ajdh.typeName).arg(_ajdh.anjuanCode) 具体内容值 bookmark_code->querySubObject("Range")->setProperty("Text",QString("%1(%2)").arg(_ajdh.typeName).arg(_ajdh.anjuanCode)); } delete bookmark_code; 修改表格数据 //获取所有表列表 QAxObject* pTables = document->querySubObject("Tables"); //指定表 根据序号 QAxObject* table = pTables->querySubObject("Item(int)", 2); if(table) { QAxObject* rows = table->querySubObject("Rows"); //获取指定行 QString sPos = QString("Item(%1)").arg(2); QAxObject* row = rows->querySubObject(sPos.toStdString().c_str()); //qDebug()dynamicCall("Add(Variant)", param); if(row) { //修改值 table->querySubObject("Cell(int, int)", 2 + i, 1) ->querySubObject("Range") ->dynamicCall("SetText(QString)", QString("%1").arg(i+1,3,10,QLatin1Char('0'))); } } 插入图片 // 获取文档中名字为pic的标签 QAxObject*bookmark_pic=document->querySubObject("Bookmarks(QVariant)","pngS"); // 选中标签,将图片插入到标签位置 if(!bookmark_pic->isNull()) { bookmark_pic->dynamicCall("Select(void)"); QAxObject *range; range = bookmark_pic->querySubObject("Range"); QVariant tmp = range->asVariant(); QListqList; //txmpath 图片路径 qListsetProperty("ScreenUpdating",false); if(pApplication) { //查询工作簿列表子对象 QAxObject *pWorkbooks =pApplication->querySubObject("WorkBooks"); //工作簿列表 if (pWorkbooks) { //当前软件中工作簿 pWorkbooks->dynamicCall("Open(QString)",QDir::toNativeSeparators(filepaths),QString(),false); QAxObject *pWorkbook = pApplication->querySubObject("ActiveWorkBook"); //当前工作簿 if (pWorkbook) { //获取所有工作表列表 QAxObject *pWorkSheets = pWorkbook->querySubObject("Sheets"); //工作表列表 } } } 新增 sheet表

选择一个空白sheet页,重新添加 sheet索引从 1 开始

QAxObject* sheet = pWorkSheets->querySubObject("Item(int)", 2);//选择第二张表 if(sheet) { qDebug("[copy newSheet to workSheets]"); QVariant param = sheet->asVariant();//将第二张表转化为参数 QVariant cels= sheet->dynamicCall("Copy(const QVariant&)", param);//复制表至同一workSheets中 } 指定sheet页 插入图片 QAxObject* sheetDoc = pWorkSheets->querySubObject("Item(int)", 1);//选择第一张表 if(sheetDoc) { QAxObject * shapes = sheetDoc->querySubObject("Shapes"); if(shapes) { //图片路径 QFileInfo info(txmpath); qDebug(("[txmpath] "+QDir::toNativeSeparators(info.absoluteFilePath())).toLocal8Bit()); //添加图片到指定位置 (30.61368,617.65934,161.00,56.692)左边缘,上边缘,宽度,高度,以磅为单位 //1厘米等于28.35磅 QVariant var= shapes->dynamicCall("AddPicture( QString&, bool, bool, double, double, double, double",QDir::toNativeSeparators(info.absoluteFilePath()),true,true,30.61368,617.65934,161.00,56.692); //qDebug(var.toString().toUtf8()); delete shapes; } } 修改对应值 //案卷档号 QAxObject *mark_ajdh = sheetDoc->querySubObject(QString("Cells(%1,%2)").arg(4).arg(3).toLatin1()); if(mark_ajdh) { //Value 与Value2 是因为wps与office文件不一致 if(!mark_ajdh->setProperty("Value",QVariant(" "+ajdh))) mark_ajdh->setProperty("Value2",QVariant(" "+ajdh)); delete mark_ajdh; } 修改页码数 QAxObject* sheetTable = pWorkSheets->querySubObject("Item(int)", row);//选择第二张表 QAxObject* PageSetup=sheetTable->querySubObject("PageSetup"); if(PageSetup) { PageSetup->setProperty("CenterFooter",QVariant(QString("第 %1 页,共 %2 页").arg(row-1).arg(clo))); delete PageSetup; } 结束操作 打印或者另存文档

操作结束必须关闭和清除资源,防止操作过程中打开多个造成内存溢出

//qDebug("doit-over-"); //pWorkSheets->dynamicCall("PrintOut"); //开始打印 delete pWorkSheets; pWorkbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(filepaths)); // pWorkbook->dynamicCall("PrintOut"); pWorkbook->dynamicCall("Close(Boolean)", false); } delete pWorkbook; } delete pWorkbooks; pApplication->dynamicCall("Quit()"); } delete pApplication; //qDebug("end parint--"); 扩展 录制宏

使用QAxWidget和QAxObject修改word与execl, 实际上也是office和wps中的宏操作,需要用到的修改完全可以通过录制宏获取相关属性,按照对应属性修改相关值; 上文中修改页码数就是通过这种方式获取; 以wps为例: 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3