Qt之excel 操作使用说明
学习背景:
适合熟悉些qt开发,但是不是深入了解的开发者学习。具体实现(qt 5.1版本),office2007 Excel做验证,Win 7(64位),如有讲解有误,欢迎斧正!
一.简单介绍
QAxObject是Qt提供的包装COM组件的类,通过COM通过COM操作使用QAxObject类,使用此类,需要在pro文件中添加"QT += axcontainer "。
二.与excel com连接的方法
1. #include <ActiveQt/QAxObject>
2. QAxObject *excel = new QAxObject("Excel.Application"); //!建立excel操作对象,并连接Excel控件
3. excel->dynamicCall("SetVisible (bool Visible)", "false"); //! 设置为不显示窗体
4.excel->setProperty("DisplayAlerts", false); //! 不显示任何警告信息, 如关闭时的是否保存提示
5.excel->dynamicCall("Quit(void)"); //! 关闭excel程序,操作完后记着关闭,由于是隐藏在后台进程中,不关闭进程会有很多excel.exe。
6.workbook->dynamicCall("Close(Boolean)", false); //! 关闭exce程序先关闭.xls文件
三.Excel基本操作
只介绍简单的读写操作,需要修改单元格格式等操作,请"Excel VBA参考手册.chm"
3.1 excel文件操作
获取当前工作簿的集合
1> QAxObject *workbooks = excel->querySubObject("Workbooks"); //! 获取工作簿(excel文件)集合
新建一个工作簿
1> workbooks->synamicCall("Add"); //新建一个工作簿
QAxObject *workbook = excel->querySubObject("ActiveWorkBook"); //! 获取当前工作簿
打开一个已有的工作簿
1>QString filename = "e:/123.xlsx";
2>QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", filename);
保存工作簿
1>workbook->dynamicCall("Save()"); //!保存文件
2>workbook->dynamicCall("Close(Boolean)", false); //! 关闭文件
3>excel->dynamicCall("Quit()"); //! 关闭excel
另存为工作簿
1>QDir::toNativeSeparators,将路径中的"/"转换为"\",否则无法保存,"/"只是qt中可以识别
2>workbook->dynamiCall("SaveAs(const QString&)", QDit::toNativeSeparators(filename));
3>workbook->synamicCall("Close(Boolean)", false); //! 关闭文件
4>excel->dynamicCall("Quit()"); //! 关闭excel
3.2 Sheet工作表操作
获取所有工作表
1> QAxObject *worksheets = workbook->querySubObject("Sheets"):
根据序号获取某个工作表,序号顺序就是excel 打开后下方的排序
1>QAxObject *worksheet = worksheets->querySubObejct("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 大数据量读取
读取所有单元格内容-数据量大,只需要进行一次操作即可读取所有内容,避免重复对每个单元格进行QAxObect操作
1. QVariant var;
2. QAxObject * usedRange = sheet->querySubObject("UseRange"); //! 获取用户区域范围
3. if(NULL == usedRange || usedRange->isNull()){
return var;
}
4. var = usedRange->dynamicCall("Value"); // 读取区域内所有值
5.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>>存储,需要限定范围
1>QAxObject *user_rang = this->sheet->querySubObject("Rang(const QString&)", "A1:D100");
写入数据
1> rang->setProperty("Value", var);
4.3 简单的范例
1 // HRESULT r = OleInitialize(0); 2 // if(r != S_OK && r != S_FALSE) 3 // { 4 //qWaring("Qt:初始化Ole 失败(error %x)", (unsigned int)r); 5 //} 6 QString filename = "e:/123.xlsx"; //具体路径 7 QFile file(filename); 8 bool isExit = file.exists(); 9 if(!isExit) 10 return false; 11 qDebug()<<"isExit"<<isExit; 12 qDebug()<<filename; 13 QAxObject *excel = new QAxObject("Excel.Application"); 14 excel->dynamicCall("SetVisible(bool Visble)", "false"); 15 excel->setProperty("DisplayAlerts", false); 16 QAxObject *workbooks = excel->querySubObject("WorkBooks"); 17 QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", filename); 18 QAxObject *worksheets = workbook->querySubObject("Sheets"); 19 QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1); 20 21 //写入到指定位置 22 QAxObject *workrang = worksheet->querySubObject("Cells(int, int)", 5, 1); 23 //不能这么存 24 workrang->dynamicCall("SetValue(const QString&)", QString("1ssssssfffssssssssssssssssssssssssssssss10987654321")); 25 26 27 //读取出来并打印 28 QAxObject *workrang1 = worksheet->querySubObject("Cells(int,int)", 3, 5); 29 30 QVariant var = workrang1->dynamicCall("Value"); 31 qDebug()<<var; 32 qDebug()<<var.toDouble(); 33 34 //另存保存 35 //workbook->dynamicCall("SaveAs(const QString&)", 36 // QDir::toNativeSeparators(filename)); 37 38 workbook->dynamicCall("Save()", true); 39 //关闭文件 40 workbook->dynamicCall("Close(Boolean)", true); 41 excel->dynamicCall("Quit()"); 42 delete excel; 43 excel = NULL; 44 // OleUninitialize();
4.4 关于权限配置
1):在服务器上安装office的Excel软件.
2):在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务" ,win7 64 可以通过在运行里面输入 comexp.msc -32 来打开32位的组件服务,在里就能看到excel组件了
3):依次双击"组件服务"->"计算机"->"我的电脑"->"DCOM配置"
4):在"DCOM配置"中找到"Microsoft Excel 应用程序",在它上面点击右键,然后点击"属性",弹出"Microsoft Excel 应用程序属性"对话框
5):点击"标识"标签,选择"交互式用户
6):点击"安全"标签,在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"安全性"对话框中填加一个"NETWORK SERVICE"用户
(注意要选择本计算机名),并给它赋予"本地启动"和"本地激活"权限.
7):依然是"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",在弹出的"安全性"对话框中也填加一个"NETWORK SERVICE"用户,然后赋予"本地访问"权限.
8).如果交互式用户设置后出现错误8000401a,可取消交互式用户,指定为administratr,可暂时解决此问题。进一步的解决方式还有待探讨
9).采用第8点的设置后,打开Excel可能会出现“无法使用对象引用或链接”,并且不能进行单元格粘贴。原因不明,取消设置后即可消失。
4.5 关于在分线程中调用QAXObject
请首先初始化COM
代码:
1 HRESULT r = OleInitialize(0); 2 if(r != S_OK && r != S_FALSE) 3 { 4 qWaring("Qt:初始化Ole 失败(error %x)", (unsigned int)r); 5 } 6 OleUninitialize();
2018-08-06 00:22:30
转载于:https://www.cnblogs.com/wang1994/p/9428024.html
Qt之excel 操作使用说明相关推荐
- Qt excel 操作使用说明
一.简单介绍 QAxObject是Qt提供的包装COM组件的类,通过COM通过COM操作使用QAxObject类,使用此类,需要在pro文件中添加 QT += axcontainer 二.与excel ...
- QT之Excel表格操作
QT之Excel表格操作 提前准备 打开读取excel文件 写入保存excel文件 提前准备 pro文件中添加: QT += axcontainer 在需要使用excel的文件中添加: #includ ...
- Qt Excel操作
Qt Excel操作 简单介绍 其他库 基础操作 添加模块 相关代码 遇到的坑 简单介绍 最近在写一个小工具涉及到了Excel操作,顺便学习记录一下.文章内使用的是Windows系统的ActiveX对 ...
- qt对excel的基本操作
qt对excel的基本操作 1.环境 1.1 配置方面 ① 确保Excel软件在本地服务器注册成功,没注册成功的可以通过 在运行中"E:\program Files\Microsoft ...
- QT 制作 Excel 表格常用操作方法
Visual Basic for Applications(VBA)是一种Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件. ...
- qt与excel 一去二三里整理
Visual Basic for Applications(VBA)是一种Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件. ...
- linux qt写入excel文件内容,Qt 读取Excel表格数据 生成Excel表格并写入数据
Qt 读取Excel表格数据 生成Excel表格并写入数据 Qt 读取Excel表格数据 生成Excel表格并写入数据 修改.pro文件,增加 axcontainer QT += axcontaine ...
- QT操纵excel详解2:实现对excel的全面控制
原文地址:点击打开链接 Visual Basic for Applications(VBA)是一种Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microso ...
- QT读取EXCEL表格日期格式问题解决
QT读取EXCEL表格日期时间格式问题解决 问题: Qaxobject类操作excel表格,读取代码中日期格式读取错误,变为数字 eg:2016/7/23 输出打印值为 42574.524513888 ...
最新文章
- 1-1 机器学习和深度学习综述-paddle
- 极度 YM....自己用trie写了个伪 map....( HDU 1075 )
- matlab simulink笔记05 —— 积分模块
- mysql数据库持续_MySql数据库--持续记录ing
- U盘启动装系统的操作方法(U盘PE启动安装GHOST XP)(转载)
- Linux的ssh登录命令,linux命令SSH登录工具常用命令
- idea 配置maven插件
- was cached in the local repository, resolution will not be reattempted until the update interval of
- 浏览器播放语音SpeechSynthesisUtterance
- 广数工业机器人五点法_盘点:国产工业机器人“四小龙”新业绩经营情况
- 【Configuration is still incorrect. Do you want to edit it again?】
- 重磅 | 谱尼测试圆满承办化妆品生产企业研学班
- 数据库笔试面试(第一版)——根据题目完成以下50道SQL语句
- 差点跑进奥运会赛场的“人类计算机之父”
- HDU1302——蜗牛爬井(注意使用float)
- 微信小游戏和微信小程序的区别与共同
- 毕设论文数据分析记录-part2:相关性分析
- c语言停车场程序设计,停车场模拟管理程序的设计与实现,高手指教
- SQL数据库根据指定字段去重
- 计算机系统结构复习(五):ILP指令集并行
热门文章
- hdu 5591 ZYB's Game 博弈论
- 关于Puppet不得不说的故事
- oracle的catalog,oracle学习笔记 RMAN catalog的创建和使用
- 将shell脚本转为python_shell脚本将python脚本加入Linux系统服务
- php如何获取当前时间 格式化,PHP获取当前日期和时间格式化步骤
- plsql创建中文表头_如何使用快捷键来提升Excel斜线表头绘制速度,照着学就行了...
- 服务器系统linux怎么安装教程,CentOS 8.0.1905 linux服务器系统安装与配置图解教程...
- java数组与对象例题,Java的字符串和数组是以对象的形式出现的。()
- php前面有人排队,PHP实现打印类(实现队列排队打印)
- 两两对应成排的 表格 样式