配置xxx.pro
引入Active Qt库

QT += axcontainer

引入objbase.h,解决返回QAxObject为空的问题

1 #include <objbase.h>
2
3 //在需要创建QAxObject()上方调用如下代码
4 CoInitializeEx(NULL, COINIT_MULTITHREADED);
5 m_pExcel = new(std::nothrow) QAxObject();

因为QAxObject默认是在单线程下使用的,因此如果不用上门代码申明多线程, 会导致获取的excel的QAxObject都是NULL

保存或者打开excel的路径需要统一用"\"
用QDir::toNativeSeparators(m_strPath)进行转换
m_pWorkbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(m_strPath));

SaveAs必须在所有操作结束后调用,否则不会保存到excel中
可以放到close前调用即可

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

1 m_pWorkbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(m_strPath));
2 m_pWorkbook->dynamicCall("Close()");
3 m_pExcel->dynamicCall("Quit()");
4 delete m_pExcel;
5 m_pExcel = NULL;

Demo

 1 #ifndef EXCELOPERATOR_H2 #define EXCELOPERATOR_H3 4 #include <QObject>5 #include <ActiveQt/QAxObject>6 #include <QDebug>7 #include <QDir>8 9 class ExcelOperator : public QObject
10 {
11     Q_OBJECT
12 public:
13     explicit ExcelOperator(QObject *parent = nullptr);
14     ~ExcelOperator();
15     //打开文件
16     bool open(QString path);
17     //关闭文件
18     bool close();
19     //获取工作表数量
20     int getSheetsCount();
21     //根据名称创建工作表
22     QAxObject* addSheet(QString name);
23     //根据名称删除工作表
24     bool delSheet(QString name);
25     //根据编号删除工作表
26     bool delSheet(int index);
27     //根据名称获取工作表
28     QAxObject* getSheet(QString name);
29     //根据编号获取工作表
30     QAxObject* getSheet(int index);
31     //获取行对象
32     QAxObject* getRows(QAxObject* pSheet);
33     //获取行数
34     int getRowsCount(QAxObject* pSheet);
35     //获取列对象
36     QAxObject* getColumns(QAxObject* pSheet);
37     //获取列数
38     int getColumnsCount(QAxObject* pSheet);
39     //根据行列值获取单元格值, 如: 3行,5列
40     QString getCell(QAxObject* pSheet, int row, int column);
41     //根据行列编号获取单元格值, 如: "F6"
42     QString getCell(QAxObject* pSheet, QString number);
43     //根据行列值设置单元格值
44     bool setCell(QAxObject* pSheet, int row, int column, QString value);
45     //根据行列编号设置单元格值
46     bool setCell(QAxObject* pSheet, QString number, QString value);
47
48
49 signals:
50
51 public slots:
52 private:
53     QAxObject*      m_pExcel;
54     QAxObject*      m_pWorksheets;
55     QAxObject*      m_pWorkbook;
56     QString         m_strPath;
57 };
58
59 #endif // EXCELOPERATOR_H
  1 #include "exceloperator.h"2 #include <objbase.h>3 4 ExcelOperator::ExcelOperator(QObject *parent) : QObject(parent)5   , m_pExcel(NULL)6   , m_pWorksheets(NULL)7   , m_pWorkbook(NULL)8 {9 10 }11 12 ExcelOperator::~ExcelOperator()13 {14     close();15 }16 17 bool ExcelOperator::open(QString path)18 {19     m_strPath = path;20     QAxObject *pWorkbooks = NULL;21     CoInitializeEx(NULL, COINIT_MULTITHREADED);22     m_pExcel = new(std::nothrow) QAxObject();23     if (NULL == m_pExcel) {24         qCritical()<<"创建Excel对象失败...";25         return false;26     }27     try {28         m_pExcel->setControl("Excel.Application");29         m_pExcel->dynamicCall("SetVisible(bool)", false); //true 表示操作文件时可见,false表示为不可见30         m_pExcel->setProperty("DisplayAlerts", false);31         pWorkbooks = m_pExcel->querySubObject("WorkBooks");32         pWorkbooks->dynamicCall("Add");33         m_pWorkbook = m_pExcel->querySubObject("ActiveWorkBook");34         qDebug()<<"excel path: "<<m_strPath;35 36         // 获取打开的excel文件中所有的工作sheet37         m_pWorksheets = m_pWorkbook->querySubObject("WorkSheets");38     } catch (...) {39         qCritical()<<"打开文件失败...";40         return false;41     }42 43     return true;44 }45 46 bool ExcelOperator::close()47 {48     qDebug()<<"excel close...";49     if (m_pExcel)50     {51         qDebug()<<"closing...";52         m_pWorkbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(m_strPath));53         m_pWorkbook->dynamicCall("Close()");54         m_pExcel->dynamicCall("Quit()");55         delete m_pExcel;56         m_pExcel = NULL;57     }58     return true;59 }60 61 int ExcelOperator::getSheetsCount()62 {63     int count =  0;64     count = m_pWorksheets->property("Count").toInt();65     return count;66 }67 68 69 QAxObject* ExcelOperator::addSheet(QString name)70 {71     QAxObject *pWorkSheet = NULL;72     try {73         int count = m_pWorksheets->property("Count").toInt();  //获取工作表数目74         QAxObject *pLastSheet = m_pWorksheets->querySubObject("Item(int)", count);75         pWorkSheet = m_pWorksheets->querySubObject("Add(QVariant)", pLastSheet->asVariant());76         pLastSheet->dynamicCall("Move(QVariant)", pWorkSheet->asVariant());77         pWorkSheet->setProperty("Name", name);  //设置工作表名称78     } catch (...) {79         qCritical()<<"创建sheet失败...";80     }81     return pWorkSheet;82 }83 84 bool ExcelOperator::delSheet(QString name)85 {86     try {87         QAxObject *pFirstSheet = m_pWorksheets->querySubObject("Item(QString)", name);88         pFirstSheet->dynamicCall("delete");89     } catch (...) {90         qCritical()<<"删除sheet失败...";91         return false;92     }93     return true;94 }95 96 bool ExcelOperator::delSheet(int index)97 {98     try {99         QAxObject *pFirstSheet = m_pWorksheets->querySubObject("Item(int)", index);
