MFC 读写 Excel

news/2024/9/20 4:00:25/ 标签: excel

在对话框头文件中导入头文件

#include "CApplication.h"
#include "CRange.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"
#include "ShowData.h"
依次打开并注释这些头文件中如下代码

//#import "C:\\Program Files\\Microsoft Office\\root\\Office16\\EXCEL.EXE" no_namespace
打开CRange.h

将DialogBox改为_DialogBox
到这里可以成功运行项目了

获取数据并将数据写入Excel

//获取随机数int data[100];srand(time(0));for(int i=0;i<100;i++){data[i] = 10 + rand() % 200;}m_list.SetExtendedStyle(m_list.GetExtendedStyle()| LVS_EX_GRIDLINES |LVS_EX_FULLROWSELECT |LVS_EX_DOUBLEBUFFER);//插入标题m_list.InsertColumn(0, TEXT("行/列"), LVCFMT_LEFT, 50);for (int i = 1;i<11;i++){CString str;str.Format(TEXT("%d列"), i );m_list.InsertColumn(i, str, LVCFMT_LEFT, 40);}int temp = 0;//插入正文内容,先确定行,再确定列for (int i = 0; i < 10; i++){CString str;str.Format(TEXT("第%d行"), i+1 );//确定行m_list.InsertItem(i, str);}//填入数据CString value;for (int i=0; i<10; i++){for (int j=0;j<10; j++){value.Format(TEXT("%d"), data[i*10+j]);m_list.SetItemText(i, j+1, value);}}

在导出按钮的响应方法中添加将数据写入Excel的方法

COleVariantcovTrue((short)TRUE),covFalse((short)FALSE),covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);CApplication app; //创建应用实例CWorkbooks books; //多个工作簿CWorkbook book; //单个工作簿CWorksheets sheets; //多个工作表CWorksheet sheet; //单个工作表CRange range;//app.put_DisplayAlerts(VARIANT_FALSE); // 禁用 Excel 的警告对话框显示if (!app.CreateDispatch(_T("Excel.Application"))){MessageBox(_T("创建失败!"));return;}char path[MAX_PATH];GetCurrentDirectory(MAX_PATH, (TCHAR*)path);//获取当前路径CString strExcelFile = (TCHAR*)path;CString strdevName = _T("\\data.xls");	   //xlsx也行strExcelFile += strdevName;books = app.get_Workbooks();book = books.Add(covOptional);//创建工作簿sheets = book.get_Worksheets();             //得到此工作簿下所有的工作表对象sheet = sheets.get_Item(COleVariant((short)1)); //获取第一个工作表对象//得到全部Cellsrange.AttachDispatch(sheet.get_Cells());for (int setnum = 0; setnum < 10; setnum++)   //GetItemCount()列表的里面的条目数量, 横着的  行{for (int num = 0; num < 10; num++){range.put_Item(_variant_t((long)(setnum + 1)), _variant_t((long)(num + 1)),_variant_t(m_list.GetItemText(setnum , num+1)));//GetItemText()获取第setnum行,num+1列的文本}}//保存book.SaveCopyAs(COleVariant(strExcelFile));  //SaveCopyAs在strFile路径下保存为指定格式.xlsx的文件book.put_Saved(TRUE);   //将Workbook的保存状态设置为已保存,即不让系统提示是否人工保存app.put_Visible(TRUE);        //设置表可见性//释放对象range.ReleaseDispatch();sheet.ReleaseDispatch();sheets.ReleaseDispatch();book.ReleaseDispatch();books.ReleaseDispatch();app.ReleaseDispatch();app.Quit();

 读取Excel并显示到列表

在资源视图中添加一个新的Dlg,给这个对话框添加一个类 CShowData,并添加一个list Control,用来显示从Excel中读出的数据

 在原来的对话框头文件中创建ShowData对象,用来显示这个对话框。

CShowData showDataDlg;
 在导出按钮的响应方法中添加读取Excel的方法,并将数据写入数组中,待会就可以将数组中的数据显示在列表里了(当然也可以读数据的同时将数据写入列表,不用数组存储

COleVariantcovTrue((short)TRUE),covFalse((short)FALSE),covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);CApplication app;CRange range;COleVariant vResult;if (!app.CreateDispatch(_T("Excel.Application"))){MessageBox(_T("创建失败!"));return;}char path[MAX_PATH];GetCurrentDirectory(MAX_PATH, (TCHAR*)path);//获取当前路径CString strExcelFile = (TCHAR*)path;CString strdevName = _T("\\data.xls");	   //xls也行strExcelFile += strdevName;CWorkbooks books = app.get_Workbooks();// 按文件路径打开现有的工作簿CWorkbook book = books.Open(strExcelFile, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional);CWorksheets sheets = book.get_Worksheets();CWorksheet sheet = sheets.get_Item(COleVariant((short)1));//获取有效行号range = sheet.get_UsedRange();range = range.get_Rows();long rows = range.get_Count();//行号加一可以得到这个电容对应的工作表,(m_Col-1)*3可以得到这个电容的数据for (long i = 1; i < rows + 1; i++) {for (int j=1; j<11; j++){range.AttachDispatch(sheet.get_Cells());range.AttachDispatch(range.get_Item(COleVariant(i), COleVariant((long)j)).pdispVal);   //第一变量是行,第二个变量是列,即第i行第j列vResult = range.get_Value2();showDataDlg.listData[(i-1)*10+(j-1)] = vResult.dblVal;}}books.Close();app.Quit();//释放对象      range.ReleaseDispatch();sheet.ReleaseDispatch();sheets.ReleaseDispatch();book.ReleaseDispatch();books.ReleaseDispatch();app.ReleaseDispatch();//渲染showData对话框showDataDlg.DoModal();

