最近写程序中需要将数据输出保存到Excel文件中。翻看《C++ GUI Programming with Qt 4》(Second Edition)发现可以在Qt中运用ActiveX控件,这真是太好了。

看了很久教程也没有学会,毕竟是新手,平时也没学过ActiveX编程。一些在VB中可以方便使用的函数在Qt中都没法儿运行。网上的方法也很多解决不了问题,还会报错。也许是版本问题吧,Qt都更新了好几次了。所以只好自己多试几次。经过摸索我的方法如下:

首先在.pro文件中添加CONFIG += qaxcontainer

接着程序实现

  1. QString filepath=QFileDialog::getSaveFileName(this,tr("Save orbit"),".",tr("Microsoft Office 2007 (*.xlsx)"));//获取保存路径
  2. if(!filepath.isEmpty()){
  3. QAxObject *excel = new QAxObject(this);
  4. excel->setControl("Excel.Application");//连接Excel控件
  5. excel->dynamicCall("SetVisible (bool Visible)","false");//不显示窗体
  6. excel->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示
  7. QAxObject *workbooks = excel->querySubObject("WorkBooks");//获取工作簿集合
  8. workbooks->dynamicCall("Add");//新建一个工作簿
  9. QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//获取当前工作簿
  10. QAxObject *worksheets = workbook->querySubObject("Sheets");//获取工作表集合
  11. QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);//获取工作表集合的工作表1,即sheet1
  12. QAxObject *cellX,*cellY;
  13. for(int i=0;i<curRow;i++){
  14. QString X="A"+QString::number(i+1);//设置要操作的单元格,如A1
  15. QString Y="B"+QString::number(i+1);
  16. cellX = worksheet->querySubObject("Range(QVariant, QVariant)",X);//获取单元格
  17. cellY = worksheet->querySubObject("Range(QVariant, QVariant)",Y);
  18. cellX->dynamicCall("SetValue(const QVariant&)",QVariant(ui->tableWidget->formula(i,0).toInt()));//设置单元格的值
  19. cellY->dynamicCall("SetValue(const QVariant&)",QVariant(ui->tableWidget->formula(i,1).toInt()));
  20. }
  21. workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(filepath));//保存至filepath,注意一定要用QDir::toNativeSeparators将路径中的"/"转换为"\",不然一定保存不了。
  22. workbook->dynamicCall("Close()");//关闭工作簿
  23. excel->dynamicCall("Quit()");//关闭excel
  24. delete excel;
  25. excel=NULL;
  26. }

另外附上在网上搜到的一些常用操作:

QAxWidget excel("Excel.Application");
1) 显示当前窗口:
excel.setProperty("Visible", true);
2) 更改 Excel 标题栏:
excel.setProperty("Caption", "Invoke Microsoft Excel");
3) 添加新工作簿:
QAxObject * workbooks = excel.querySubObject("WorkBooks");
workbooks->dynamicCall("Add");
4) 打开已存在的工作簿:
workbooks->dynamicCall("Open (const QString&)", QString("c:/test.xls"));
5) 获取活动工作簿:
QAxObject * workbook = excel.querySubObject("ActiveWorkBook");
6) 获取所有的工作表:
QAxObject * worksheets = workbook->querySubObject("WorkSheets");
7) 获取工作表数量:
int intCount = worksheets->property("Count").toInt();
8) 获取第一个工作表:
QAxObject * worksheet = workbook->querySubObject("Worksheets(int)", 1);
9) 获取cell的值:
QAxObject * range = worksheet->querySubObject("Cells(int,int)", 1, 1 );

以上操作不一定每个都可用(都好用),仅作为参考吧。起码我第9)个就没成功,不知为何?后来我改用了Range(QVariant, QVariant)的方法来替代它。

最后附上我用QAxBase::generateDocumentation()方法获得的对应于Excel.Application的带Qt数据类型的QAxObject或者QAxWidget中可用的属性、信号和槽列表(虽然我还不大会用,不过参考下还是很好的):

http://www.cppblog.com/zhonghua/archive/2014/01/13/205345.html

