版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:
本文标题:Qt-excel文件操作方法     本文地址:http://techieliang.com/2017/11/464/

1. Qt-QAxObject

QAxObject是Qt提供的包装COM组件的类,通过COM操作Excel需要使用QAxObject类,使用此类还需要在pro文件增加“QT += axcontainer”

QAxObject的具体说明请见帮助文档

2. 与excel com连接的方法

  1. #include <QAxObject> //注意包含此头文件,同时在pro增加QT+= axcontainer
  2. QAxObject *excel = new QAxObject(this);//建立excel操作对象
  3. excel->setControl("Excel.Application");//连接Excel控件
  4. excel->dynamicCall("SetVisible (bool Visible)","false");//设置为不显示窗体
  5. excel->setProperty("DisplayAlerts", false);//不显示任何警告信息,如关闭时的是否保存提示
  6. excel->dynamicCall(?"Quit(void)"?);//关闭excel程序,操作完成后记着关闭,由于是隐藏的看不到,不关闭进程会有很多excel.exe
  7. //关闭excel程序之前记着先关闭.xls文件,具体见后续内容:workbook->dynamicCall("Close(Boolean)", false); //关闭文件

3. Excel基本操作

下面只介绍主要读写操作的方法,若需要修改单元格格式等操作,请看“Excel VBA参考手册.chm”或者其他类似资料

手册分享地址: 链接: https://pan.baidu.com/s/1pLvC5nl 密码: dnik

3.1. excel文件操作

获取当前工作簿的集合

  1. QAxObject *workbooks = excel->querySubObject("WorkBooks");//获取工作簿(excel文件)集合

新建一个工作簿

  1. workbooks->dynamicCall("Add");//新建一个工作簿
  2. QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//获取当前工作簿

打开一个已有的工作簿

  1. QString excel_file_path = "XXXX.xlsx";
  2. QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", excel_file_path);

保存工作簿

  1. workbook->dynamicCall("Save()"); //保存文件
  2. workbook->dynamicCall("Close(Boolean)", false); //关闭文件
  3. excel->dynamicCall(?"Quit(void)"?);//关闭excel

另存为工作簿

  1. //用QDir::toNativeSeparators, 将路径中的"/"转换为"\",否则无法保存,/只是qt中可以识别
  2. workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(excel_file_path));
  3. workbook->dynamicCall("Close (Boolean)", false); //关闭文件
  4. excel->dynamicCall(?"Quit(void)"?);//关闭excel

3.2. sheet工作表操作

下面的代码用到的workbook都是上面工作簿操作后得到的,也就是对某一个工作簿(excel文件)进行操作

获取所有工作表

  1. QAxObject *worksheets = workbook->querySubObject("Sheets");

根据序号获取某个工作表,序号顺序就是excel打开后下方的排序

  1. QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);

获取表中的行数列数

  1. QAxObject* usedrange = worksheet->querySubObject("UsedRange");//sheet范围
  2. int intRowStart = usedrange->property("Row").toInt();//起始行数
  3. int intColStart = usedrange->property("Column").toInt(); //起始列数
  4. QAxObject *rows, *columns;
  5. rows = usedrange->querySubObject("Rows");//行
  6. columns = usedrange->querySubObject("Columns");//列
  7. int intRow = rows->property("Count").toInt();//行数
  8. int intCol = columns->property("Count").toInt();//列数

3.3. 内容操作

数据内容操作-获取单元格-基于坐标

  1. QAxObject* cell = worksheet->querySubObject("Cells(int, int)", i, j);

数据内容操作-获取单元格-基于行列名称

  1. QAxObject* cell = worksheet->querySubObject("Range(QVariant, QVariant)", "A1");

数据内容操作-读单元格内容

  1. QVariant cell_value = cell->property("Value");

数据内容操作-写单元格内容

  1. cell->setProperty("Value", "内容");

4. 其他

4.1. 大数据量读取

读取所有单元格内容-数据量大请使用此方式,只需要进行一次操作即可读取所有内容到内容,避免重复每个单元格进行QAxObject操作

  1. QVariant var;
  2. QAxObject *usedRange = sheet->querySubObject("UsedRange");//获取用户区域范围
  3. if(NULL == usedRange || usedRange->isNull()) {
  4. return var;
  5. }
  6. var = usedRange->dynamicCall("Value");//读取区域内所有值
  7. delete usedRange;

此时结果以QVariant保存,需要自行转换成QList<QList<QVariant>>

  1. QList<QList<QVariant>> excel_list;
  2. auto rows = var.toList();
  3. for(auto row:rows) {
  4. excel_list.append(row.toList());
  5. }

4.2. 大数据量写入

大数据以QList<QList<QVariant>>存储,与读取类似,此处需要先指定区域范围

  1. QAxObject *user_range = this->sheet->querySubObject("Range(const QString&)","A1:D100");//范围

然后写入数据

  1. range->setProperty("Value", var);//需要将QList<QList<QVarient>>转换为QVarient

4.3. 范例:一个完整的打开-读取-关闭的操作

  1. QString excel_file_path = QDir::currentPath()+"/a.xlsx";
  2. excel_file_path = QDir::toNativeSeparators(excel_file_path);
  3. QAxObject *excel = new QAxObject(this);//建立excel操作对象
  4. excel->setControl("Excel.Application");//连接Excel控件
  5. excel->setProperty("Visible", true);//显示窗体看效果
  6. excel->setProperty("DisplayAlerts", true);//显示警告看效果
  7. QAxObject *workbooks = excel->querySubObject
  8. ("WorkBooks");//获取工作簿(excel文件)集合
  9. workbooks->dynamicCall("Open(const QString&)", excel_file_path);
  10. QAxObject *workbook = excel->querySubObject("ActiveWorkBook");
  11. QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",1);
  12. QAxObject *usedRange = worksheet->querySubObject("UsedRange");
  13. QVariant var = usedRange->dynamicCall("Value");//这里是所有的内容
  14. workbook->dynamicCall( "Close(Boolean)", false );
  15. excel->dynamicCall( "Quit(void)" );
  16. delete excel;