在ShowData.cpp的OnInitDialog方法中将数据写入列表

m_list.SetExtendedStyle(m_list.GetExtendedStyle()| LVS_EX_GRIDLINES |LVS_EX_FULLROWSELECT |LVS_EX_DOUBLEBUFFER);//插入标题m_list.InsertColumn(0, TEXT("行/列"), LVCFMT_LEFT, 50);for (int i = 1;i<11;i++){CString str;str.Format(TEXT("%d列"), i );m_list.InsertColumn(i, str, LVCFMT_LEFT, 40);}int temp = 0;//插入正文内容,先确定行,再确定列for (int i = 0; i < 10; i++){CString str;str.Format(TEXT("第%d行"), i+1 );//确定行m_list.InsertItem(i, str);}//填入数据CString value;for (int i=0; i<10; i++){for (int j=0;j<10; j++){value.Format(TEXT("%d"), listData[i*10+j]);m_list.SetItemText(i, j+1, value);}}

OK了


http://www.ppmy.cn/news/1514374.html

相关文章

k8s 安装nacos集群

需求 使用k8s部署nacos集群&#xff0c;nacos的数据主要保存在mysql中&#xff0c;因此nacos运行时不需要考虑持久化问题。 这里使用2.3.2版本 导入mysql数据 github地址&#xff1a;https://github.com/alibaba/nacos/releases 找到2.3.2版本&#xff0c;下载压缩包&#xff0…

黑神话:悟空游戏用的什么服务器?

黑神话&#xff1a;悟空游戏用的什么服务器&#xff1f;《黑神话&#xff1a;悟空》游戏使用的是基于云计算的强大服务器&#xff0c;具体型号和配置未公开。这些服务器在游戏发布初期就表现出极强的处理能力和稳定性&#xff0c;尽管同时在线人数一度突破百万&#xff0c;但整…

栅格布局在 HarmonyOS 中的应用及扩展

栅格布局作为一种经典的布局方式&#xff0c;广泛应用于不同类型的用户界面设计&#xff0c;尤其是在移动设备和响应式设计中&#xff0c;它表现出了强大的适应性。本文将深入探讨如何在 HarmonyOS 中使用栅格布局组件 GridRow 和 GridCol&#xff0c;并通过多种示例来展示栅格…

python代码提取每页PDF转为图片

&#x1f343;作者介绍&#xff1a;双非本科大四网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发&#xff0c;目前开始人工智能领域相关知识的学习 &#x1f985;个人主页&#xff1a;逐梦苍穹 &#x1f4d5;所属专栏&a…

使用 Grafana 和 Prometheus 监控 Nginx

以下是使用 Grafana 和 Prometheus 来监控 Nginx 负载均衡的一般步骤&#xff1a; 一、安装 Prometheus 下载 Prometheus&#xff1a;从 Prometheus 官方网站下载适合你系统的版本。配置 Prometheus&#xff1a;编辑 Prometheus 的配置文件&#xff08;通常是prometheus.yml&…

支付宝小程序websocket长连接(心跳版本)

注意点&#xff1a; 关闭连接一定要把那些开下来的监听全部关闭掉 1.开启连接 /*长连接*/ connectWebSocket() {let that this;my.connectSocket({url: ws://192.xx.8.xx:7780/charger-service-netty/websocket/${uni.getStorageSync(chargePointId)},header: {AccessType: a…

Android Studio(3) 使用 Kotlin DSL和 Gradle 8.7 打包远程库到 AAR 的自定义方法

背景介绍 在 Gradle 7.3 及更早版本中,通常使用 com.kezong.fat-aar 插件来打包远程库到 AAR 中,随着 Gradle 的不断升级,尤其是到 8.7 版本后,Kotlin DSL开发逐渐成为主流,fat-aar 社区没有更新,插件的兼容性问题逐渐显现。我探索一种新的自定义方法,能够在 Kotlin DS…

08.TMS570LC43入门指南——RTI模块

08.TMS570LC43入门指南——RTI模块 文章目录 08.TMS570LC43入门指南——RTI模块一、简介二、认识 RTI2.1 特性2.2 总体模块介绍2.3 计数操作介绍2.4 中断/DMA 请求 三、项目实现3.1 硬件部分3.2 软件部分3.2.1 HALCoGen 配置3.2.2 CCS 配置3.2.3 运行结果 五、写在最后 ​ 一、…

