QT 使用QAxWidget和QAxObject操作DOCX和EXECL文件,包括修改数据、插入图片、修改表格、打印文档、复制SHEET、修改页码数等
目录简介说明操作DOCX文件提前处理文档--打开word文件修改标签对应值修改表格数据插入图片操作结束 打印或者另存文档操作EXECL文件打开execl文件新增 sheet表指定sheet页 插入图片修改对应值修改页码数结束操作 打印或者另存文档扩展 录制宏简介说明Qt/Windows桌面版提供了ActiveQt框架,用以为Qt和ActiveX提供完美结合。ActiveQt由两个模块组成:QAxC
·
目录
简介说明
- 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()<<"插入行";
//QVariant param = row->asVariant();
//rows->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();
QList<QVariant>qList;
//txmpath 图片路径
qList<<QVariant(QString::fromLocal8Bit(QString(txmpath).toLocal8Bit()));
qList<<QVariant(false);
qList<<QVariant(true);
qList<<tmp;
QAxObject *Inlineshapes = document->querySubObject("InlineShapes");
Inlineshapes->dynamicCall("AddPicture(const QString&, QVariant, QVariant ,QVariant)",qList);
delete Inlineshapes;
delete range;
}
delete bookmark_pic;
操作结束 打印或者另存文档
注意:打印时,必须事先能通过wps和office打印文件;
// 文件另存爲
// document->dynamicCall("SaveAs (const QString&)",QString("C:/Users/Administrator.WIN-9LOVCBSO17G/Desktop/printModel_create.docx"));
qDebug()<<"---";
//打印文件
document->dynamicCall("PrintOut");
//关闭 并清除内存
delete document;
documents->dynamicCall("Close()",true);
delete documents;
word->dynamicCall("Quit()");
delete word;
操作EXECL文件
修改execl直接通过行,列修改对应值,不用插入标签
打开execl文件
QAxObject *pApplication = pApplication = new QAxObject(); //Excel服务
pApplication->setControl("Excel.Application");
//设置窗口为可见
pApplication->setProperty("Visible",false);
//不显示所有警告
pApplication->setProperty("DisplayAlerts",false);
//直接显示打印预览不需要显sheet内容
pApplication->setProperty("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为例:
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献8条内容
所有评论(0)