赞
踩
项目需要界面上加一个将表格数据保存至本地,存成excel.和打印预览。查了网上一些资料。发现有两种方法。
1. (.pro)工程文件中加入 “QT+= printsupport” 使用QPrinter和QprintDialog类。
2. (.pro)工程文件中加入 “QT+= axcontainer” 使用QAxObject
因为使用的是第二种,所以第一种方式只是做个记录,哪天需要使用再深究。
先上一下网上总结很好的一些知识:
参考原文:https://blog.csdn.net/fcqwin/article/details/17885557
Qt的windows商业版本提供了ActiveQt这个framework,使用这个组件我们可以在Qt中使用ActiveX控件,并且也可以开发基于Qt的ActiveX控件。ActiveQt包含了两个组件QAxContainer和QAxServer。
l QAxContainer允许我们使用COM对象,并且可以将将ActiveX控件嵌入到Qt程序中去。
l QAxServer可以将我们写的Qt控件导出为COM对象或者是ActiveX控件。
这次由于只是操作Excel进行读取写入,故只用到了QAxContainer。
操作Excel接口说明
其实接口只有几个:
属性方面的:
bool setProperty(const char *name, const QVariant &value);
QVariant property(const char *name) const;
对象方面的:
QAxObject* querySubObject(const char *name, const QVariant &v1 = QVariant(),……)
对象方法方面的:(函数)
QVariant dynamicCall(const char *name, const QVariant &v1 = QVariant(), ……)
基本的操作流程都是:先是querySubObject() 获取某一个子对象,然后可以对其设置属性setProperty()或读取属性property(),进一步可以调用dynamicCall()来实现对其进行操作。
清楚了以上的知识,就可以使用QAxObject来操作excel
下面是打印预览的一些代码:思路就是先把界面上表格的数据存到本地,然后去操作本地excel文件,打印预览。退出后删除文件
- SaveExcelFile(ui->tableWidget,hideColList,titleList,filePath);
-
- QAxObject* pApplication = NULL;
- QAxObject* pWorkBooks = NULL;
- QAxObject* pWorkBook = NULL;
- QAxObject* pSheets = NULL;
- QAxObject* pSheet = NULL;
-
- pApplication = new QAxObject();
- pApplication->setControl("Excel.Application");//连接Excel控件
- pApplication->dynamicCall("SetVisible(bool)", true);//false不显示窗体
- pApplication->setProperty("DisplayAlerts", false);//不显示任何警告信息。
- pApplication->setProperty("ScreenUpdating",false);//直接显示打印预览不需要显sheet内容
- pWorkBooks = pApplication->querySubObject("Workbooks");
- pWorkBook = pWorkBooks->querySubObject("Open(const QString &)", filePath);
- pSheets = pWorkBook->querySubObject("Sheets");//所有sheets
- pSheet = pSheets->querySubObject("Item(int)", 1);//第一个sheet
-
- //显示预览设置里的网格线(默认是没有网格线的)
- pSheet->querySubObject("PageSetup")->setProperty("PrintGridlines",true);
-
- //调出excel打印预览(此地方为阻塞状态,退出excel预览后,才执行下面的代码)
- pWorkBook->dynamicCall("PrintPreview");
-
- pWorkBook->dynamicCall("Close(bool)",false);//关闭工作簿
- //关闭excel
- if (pApplication != NULL)
- {
- pApplication->dynamicCall("Quit()");
- delete pApplication;
- pApplication = NULL;
- }
-
- //删除文件
- QFile tempFile(filePath);
- if(tempFile.exists())
- {
- tempFile.remove();
- }
看到这里,会有初次使用者发出这样一个疑问。这些属性字段怎么来的。比如setProperty("PrintGridlines",true);这个怎么来。打印预览(dynamicCall("PrintPreview");)怎么来?
下面就要是干货了。VBA手册上有所有对象方法,传参,属性的解释。https://docs.microsoft.com/zh-CN/office/vba/api/overview/excel 但单单看这个是不够的。这时候要借助office或者wps 自带的VBA宏。这样就可以慢慢的找出想要设置的功能。
因为我使用的是WPS(打个广告先,个人以为比office好用一些,不收费,安装还省空间、时间)。
如果没有装插件,可以先下载一个vba for wps 宏插件。
安装好之后就可以出现以上的图。
1.点击录制新宏
2.然后去操作你需要的效果如打印预览,加入网格线。停止宏
3.打开宏,选择刚才的录制,点击编辑
4.查看VBA代码,发现我们想要的属性已经找到。
是不是很简答,赶快来动动手吧。
同时参考:https://blog.csdn.net/u010304326/article/details/82292195
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。