老品新生机,新品快速上位:测评在维护亚马逊产品排名中的作用

亚马逊平台高度重视用户体验&#xff0c;用户评论在平台算法中占据重要权重&#xff0c;直接影响产品的排名和销量。因此&#xff0c;产品测评对于亚马逊卖家来说至关重要&#xff0c;不仅有助于新品上架时提升排名和转化率&#xff0c;还能维护老产品的Listing排名。为了安全有…

【C++二分查找 贪心】2576. 求出最多标记下标

本文涉及的基础知识点 C二分查找 贪心&#xff1a;决策包容性 LeetCode2576. 求出最多标记下标 给你一个下标从 0 开始的整数数组 nums 。 一开始&#xff0c;所有下标都没有被标记。你可以执行以下操作任意次&#xff1a; 选择两个 互不相同且未标记 的下标 i 和 j &#x…

2025计算机毕设50条小众好做的Java题目【计算机毕设选题推荐】

随着2025年的到来&#xff0c;计算机专业的学生们又迎来了毕业设计的关键时刻。对于大多数学生来说&#xff0c;选择一个合适的毕业设计题目往往是一项艰巨的任务。本文旨在为那些正在为毕业设计题目烦恼的同学们提供一些灵感和建议&#xff0c;特别是针对使用Java技术栈的同学…

centos 部署 scrapy 爬虫详细教程

部署流程 参考环境安装 pyenv安装依赖安装 pyenv配置环境变量root 用户~/.bashrc~/.profile~/.bash_profileZsh 用户重启 shell 使用 pyenv 安装 Python 3.9.1安装Scrapyd-Client安装Scrapysystemd添加服务文件 参考 【华为仓库】 【pyenv 多版本的Python管理工具】 【pyenv-v…

.NET系列 定时器

net一共&#xff14;种定时器 System.Windows.Forms.Timer 类型 》》WinForm专用System.Windows.Threading.DispatcherTime类型》》WPF专用System.Threading.Timer类型》》》它使用 ThreadPool 线程来执行定时操作System.Timers.Timer类型 》》这种很老了。 它使用基于底层计时…

每天一个数据分析题(四百九十七)- 序列模式挖掘

序列模式挖掘 (sequence pattern mining &#xff09;是指挖掘相对时间或其他模式出现频率高的模式&#xff0c;典型的应用还是限于离散型的序列。下列哪个选项不属于序列模式的时限约束&#xff1f; A. 最大跨度约束 B. 主键约束 C. 最小间隔和最大间隔约束 D. 窗口大小约…

vue3 img标签动态加载图片

<img :src"getImgUrl(item.name)" alt"">//组合式下 methods里方法 getImgUrl(name){let url new URL(../../../assets/images/bigscreen/${name}.png, import.meta.url).hrefreturn url},

【微信小程序】自定义组件 - 数据、方法和属性

1. data 数据 2. methods 方法 在小程序组件中&#xff0c;事件处理函数和自定义方法需要定义到 methods 节点中&#xff0c;示例代码如下&#xff1a; 3. properties 属性 在小程序组件中&#xff0c;properties 是组件的对外属性&#xff0c;用来接收外界传递到组件中的数…

IDEA工具设置默认使用maven的settings.xml文件

第一步&#xff1a;打开idea工具&#xff0c;选中 File ——> New Projects Setup ——> Settings for New Projects 第二步&#xff1a;先设置下自动构建项目这个选项 第三步&#xff1a;选中 Build Tools ——> Maven&#xff0c;让后就可以设置自己安转的maven和se…

Modbus初学者教程,第六章:Modbus 答疑

第六章&#xff1a;Modbus 答疑 平时调试Modbus设备&#xff0c;或者学习Modbus协议&#xff0c;推荐一款Modbus主从站模拟器&#xff1a; 主站下载地址&#xff1a;Modbus从站模拟器 从站下载地址&#xff1a;Modbus主站模拟器 我从哪里开始与我的 Modbus 设备通信&#xff1f…

无人机:航拍书籍推荐

写在前面 学习航拍&#xff0c;整理一些书籍分享理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于虚度时间和没有好好做事&#xff0c;所以唯一的解决办法就是行动起来&#xff0c;认真做完事情&#xff0c;战胜焦虑&#xff0c;战胜那些心里空荡荡的时刻&…

克服编程挫折:从Bug的迷宫中寻找出口与面对算法保持冷静的策略

在编程学习的道路上&#xff0c;挫折感无疑是每个学习者都必须面对的挑战之一。它们仿佛是一座座高墙&#xff0c;阻挡我们前进的步伐。然而&#xff0c;正如许多有经验的编程高手所证明的那样&#xff0c;挫折并不是终点&#xff0c;而是成长和进步的催化剂。本文将分享一些有…