学习背景:

    适合熟悉些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 操作使用说明相关推荐

  1. Qt excel 操作使用说明

    一.简单介绍 QAxObject是Qt提供的包装COM组件的类,通过COM通过COM操作使用QAxObject类,使用此类,需要在pro文件中添加 QT += axcontainer 二.与excel ...

  2. QT之Excel表格操作

    QT之Excel表格操作 提前准备 打开读取excel文件 写入保存excel文件 提前准备 pro文件中添加: QT += axcontainer 在需要使用excel的文件中添加: #includ ...

  3. Qt Excel操作

    Qt Excel操作 简单介绍 其他库 基础操作 添加模块 相关代码 遇到的坑 简单介绍 最近在写一个小工具涉及到了Excel操作,顺便学习记录一下.文章内使用的是Windows系统的ActiveX对 ...

  4. qt对excel的基本操作

    qt对excel的基本操作 1.环境 1.1 配置方面 ​ ① 确保Excel软件在本地服务器注册成功,没注册成功的可以通过 在运行中"E:\program Files\Microsoft ...

  5. QT 制作 Excel 表格常用操作方法

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

  6. qt与excel 一去二三里整理

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

  7. linux qt写入excel文件内容,Qt 读取Excel表格数据 生成Excel表格并写入数据

    Qt 读取Excel表格数据 生成Excel表格并写入数据 Qt 读取Excel表格数据 生成Excel表格并写入数据 修改.pro文件,增加 axcontainer QT += axcontaine ...

  8. QT操纵excel详解2:实现对excel的全面控制

    原文地址:点击打开链接 Visual Basic for Applications(VBA)是一种Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microso ...

  9. QT读取EXCEL表格日期格式问题解决

    QT读取EXCEL表格日期时间格式问题解决 问题: Qaxobject类操作excel表格,读取代码中日期格式读取错误,变为数字 eg:2016/7/23 输出打印值为 42574.524513888 ...

最新文章

  1. 1-1 机器学习和深度学习综述-paddle
  2. 极度 YM....自己用trie写了个伪 map....( HDU 1075 )
  3. matlab simulink笔记05 —— 积分模块
  4. mysql数据库持续_MySql数据库--持续记录ing
  5. U盘启动装系统的操作方法(U盘PE启动安装GHOST XP)(转载)
  6. Linux的ssh登录命令,linux命令SSH登录工具常用命令
  7. idea 配置maven插件
  8. was cached in the local repository, resolution will not be reattempted until the update interval of
  9. 浏览器播放语音SpeechSynthesisUtterance
  10. 广数工业机器人五点法_盘点:国产工业机器人“四小龙”新业绩经营情况
  11. 【Configuration is still incorrect. Do you want to edit it again?】
  12. 重磅 | 谱尼测试圆满承办化妆品生产企业研学班
  13. 数据库笔试面试(第一版)——根据题目完成以下50道SQL语句
  14. 差点跑进奥运会赛场的“人类计算机之父”
  15. HDU1302——蜗牛爬井(注意使用float)
  16. 微信小游戏和微信小程序的区别与共同
  17. 毕设论文数据分析记录-part2:相关性分析
  18. c语言停车场程序设计,停车场模拟管理程序的设计与实现,高手指教
  19. SQL数据库根据指定字段去重
  20. 计算机系统结构复习(五):ILP指令集并行

热门文章

  1. hdu 5591 ZYB's Game 博弈论
  2. 关于Puppet不得不说的故事
  3. oracle的catalog,oracle学习笔记 RMAN catalog的创建和使用
  4. 将shell脚本转为python_shell脚本将python脚本加入Linux系统服务
  5. php如何获取当前时间 格式化,PHP获取当前日期和时间格式化步骤
  6. plsql创建中文表头_如何使用快捷键来提升Excel斜线表头绘制速度,照着学就行了...
  7. 服务器系统linux怎么安装教程,CentOS 8.0.1905 linux服务器系统安装与配置图解教程...
  8. java数组与对象例题,Java的字符串和数组是以对象的形式出现的。()
  9. php前面有人排队,PHP实现打印类(实现队列排队打印)
  10. 两两对应成排的 表格 样式