请注意,在工程文件pro里,增加CONFIG += qaxcontainer。
有的网帖上写的是CONFIG += axcontainer,经测试,通不过。
或者在工程配置如下图修改:

源代码:

#ifndef QTEXCEL_H
#define QTEXCEL_H#include <QObject>
#include <QFile>
#include <QString>
#include <QStringList>
#include <QVariant>
#include <QAxBase>
#include <QAxObject>typedef unsigned int UINT;
class QtExcel
{public:QtExcel();QtExcel(QString xlsFile);~QtExcel();
public:bool Open(UINT nSheet = 1, bool visible = false);          //打开xls文件bool Open(QString xlsFile, UINT nSheet = 1, bool visible = false);void Save();                                              //保存xls报表void Close();                                             //关闭xls报表QVariant GetCellData(UINT row, UINT column);               //获取指定单元数据QVariantList GetCellData(QString strRange); //获取多个单元数据,写法为“A2:C60”bool SetCellData(UINT row, UINT column, QVariant data); //修改指定单元数据bool IsOpen();bool IsValid();
protected:void Clear();
private:QAxObject *m_pExcel;       //指向整个excel应用程序QAxObject *m_pWorkbooks;   //指向工作簿集,excel有很多工作簿QAxObject *m_pWorkbook;    //指向sXlsFile对应的工作簿QAxObject *m_pWorksheet;   //指向工作簿中的某个sheet表单QString   m_strXlsFile;      //xls文件路径UINT      m_nCurrSheet;    //当前打开的第几个sheetbool      m_bIsVisible;    //excel是否可见int       m_nRowCount;     //行数int       m_nColumnCount;  //列数int       m_nStartRow;     //开始有数据的行下标值int       m_nStartColumn;  //开始有数据的列下标值bool      m_bIsOpen;       //是否已打开bool      m_bIsValid;      //是否有效bool      m_bIsANewFile;   //是否是一个新建xls文件,用来区分打开的excel是已存在文件还是有本类新建的bool      m_bIsSaveAlready;//防止重复保存
};
#endif // QTEXCEL_H

源文件CPP

