Qt之初识 QAxObject (附打印预览demo)

项目需要界面上加一个将表格数据保存至本地,存成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

  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 QAxObject 类来读取 Excel 文件中的数据,并将其显示在 Qt 的 TableWidget 控件中。以下是一个简单的示例代码: ```cpp #include <QAxObject> #include <QTableWidget> void readExcelFile(QString fileName, QTableWidget *tableWidget) { QAxObject excel("Excel.Application", 0); QAxObject *workbooks = excel.querySubObject("Workbooks"); QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", fileName); QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1); QAxObject *usedrange = worksheet->querySubObject("UsedRange"); QAxObject *rows = usedrange->querySubObject("Rows"); QAxObject *columns = usedrange->querySubObject("Columns"); int rowCount = rows->property("Count").toInt(); int columnCount = columns->property("Count").toInt(); tableWidget->setRowCount(rowCount); tableWidget->setColumnCount(columnCount); for (int i = 1; i <= rowCount; i++) { for (int j = 1; j <= columnCount; j++) { QAxObject *cell = worksheet->querySubObject("Cells(int,int)", i, j); QVariant value = cell->dynamicCall("Value()"); QString strValue = value.toString(); tableWidget->setItem(i - 1, j - 1, new QTableWidgetItem(strValue)); delete cell; } } delete columns; delete rows; delete usedrange; delete worksheet; workbook->dynamicCall("Close()"); delete workbook; delete workbooks; excel.dynamicCall("Quit()"); } ``` 调用示例: ```cpp QTableWidget *tableWidget = new QTableWidget(this); readExcelFile("test.xlsx", tableWidget); ``` 其中,"test.xlsx" 为 Excel 文件名,tableWidget 为要显示数据的 TableWidget 控件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值