Qt-excel文件操作方法
本文标题:Qt-excel文件操作方法 本文地址:http://techieliang.com/2017/11/464/
1. Qt-QAxObject
QAxObject是Qt提供的包装COM组件的类,通过COM操作Excel需要使用QAxObject类,使用此类还需要在pro文件增加“QT += axcontainer”
QAxObject的具体说明请见帮助文档
2. 与excel com连接的方法
- #include <QAxObject> //注意包含此头文件,同时在pro增加QT+= axcontainer
- QAxObject *excel = new QAxObject(this);//建立excel操作对象
- excel->setControl("Excel.Application");//连接Excel控件
- excel->dynamicCall("SetVisible (bool Visible)","false");//设置为不显示窗体
- excel->setProperty("DisplayAlerts", false);//不显示任何警告信息,如关闭时的是否保存提示
- excel->dynamicCall(?"Quit(void)"?);//关闭excel程序,操作完成后记着关闭,由于是隐藏的看不到,不关闭进程会有很多excel.exe
- //关闭excel程序之前记着先关闭.xls文件,具体见后续内容:workbook->dynamicCall("Close(Boolean)", false); //关闭文件
3. Excel基本操作
下面只介绍主要读写操作的方法,若需要修改单元格格式等操作,请看“Excel VBA参考手册.chm”或者其他类似资料
手册分享地址: 链接: https://pan.baidu.com/s/1pLvC5nl 密码: dnik
3.1. excel文件操作
获取当前工作簿的集合
- QAxObject *workbooks = excel->querySubObject("WorkBooks");//获取工作簿(excel文件)集合
新建一个工作簿
- workbooks->dynamicCall("Add");//新建一个工作簿
- QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//获取当前工作簿
打开一个已有的工作簿
- QString excel_file_path = "XXXX.xlsx";
- QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", excel_file_path);
保存工作簿
- workbook->dynamicCall("Save()"); //保存文件
- workbook->dynamicCall("Close(Boolean)", false); //关闭文件
- excel->dynamicCall(?"Quit(void)"?);//关闭excel
另存为工作簿
- //用QDir::toNativeSeparators, 将路径中的"/"转换为"\",否则无法保存,/只是qt中可以识别
- workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(excel_file_path));
- workbook->dynamicCall("Close (Boolean)", false); //关闭文件
- excel->dynamicCall(?"Quit(void)"?);//关闭excel
3.2. sheet工作表操作
下面的代码用到的workbook都是上面工作簿操作后得到的,也就是对某一个工作簿(excel文件)进行操作
获取所有工作表
- QAxObject *worksheets = workbook->querySubObject("Sheets");
根据序号获取某个工作表,序号顺序就是excel打开后下方的排序
- QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);
获取表中的行数列数
- QAxObject* usedrange = worksheet->querySubObject("UsedRange");//sheet范围
- int intRowStart = usedrange->property("Row").toInt();//起始行数
- int intColStart = usedrange->property("Column").toInt(); //起始列数
- QAxObject *rows, *columns;
- rows = usedrange->querySubObject("Rows");//行
- columns = usedrange->querySubObject("Columns");//列
- int intRow = rows->property("Count").toInt();//行数
- int intCol = columns->property("Count").toInt();//列数
3.3. 内容操作
数据内容操作-获取单元格-基于坐标
- QAxObject* cell = worksheet->querySubObject("Cells(int, int)", i, j);
数据内容操作-获取单元格-基于行列名称
- QAxObject* cell = worksheet->querySubObject("Range(QVariant, QVariant)", "A1");
数据内容操作-读单元格内容
- QVariant cell_value = cell->property("Value");
数据内容操作-写单元格内容
- cell->setProperty("Value", "内容");
4. 其他
4.1. 大数据量读取
读取所有单元格内容-数据量大请使用此方式,只需要进行一次操作即可读取所有内容到内容,避免重复每个单元格进行QAxObject操作
- QVariant var;
- QAxObject *usedRange = sheet->querySubObject("UsedRange");//获取用户区域范围
- if(NULL == usedRange || usedRange->isNull()) {
- return var;
- }
- var = usedRange->dynamicCall("Value");//读取区域内所有值
- delete usedRange;
此时结果以QVariant保存,需要自行转换成QList<QList<QVariant>>
- QList<QList<QVariant>> excel_list;
- auto rows = var.toList();
- for(auto row:rows) {
- excel_list.append(row.toList());
- }
4.2. 大数据量写入
大数据以QList<QList<QVariant>>存储,与读取类似,此处需要先指定区域范围
- QAxObject *user_range = this->sheet->querySubObject("Range(const QString&)","A1:D100");//范围
然后写入数据
- range->setProperty("Value", var);//需要将QList<QList<QVarient>>转换为QVarient
4.3. 范例:一个完整的打开-读取-关闭的操作
- QString excel_file_path = QDir::currentPath()+"/a.xlsx";
- excel_file_path = QDir::toNativeSeparators(excel_file_path);
- QAxObject *excel = new QAxObject(this);//建立excel操作对象
- excel->setControl("Excel.Application");//连接Excel控件
- excel->setProperty("Visible", true);//显示窗体看效果
- excel->setProperty("DisplayAlerts", true);//显示警告看效果
- QAxObject *workbooks = excel->querySubObject
- ("WorkBooks");//获取工作簿(excel文件)集合
- workbooks->dynamicCall("Open(const QString&)", excel_file_path);
- QAxObject *workbook = excel->querySubObject("ActiveWorkBook");
- QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",1);
- QAxObject *usedRange = worksheet->querySubObject("UsedRange");
- QVariant var = usedRange->dynamicCall("Value");//这里是所有的内容
- workbook->dynamicCall( "Close(Boolean)", false );
- excel->dynamicCall( "Quit(void)" );
- delete excel;
注意:
1、此范例为了看到效果吧窗口和警告设置为了显示,请自行改为false
2、excel所有操作均是通过QAxObject 进行COM组件的操作,包括打开文件也是,所以路径必须传递完整路径,不能传递相对路径
3、QAxObject自身会维护new出的空间,直接delete第一个QAxObject 即可
4、所有内容保存在var的变量中
5、上述操作均为判断返回值,若文件不存在后续内容会报错
Qt-excel文件操作方法的更多相关文章
- MFC_VC++_时间获取与保存列表控件内容到文件操作方法
MFC_VC++_时间获取与保存列表控件内容到excel文件操作方法 void CDataView::OnBnClickedBtnExporttoexcel() { CTime time = CTim ...
- Qt中将QTableView中的数据导出为Excel文件
如果你在做一个报表类的程序,可能将内容导出为Excel文件是一项必须的功能.之前使用MFC的时候我就写过一个类,用于将grid中的数据导出为Excel文件.在使用了QtSql模块后,我很容易的将这个类 ...
- 第15.25节 PyQt(Python+Qt)入门学习:Model/View开发实战--使用QTableView展示Excel文件内容
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在前面的订阅专栏<第十九章.Model/View开发:QTableView的功能及属 ...
- Qt 解析EXcel文件
写代码需要将excel中的文件导入到数据库中 网上找到以为大神写的,但是当初没有保存,也没有找到 我几乎是原分不动拔下来的,希望大神莫怪 void AddDialog::readExcel(QStri ...
- 【原创】.NET读写Excel工具Spire.Xls使用(2)Excel文件的控制
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html .NET读写Excel工具Spire.Xls使用文章 ...
- 如何生成excel文件作为图像识别结果
如何生成excel文件作为图像识别结果 在进行大规模图像处理的时候,如果能够以表格的形式生成结果文件,将非常的直观.这个时候,选择excel作为结果输出文件,将是合适的. 查询相关资料,有很多关于ex ...
- Excel文件操作方式比较
C++读取Excel的XLS文件的方法有很多,但是也许就是因为方法太多,大家在选择的时候会很疑惑. 由于前两天要做导表工具,比较了常用的方法,总结一下写个短文, 1.OLE的方式 这个大约是最常用的方 ...
- C++读写EXCEL文件OLE,java读写excel文件POI 对比
C++读写EXCEL文件方式比较 有些朋友问代码的问题,将OLE读写的代码分享在这个地方,大家请自己看.http://www.cnblogs.com/destim/p/5476915.html C++ ...
- 记录python接口自动化测试--把操作excel文件的方法封装起来(第五目)
前面补充了如何来操作excel文件,这次把如何获取excel文件的sheet对象.行数.单元格数据的方法进行封装,方便后面调用 handle_excel.py# coding:utf-8 import ...
随机推荐
- log4j配置输出日志文件
在测试程序时,有时候运行一次可能需要很久,把日志文件保存下来是很有必要的,本文给出了scala程序输出日志文件的方式,同时使用本人的另一篇博客中介绍的将log4j.properties放到程序jar包 ...
- 利用 Python 插件 xlwings 读写 Excel
Python 通过 xlwings 读取 Excel 数据 去年底公司让我做设备管理,多次委婉拒绝,最终还是做了.其实我比较喜欢技术.做管理后发现现场没有停机率统计,而原始数据有,每次要自己在Exce ...
- python爬虫#数据存储#JSON/CSV/MYSQL/MongoDB/
Json数据处理 JSON支持数据格式: 对象(字典).使用花括号. 数组(列表).使用方括号. 整形.浮点型.布尔类型还有null类型. 字符串类型(字符串必须要用双引号,不能用单引号). 多个数据 ...
- andriod学习一
1.Android软件栈 2.Android模拟器 Android SDK 可以通过ADT+Eclipse或者命令行开发,调试,测试应用程序,设备可以使用模拟器或者真实设备, ...
- katalon系列七:Katalon Studio全局变量
假如你有3个脚本都用到了用户名,如果是写死在脚本中,那么需要改变的时候,你需要修改3个地方,我们可以把用户名设为全局变量,在3个脚本中引用,需要修改时只要修改全局变量中的用户名值即可. 在Katalo ...
- selenium元素定位(三)
使用selenium就不可避免的要提到界面元素定位,通过元素定位来实现一系列的逻辑操作. selenium提供了8中元素定位的方式: id.name.class name.tag name.link ...
- 第六阶段·数据库MySQL及NoSQL实践第1章·章节一MySQL数据库
01 课程介绍 02 数据库管理系统介绍 03 MySQL安装方式介绍及源码安装 04 MySQL安装后的基本配置 05 MySQL体系结构-服务器.客户端模型 06 MySQL体系结构-实例.连接层 ...
- HDU - 6440(费马小定理)
链接:HDU - 6440 题意:重新定义加法和乘法,使得 (m+n)^p = m^p + n^p 成立,p是素数.,且satisfied that there exists an integer q ...
- LeetCode - 13. Roman to Integer - 思考if-else与switch的比较 - ( C++ ) - 解题报告
1.题目: 原题:Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range ...
- c# html 导出excel
[CustomAuthorize] public FileResult ExportCustomerManagerVisitExcel(string dateType, string r ...