• Qt excel 操作使用说明


    一.简单介绍

        QAxObject是Qt提供的包装COM组件的类,通过COM通过COM操作使用QAxObject类,使用此类,需要在pro文件中添加

    QT  +=  axcontainer

    二.与excel com连接的方法

    1. 1 #include <ActiveQt/QAxObject>
    2. 2 QAxObject *excel = new QAxObject("Excel.Application"); //!建立excel操作对象,并连接Excel控件
    3. 3 excel->dynamicCall("SetVisible (bool Visible)", "false"); //! 设置为不显示窗体
    4. 4 excel->setProperty("DisplayAlerts", false); //! 不显示任何警告信息, 如关闭时的是否保存提示
    5. 5 excel->dynamicCall("Quit(void)"); //! 关闭excel程序,操作完后记着关闭,由于是隐藏在后台进程中,不关闭进程会有很多excel.exe。
    6. 6 workbook->dynamicCall("Close(Boolean)", false); //! 关闭exce程序先关闭.xls文件

    三.Excel基本操作

      只介绍简单的读写操作,需要修改单元格格式等操作,请"Excel VBA参考手册.chm"

      3.1 excel文件操作

       获取当前工作簿的集合

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

      新建一个工作簿

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

      打开一个已有的工作簿

    1. 1 QString filename = "e:/123.xlsx";
    2. 2 QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", filename);

      本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

    CSDN QT大纲:Qt开发必备技术栈学习路线和资料

    保存工作簿

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

      另存为工作簿

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

      3.2 Sheet工作表操作

      获取所有工作表

    QAxObject *worksheets = workbook->querySubObject("Sheets"):

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

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

      获取表中的行数列数

    1. 1 QAxObject* usedrange = worksheet->querySubObject("UsedRange"); //! sheet 范围
    2. 2 int intRowStart = usedrange->property("Row").toInt(); //! 起始行数
    3. 3 int intColStart = usedrange->property("Column").toInt(); //! 起始列数 
    4. 4 QAxObject *rows, *columns;
    5. 5 rows = usedrange->querySubObject("Rows"): //! 行 
    6. 6 columns = usedrange->querySubObject("Columns"); //! 列
    7. 7 int intRow = rows->property("Count").toInt(); //! 行数
    8. 8 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 大数据量读取

        读取所有单元格内容-数据量大,只需要进行一次操作即可读取所有内容,避免重复对每个单元格进行QAxObect操作

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

      此时结果以QVariant保存,需要自行转化为QList>

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

      4.2 大数据写入

      以QList>存储,需要限定范围

    QAxObject *user_rang = this->sheet->querySubObject("Rang(const QString&)", "A1:D100");

       写入数据

    rang->setProperty("Value", var); 

      4.3 简单的范例

    1. 1 // HRESULT r = OleInitialize(0);
    2. 2 // if(r != S_OK && r != S_FALSE)
    3. 3 // {
    4. 4 //qWaring("Qt:初始化Ole 失败(error %x)", (unsigned int)r);
    5. 5 //}
    6. 6 QString filename = "e:/123.xlsx"; //具体路径
    7. 7 QFile file(filename);
    8. 8 bool isExit = file.exists();
    9. 9 if(!isExit)
    10. 10 return false;
    11. 11 qDebug()<<"isExit"<<isExit;
    12. 12 qDebug()<<filename;
    13. 13 QAxObject *excel = new QAxObject("Excel.Application");
    14. 14 excel->dynamicCall("SetVisible(bool Visble)", "false");
    15. 15 excel->setProperty("DisplayAlerts", false);
    16. 16 QAxObject *workbooks = excel->querySubObject("WorkBooks");
    17. 17 QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", filename);
    18. 18 QAxObject *worksheets = workbook->querySubObject("Sheets");
    19. 19 QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1);
    20. 20
    21. 21 //写入到指定位置
    22. 22 QAxObject *workrang = worksheet->querySubObject("Cells(int, int)", 5, 1);
    23. 23 //不能这么存
    24. 24 workrang->dynamicCall("SetValue(const QString&)", QString("1ssssssfffssssssssssssssssssssssssssssss10987654321"));
    25. 25
    26. 26
    27. 27 //读取出来并打印
    28. 28 QAxObject *workrang1 = worksheet->querySubObject("Cells(int,int)", 3, 5);
    29. 29
    30. 30 QVariant var = workrang1->dynamicCall("Value");
    31. 31 qDebug()<<var;
    32. 32 qDebug()<<var.toDouble();
    33. 33
    34. 34 //另存保存
    35. 35 //workbook->dynamicCall("SaveAs(const QString&)",
    36. 36 // QDir::toNativeSeparators(filename));
    37. 37
    38. 38 workbook->dynamicCall("Save()", true);
    39. 39 //关闭文件
    40. 40 workbook->dynamicCall("Close(Boolean)", true);
    41. 41 excel->dynamicCall("Quit()");
    42. 42 delete excel;
    43. 43 excel = NULL;
    44. 44 // OleUninitialize();

    本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓ 

  • 相关阅读:
    力扣(103、236、104)
    183.Hive(五):面试题解析:连续问题、分组问题、间隔分组问题、打折日期交叉问题,同时在线问题
    PMI-ACP练习题(26)
    web概述13
    [附源码]java毕业设计校园闲置物品交易
    java毕业设计—— 基于java+JavaEE+jsp的售后服务管理系统设计与实现(毕业论文+程序源码)——售后服务管理系统
    Docker 安装 MySQL、Redis
    企业APP软件定制开发的关键步骤|网站小程序搭建
    java面试题之 int和Integer的区别
    【云原生 | Kubernetes 系列】---Ceph Crush
  • 原文地址:https://blog.csdn.net/m0_73443478/article/details/128086534