#include "QtExceL.h"
#include <ole2.h>QtExcel::QtExcel()
{m_pExcel = NULL;m_pWorkbooks = NULL;m_pWorkbook = NULL;m_pWorksheet = NULL;m_strXlsFile = "";m_nRowCount = 0;m_nColumnCount = 0;m_nStartRow = 0;m_nStartColumn = 0;m_bIsOpen = false;m_bIsValid = false;m_bIsANewFile = false;m_bIsSaveAlready = false;HRESULT r = OleInitialize(0);if (r != S_OK && r != S_FALSE){qDebug("Qt: Could not initialize OLE (error %x)", (unsigned int)r);}
}QtExcel::QtExcel(QString xlsFile)
{m_pExcel = NULL;m_pWorkbooks = NULL;m_pWorkbook = NULL;m_pWorksheet = NULL;m_strXlsFile = xlsFile;m_nRowCount = 0;m_nColumnCount = 0;m_nStartRow = 0;m_nStartColumn = 0;m_bIsOpen = false;m_bIsValid = false;m_bIsANewFile = false;m_bIsSaveAlready = false;HRESULT r = OleInitialize(0);if (r != S_OK && r != S_FALSE){qDebug("Qt: Could not initialize OLE (error %x)", (unsigned int)r);}
}
QtExcel::~QtExcel()
{if (m_bIsOpen){//析构前,先保存数据,然后关闭workbookClose();}OleUninitialize();
}bool QtExcel::Open(UINT nSheet, bool visible)
{if (m_bIsOpen){Close();}m_nCurrSheet = nSheet;m_bIsVisible = visible;if (NULL == m_pExcel){m_pExcel = new QAxObject("Excel.Application");if (m_pExcel){m_bIsValid = true;}else{m_bIsValid = false;m_bIsOpen = false;return m_bIsOpen;}m_pExcel->dynamicCall("SetVisible(bool)", m_bIsVisible);}if (!m_bIsValid){m_bIsOpen = false;return m_bIsOpen;}if (m_strXlsFile.isEmpty()){m_bIsOpen = false;return m_bIsOpen;}/*如果指向的文件不存在,则需要新建一个*/QFile f(m_strXlsFile);if (!f.exists()){m_bIsANewFile = true;}else{m_bIsANewFile = false;}if (!m_bIsANewFile){m_pWorkbooks = m_pExcel->querySubObject("WorkBooks"); //获取工作簿m_pWorkbook = m_pWorkbooks->querySubObject("Open(QString, QVariant)", m_strXlsFile, QVariant(0)); //打开xls对应的工作簿}else{m_pWorkbooks = m_pExcel->querySubObject("WorkBooks");      //获取工作簿m_pWorkbooks->dynamicCall("Add");                        //添加一个新的工作薄m_pWorkbook = m_pExcel->querySubObject("ActiveWorkBook"); //新建一个xls}m_pWorksheet = m_pWorkbook->querySubObject("WorkSheets(int)", m_nCurrSheet);//打开第一个sheet//至此已打开,开始获取相应属性QAxObject *usedrange = m_pWorksheet->querySubObject("UsedRange");       //获取该sheet的使用范围对象QAxObject *rows = usedrange->querySubObject("Rows");QAxObject *columns = usedrange->querySubObject("Columns");//因为excel可以从任意行列填数据而不一定是从0,0开始,因此要获取首行列下标m_nStartRow = usedrange->property("Row").toInt();    //第一行的起始位置m_nStartColumn = usedrange->property("Column").toInt(); //第一列的起始位置m_nRowCount = rows->property("Count").toInt();       //获取行数m_nColumnCount = columns->property("Count").toInt();    //获取列数m_bIsOpen = true;return m_bIsOpen;
}bool QtExcel::Open(QString xlsFile, UINT nSheet, bool visible)
{m_strXlsFile = xlsFile;m_nCurrSheet = nSheet;m_bIsVisible = visible;return Open(m_nCurrSheet, m_bIsVisible);
}void QtExcel::Save()
{if (m_pWorkbook){if (m_bIsSaveAlready){return;}if (!m_bIsANewFile){m_pWorkbook->dynamicCall("Save()");}else /*如果该文档是新建出来的,则使用另存为COM接口*/{m_pWorkbook->dynamicCall("SaveAs (const QString&,int,const QString&,const QString&,bool,bool)",m_strXlsFile, 56, QString(""), QString(""), false, false);}m_bIsSaveAlready = true;}
}void QtExcel::Close()
{Save();//关闭前先保存数据if (m_pExcel && m_pWorkbook){m_pWorkbook->dynamicCall("Close(bool)", true);m_pExcel->dynamicCall("Quit()");delete m_pExcel;m_pExcel = NULL;m_bIsOpen = false;m_bIsValid = false;m_bIsANewFile = false;m_bIsSaveAlready = true;}
}QVariant QtExcel::GetCellData(UINT row, UINT column)
{QVariant data;QAxObject *cell = m_pWorksheet->querySubObject("Cells(int,int)", row, column);//获取单元格对象if (cell){data = cell->dynamicCall("Value2()");}return data;
}QVariantList QtExcel::GetCellData(QString strRange)
{QVariantList data;// strRange = "a1:C10"QAxObject *cell = m_pWorksheet->querySubObject("Range(QString)", strRange);//获取单元格对象if (cell){data = cell->property("Value").toList();}return data;
}bool QtExcel::SetCellData(UINT row, UINT column, QVariant data)
{bool op = false;QAxObject *cell = m_pWorksheet->querySubObject("Cells(int,int)", row, column);//获取单元格对象if (cell){QString strData = data.toString(); //excel 居然只能插入字符串和整型,浮点型无法插入cell->dynamicCall("SetValue(const QVariant&)", strData); //修改单元格的数据op = true;}else{op = false;}return op;
}void QtExcel::Clear()
{m_strXlsFile = "";m_nRowCount = 0;m_nColumnCount = 0;m_nStartRow = 0;m_nStartColumn = 0;
}bool QtExcel::IsOpen()
{return m_bIsOpen;
}
bool QtExcel::IsValid()
{return m_bIsValid;
}

QT开发应用程序(17)-- 读写XLS文件相关推荐

  1. Qt 读写xls文件(并将数据转为c风格

    参考文章:读写XLS文件 找了好久xls的读取库啥的,就这个比较好用.解决了出现的几个问题,并进一步封装. 定义的类 pro文件中加入 CONFIG += qaxcontainer QtExcel// ...

  2. Qt开发应用程序的两种方式

    目录 案例:计算圆面积(两种方式实现) 方式一:设计器 Qt Designer实现   (20201015) 方案A:触发按钮事件(_clicked()) 方案B:触发输入编辑框事件(_textCha ...

  3. java使用POI jar包读写xls文件

    主要使用poi jar来操作excel文件.代码中用到的数据库表信息见ORACLE之表.使用public ArrayList<Person> getPersonAllRecords()获得 ...

  4. 09.QT应用程序启动外部exe文件

    根据QT帮助文档,写了一个小测试案例,在QT应用中,启动 一个外部的exe程序,目前此exe使用的QT编译形成,后期改用C#形式的exe文件. #include "QProcessDemo. ...

  5. gl linux qt 库_Linux下Qt应用程序的发布(使用LDD命令查看所有依赖的库文件)

    最近一直在学习Qt,用Qt写了一个程序,但是不知道怎么发布,网上说的都是在windows下怎么发布Qt应用程序,但是,在windows下Qt应用程序依赖的库文件与linux下的名字不同.于是,我就想到 ...

  6. python数据存储系列教程——xls文件的读写、追加(xlwt、xlwt、xlutils)

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python将数据存储到excel文件.本文不通过与操作excel办公软件而是偏向于excel文件的处理.如果你需要通过python控制exc ...

  7. python打不开xls文件,wps下用vba实现合并文件夹中所有excel文件

    python打不开xls文件,用wps下vba解决问题 用了常用的三种python读写xls文件的方法都报错 xlrd openpyxl pandas 原因 解决方法 用vba实现合并文件夹中所有ex ...

  8. c# 中wpfexcel_VS2017下编写C#程序读写Excel文件

    原标题:VS2017下编写C#程序读写Excel文件 前言: 有时候我们需要对Excel文件进行特殊处理,这种情况下写个小程序是很方便的.最近刚开始学C#,正好有同学需要处理个Excel文件,我就写了 ...

  9. macOS上实现Qt应用程序做文件关联打开

    一.背景介绍 用Qt开发的应用程序要实现文件关联,双击时用默认关联的程序打开文件,在Windows上这个功能非常容易实现.Windows应用程序在安装的时候可以在注册表中写入相关的键值对.打开文件的时 ...

最新文章

  1. 11、查看及测试网络、配置网络地址、内核及模块管理
  2. Handler消息机制(六):Looper.loop()为什么不会阻塞主线程?
  3. Java 生成有序 UUID
  4. 神策数据汽车行业解决方案重磅上线,全面赋能车企数字化转型
  5. 防止用户将表单重复提交的方法
  6. GDCM:gdcm::File的测试程序
  7. jquery监听滚动条
  8. 【最全最详细】使用publiccms实现动态可维护的首页轮播
  9. 1.7 编程基础之字符串 34 回文子串 python
  10. WebbUpload上传组件(cnblog 一位网友写的)
  11. nginx.conf 配置完整示例
  12. 计算机几何 - 如何判断一个多边形是凸多边形还是凹多边形
  13. 常见必问面试问题一_面试自我介绍3分钟、离职原因、期望薪资…(含面试技巧和答案)
  14. 教你简单3步搞定——微信快速添加个人表情包
  15. 前端开发工程师 - 02.JavaScript程序设计 - 第2章.进阶篇
  16. Directx11教程四十三之glow(边缘发光)
  17. C++宏定义中的特殊符号
  18. lol无限火力服务器卡顿,LOL无限火力无限彗星BUG是什么? 无限彗星超强卡BUG技巧Get起来...
  19. java内存模型作用是什么意思_JMM(Java内存模型)是什么?为什么使用并发?
  20. canvas机器鸭子走路动画

热门文章

  1. 智能家居(Domoticz)怎么能少了天气预报
  2. 基于Domoticz智能家居系统(十三)Domoticz-3.8153在Tiny6410开发板上的移植
  3. MacOS Catalina 关闭和开启文件安全性检查
  4. 剑灵32位登录服务器维护,(32位系统可稳定运行剑灵)剑灵客户端发生错误的解决办法...
  5. working directory is not part of a module
  6. 记住,在看小电影前一定要检查下域名是不是 HTTPS 的
  7. java ready()_Java BufferedReader ready()用法及代码示例
  8. AcWing 4489. 最长子序列
  9. SpringSecurity实现数据库认证
  10. dns能帮助网站快速打开吗?怎么样提升网站打开速度?