Qt excel 操作使用说明
创始人
2024-02-26 14:06:05
0

一.简单介绍

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

QT  +=  axcontainer

二.与excel com连接的方法

1 #include   
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文件操作

   获取当前工作簿的集合

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

  新建一个工作簿

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

  打开一个已有的工作簿

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

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

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

保存工作簿

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工作表操作

  获取所有工作表

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

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

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 内容操作

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

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

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

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

  4.2 大数据写入

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

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

   写入数据

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"<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()<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();

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

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...