注意:
1、此范例为了看到效果吧窗口和警告设置为了显示,请自行改为false
2、excel所有操作均是通过QAxObject 进行COM组件的操作,包括打开文件也是,所以路径必须传递完整路径,不能传递相对路径
3、QAxObject自身会维护new出的空间,直接delete第一个QAxObject 即可
4、所有内容保存在var的变量中
5、上述操作均为判断返回值,若文件不存在后续内容会报错

Qt-excel文件操作方法的更多相关文章

  1. MFC_VC++_时间获取与保存列表控件内容到文件操作方法

    MFC_VC++_时间获取与保存列表控件内容到excel文件操作方法 void CDataView::OnBnClickedBtnExporttoexcel() { CTime time = CTim ...

  2. Qt中将QTableView中的数据导出为Excel文件

    如果你在做一个报表类的程序,可能将内容导出为Excel文件是一项必须的功能.之前使用MFC的时候我就写过一个类,用于将grid中的数据导出为Excel文件.在使用了QtSql模块后,我很容易的将这个类 ...

  3. 第15.25节 PyQt(Python+Qt)入门学习:Model/View开发实战--使用QTableView展示Excel文件内容

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在前面的订阅专栏<第十九章.Model/View开发:QTableView的功能及属 ...

  4. Qt 解析EXcel文件

    写代码需要将excel中的文件导入到数据库中 网上找到以为大神写的,但是当初没有保存,也没有找到 我几乎是原分不动拔下来的,希望大神莫怪 void AddDialog::readExcel(QStri ...

  5. 【原创】.NET读写Excel工具Spire.Xls使用(2)Excel文件的控制

                  本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html .NET读写Excel工具Spire.Xls使用文章 ...

  6. 如何生成excel文件作为图像识别结果

    如何生成excel文件作为图像识别结果 在进行大规模图像处理的时候,如果能够以表格的形式生成结果文件,将非常的直观.这个时候,选择excel作为结果输出文件,将是合适的. 查询相关资料,有很多关于ex ...

  7. Excel文件操作方式比较

    C++读取Excel的XLS文件的方法有很多,但是也许就是因为方法太多,大家在选择的时候会很疑惑. 由于前两天要做导表工具,比较了常用的方法,总结一下写个短文, 1.OLE的方式 这个大约是最常用的方 ...

  8. C++读写EXCEL文件OLE,java读写excel文件POI 对比

    C++读写EXCEL文件方式比较 有些朋友问代码的问题,将OLE读写的代码分享在这个地方,大家请自己看.http://www.cnblogs.com/destim/p/5476915.html C++ ...

  9. 记录python接口自动化测试--把操作excel文件的方法封装起来(第五目)

    前面补充了如何来操作excel文件,这次把如何获取excel文件的sheet对象.行数.单元格数据的方法进行封装,方便后面调用 handle_excel.py# coding:utf-8 import ...

随机推荐

  1. 用树莓派3B+和 ITEAD PN532 读取、破解、写入M1卡

    这是一篇介绍如何用树莓派使用PN532的随笔,介绍了具体的使用步骤. 首先介绍一下: ①.IC卡是非接触式的智能卡,里面一般是一个方形线圈和一个小芯片(用强光照着可以看到).M1卡是IC卡的一种,一般 ...

  2. Python基本语法元素

      静态语言(C/C++.Java):脚本语言(python.JavaScript.PHP) IPO(Input.Process.Output) #:python中的注释符号:'''    ''':多 ...

  3. 『Python题库 - 填空题』151道Python笔试填空题

    『Python题库 - 填空题』Python笔试填空题 part 1. Python语言概述和Python开发环境配置 part 2. Python语言基本语法元素(变量,基本数据类型, 基础运算) ...

  4. MQTT客户端

    MQTT客户端 最近公司项目中使用到了一个MQTT的协议,用这个通讯协议将嵌入式端收集到的数据接入到物联网中,很是方便的解决了,嵌入式端存储空间小,也解决了用户需要自定义使用这些记录数据的需求.而且相 ...

  5. LeetCode初级算法的Python实现--链表

    LeetCode初级算法的Python实现--链表 之前没有接触过Python编写的链表,所以这里记录一下思路.这里前面的代码是和leetcode中的一样,因为做题需要调用,所以下面会给出. 首先定义 ...

  6. 广州Uber优步司机奖励政策(1月4日~1月10日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  7. mySql——case when else ....demo

    DROP PROCEDURE IF EXISTS Pro_query_change_charge_by_layer_report; CREATE PROCEDURE Pro_query_change_ ...

  8. 无偏方差为什么除以n-1

    设样本均值为,样本方差为,总体均值为,总体方差为,那么样本方差有如下公式:. 很多人可能都会有疑问,为什么要除以n-1,而不是n,但是翻阅资料,发现很多都是交代到,如果除以n,对样本方差的估计不是无偏 ...

  9. 银行系统ps:不太完善,蟹蟹评论

    # 主程序运行 import time from guanli import GuanLi from atm import ATM from user import User def main(): ...

  10. 换抵挡装置 (Kickdown,ACM/ICPC NEERC 2006,UVa1588

    题目描述:算法竞赛入门经典习题3-11 题目思路:1.两长条移动匹配 2.上下调换,取小者 #include <stdio.h> #include <string.h> int ...