转 在Qt中用QAxObject来操作Excel的更多相关文章

  1. 在Qt中用QAxObject来操作Excel

        目录(?)[+]   下一篇:用dumpcpp工具生成的excel.h/excel.cpp来操纵Excel 最近写程序中需要将数据输出保存到Excel文件中.翻看<C++ GUI Pro ...

  2. Qt通过ODBC来操作Excel

    示例代码: #include<QtCore/QCoreApplication> #include<QtSql> #include<QObject> #include ...

  3. Qt QAxObject操作excel文件过程总结(转):

    正好同事问道Qt下操作excel. 转自:http://blog.csdn.net/a156392343/article/details/48092515 配制方面: 1.确保Excel软件在本地服务 ...

  4. QT操作EXCEL

    介绍一下最基本的QT对EXCEL的读写操作. 声明:转载于:http://blog.csdn.net/czyt1988/article/details/52121360 在使用QT的操作数据库的时候, ...

  5. Qt之操作Excel

    Visual Basic for Applications(VBA)是一种Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件. ...

  6. qt 操作excel表格

     自己编写的一个Qt C++类,用于操作excel表格,在Qt中操作excel需在.pro中增加CONFIG+=qaxcontainer配置. 1.打开Excel:objExcel = new QAx ...

  7. Qt在windows 平台操作保存execel的表格(通过QAxObject来操作)

    粗略操作 QT += core gui sql CONFIG += qaxcontainer greaterThan(QT_MAJOR_VERSION, 4): QT += widgets #incl ...

  8. [转]Qt 5.5 操作 Excel 的速度 效率问题

    转自:http://blog.csdn.net/li494816491/article/details/50274305 1. QAxObject *_excelObject1 =newQAxObje ...

  9. Qt使用QAxObject快速批量读取Excel内容

    网上各种教程用的方法主要是如下这一句: QAxObject * range = worksheet->querySubObject("Cells(int,int)", 1, ...

随机推荐

  1. Bootstrap表格添加搜索栏

    在学习了表格的分页后,本文尝试在表格顶部加入搜索栏,用来筛选表格的数据,先看一下效果: 未进行搜索时,有394条记录: 在输入乘车码“1”和订单号“20150120”后,只有28条记录: 此处使用了两 ...

  2. spark sql 对接 HDFS

    上一篇博客我向大家介绍了如何快速地搭建spark run on standalone,下面我将介绍saprk sql 如何对接 hdfs 我们知道,在spark shell 中操作hdfs 上的数据是 ...

  3. idea svn 问题

    https://blog.csdn.net/liyantianmin/article/details/52837506

  4. 【SpringCloud构建微服务系列】分布式链路跟踪Spring Cloud Sleuth

    一.背景 随着业务的发展,系统规模越来越大,各微服务直接的调用关系也变得越来越复杂.通常一个由客户端发起的请求在后端系统中会经过多个不同的微服务调用协同产生最后的请求结果,几乎每一个前端请求都会形成一 ...

  5. Technocup 2017 - Elimination Round 1 (Unofficially Open for Everyone, Rated for Div. 2) C

    This is an interactive problem. You should use flush operation after each printed line. For example, ...

  6. JAVA常用知识总结(十)——Maven

    Maven有哪些优点和缺点? 优点如下: 简化了项目依赖管理: 易于上手,对于新手可能一个"mvn clean package"命令就可能满足他的工作 便于项目升级,无论是项目本身 ...

  7. Django的filter查询

    Django的filter查询 name__contains表示精确大小写的模糊查询 使用name__icontains表示忽略大小写 year_count = DownloadFile.object ...

  8. 深度学习中GPU和显存分析

    刚入门深度学习时,没有显存的概念,后来在实验中才渐渐建立了这个意识. 下面这篇文章很好的对GPU和显存总结了一番,于是我转载了过来. 作者:陈云 链接:https://zhuanlan.zhihu. ...

  9. 灰度共生矩阵GLCM分析

    纹理分析是对图像灰度(浓淡)空间分布模式的提取和分析.纹理分析在遥感图像.X射线照片.细胞图像判读和处理方面有广泛的应用.关于纹理,还没有一个统一的数学模型.它起源于表征纺织品表面性质的纹理概念,可以 ...

  10. mongodb sort

    sort() 方法 要在 MongoDB 中的文档进行排序,需要使用sort()方法. sort() 方法接受一个文档,其中包含的字段列表连同他们的排序顺序.要指定排序顺序1和-1. 1用于升序排列, ...