100         pFirstSheet->dynamicCall("delete");
101     } catch (...) {
102         qCritical()<<"删除sheet失败...";
103         return false;
104     }
105     return true;
106 }
107
108 QAxObject* ExcelOperator::getSheet(QString name)
109 {
110     QAxObject* pWorkSheet = NULL;
111     try {
112         pWorkSheet = m_pWorksheets->querySubObject("Item(QString)", name);
113     } catch (...) {
114         qCritical()<<"获取sheet失败...";
115     }
116     return pWorkSheet;
117 }
118
119 QAxObject* ExcelOperator::getSheet(int index)
120 {
121     QAxObject* pWorkSheet = NULL;
122     try {
123         pWorkSheet = m_pWorksheets->querySubObject("Item(int)", index);
124     } catch (...) {
125         qCritical()<<"获取sheet失败...";
126     }
127     return pWorkSheet;
128 }
129
130 QAxObject* ExcelOperator::getRows(QAxObject* pSheet)
131 {
132     QAxObject* pRows = NULL;
133     try {
134         pRows = pSheet->querySubObject("Rows");
135     } catch (...) {
136         qCritical()<<"获取行失败...";
137     }
138     return pRows;
139 }
140
141 int ExcelOperator::getRowsCount(QAxObject* pSheet)
142 {
143     int rows = 0;
144     try {
145         QAxObject* pRows = getRows(pSheet);
146         rows = pRows->property("Count").toInt();
147     } catch (...) {
148         qCritical()<<"获取行数失败...";
149     }
150     return rows;
151 }
152
153 QAxObject* ExcelOperator::getColumns(QAxObject* pSheet)
154 {
155     QAxObject* pColumns = NULL;
156     try {
157         pColumns = pSheet->querySubObject("Columns");
158     } catch (...) {
159         qCritical()<<"获取列失败...";
160     }
161     return pColumns;
162 }
163
164 int ExcelOperator::getColumnsCount(QAxObject* pSheet)
165 {
166     int columns = 0;
167     try {
168         QAxObject* pColumns = getColumns(pSheet);
169         columns = pColumns->property("Count").toInt();
170     } catch (...) {
171         qCritical()<<"获取列数失败...";
172     }
173     return columns;
174 }
175
176 QString ExcelOperator::getCell(QAxObject* pSheet, int row, int column)
177 {
178     QString strCell = "";
179     try {
180         QAxObject* pCell = pSheet->querySubObject("Cells(int, int)", row, column);
181         strCell = pCell->property("Value").toString();
182     } catch (...) {
183         qCritical()<<"获取单元格信息失败...";
184     }
185
186     return strCell;
187 }
188
189 QString ExcelOperator::getCell(QAxObject* pSheet, QString number)
190 {
191     QString strCell = "";
192     try {
193         QAxObject* pCell = pSheet->querySubObject("Range(QString)", number);
194         strCell = pCell->property("Value").toString();
195     } catch (...) {
196         qCritical()<<"获取单元格信息失败...";
197     }
198
199     return strCell;
200 }
201
202 bool ExcelOperator::setCell(QAxObject* pSheet, int row, int column, QString value)
203 {
204     try {
205         QAxObject* pCell = pSheet->querySubObject("Cells(int, int)", row, column);
206         pCell->setProperty("Value", value);
207     } catch (...) {
208         qCritical()<<"写入单元格信息失败...";
209         return false;
210     }
211     return true;
212 }
213
214 bool ExcelOperator::setCell(QAxObject* pSheet, QString number, QString value)
215 {
216     try {
217         QAxObject* pCell = pSheet->querySubObject("Range(QString)", number);
218         pCell->setProperty("Value", value);
219     } catch (...) {
220         qCritical()<<"写入单元格信息失败...";
221         return false;
222     }
223     return true;
224 

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

Qt Excel进行新增、删除、修改读取从入门到精通相关推荐

  1. NPOI对Excel数据的读取删除修改写入

    文章目录 前言介绍 npoi介绍 1.读取excel数据 1.1 读取sheet表 1.2 获取sheet数据 2.删除excel 2.1 删除sheet表 2.2 清空指定行数据 3.修改excel ...

  2. C#xml创建修改读取删除帮助类XmlHelper.cs

    <strong><span style="color:#ff0000;">[XML帮助类]C#xml创建修改读取删除帮助类XmlHelper.cs < ...

  3. 删除 多个表_合并汇总多个工作簿多个工作表,删除修改新增更新内容只需刷新...

    要求:1.把多个工作簿的多个工作表内容合并汇总 2.后续在任一工作表内删除修改新增内容,无需再重新做表 3.后续在任一工作簿中新增一个或多个工作表,无需再重新做表 4.后续在文件夹中添加一个或多个Ex ...

  4. Python读取多个excel文件(删除字段、数据格式转换、dataframe多表合并)并写入ElasticSearch实战(自动创建索引、写入ElasticSearch、探索性数据分析)

    Python读取多个excel文件(删除字段.数据格式转换.dataframe多表合并)并写入ElasticSearch实战(自动创建索引.写入ElasticSearch.探索性数据分析) 目录

  5. form 多条数据 只保存修改的行_MVC中的新增、修改、删除

    新增.修改.删除 开发工具与关键技术:MVC作者:盘洪源撰写时间:2019年3月30日星期六 新增.删除.修改.查询这都是MVC中最基础的,所以说想要学好MVC必须先把基础打好,查询是比较复杂点,这里 ...

  6. laravel 调试mysql_Laravel - MySQL数据库的使用详解3(Query Builder用法2:新增、修改、删除)...

    五.新增.修改.删除操作 在前文中我介绍了如何使用Query Builder(查询构造器)进行数据查询,下面接着介绍如何使用它进行数据的增.删.改操作.同样假设我们有如下用户表(user): 1,新增 ...

  7. c223 :production versions 新增、修改、删除函数: CM_FV_PROD_VERS_DB_UPDATE

    c223 :production versions 新增.修改.删除函数:  CM_FV_PROD_VERS_DB_UPDATE

  8. 使用Elasticsearch第三方包Bboss批量提交新增、修改、删除请求

    思路 使用Bboss的Http请求,核心还是ES原生的http请求接口,自己懒得写,直接使用Bboss封装好的 maven依赖 <dependency><groupId>com ...

  9. vue-axios demo_user 展示数据 删除 修改 新增

    项目 1. https://gitee.com/zhao-qing-jing/ssmpro2104-jt/tree/master/d-mvc https://gitee.com/zhao-qing-j ...

最新文章

  1. Homebrew正式支持苹果M1,程序员换新Mac又多了一条理由
  2. oracle sqlcode 多条,SQL查询以连接Oracle中多个行的列值
  3. db2界面调用存储过程_第三章 操作系统用户界面
  4. abd shell关闭所有程序_一个 Shell 脚本逆袭的规范,拿走不谢
  5. [Leetcode][第97题][JAVA][交错字符串][BFS][动态规划]
  6. 【机器学习】sklearn k-近邻算法
  7. 神舟笔记本风扇控制软件_十代酷睿+RTX2070加持 高性能游戏本首选神舟战神G9CU7PK...
  8. 算法竞赛入门 第2版 习题3-3 UVa1225
  9. 如何生成随机的字母数字字符串?
  10. SpringBoot-项目2-收货地址(新增,修改,删除,设为默认收货地址)
  11. Unity资源的基本类型
  12. 为何提示网站安全证书有问题?不同原因下,如何解决?
  13. python xlrd pandas_Python:Pandas pd.read_excel提供ImportError:为Excel supp安装xlrd = 0.9.0
  14. python编写库存管理_python编写商品管理
  15. 李沐论文精度系列之八:视频理解论文串讲
  16. 关于日期插件在chrome中出现被遮挡的问题
  17. php随机产生4乘4矩阵,matlab函数rand:产生均匀分布的随机数或矩阵的函数
  18. 网宿科技边缘计算之直播应用
  19. 微信小程序关键字搜索
  20. Pytorch实战2:Carvana Image Masking使用UNet

热门文章

  1. python分割文本_切分文本Python
  2. 雨林木风发布 Windows一键还原 2011 v1.5.5.6
  3. GCN学习:用PyG实现自定义layers的GCN网络及训练(五)
  4. [奥塔在线]IIS Express如何开启HTPPS访问
  5. java lang arithmetic,java.lang.ArithmeticException
  6. mac 安装软件报错
  7. 秋意浓(2018.9.28)
  8. IIS发布问题:HTTP错误404.17和404.2
  9. 0003 渗透测试标准
  10. 装饰工程预算方案的审查