当前位置: 首页 > news >正文

如何在VS2022上的MFC项目中操作Excel(VS2010、VS2012、VS2015、VS2017、VS2019使用方法一样)

先决条件

  • 本机安装office2003、2007、2010、2016及以后版本,总之必须安装office
  • 导入Excel库文件,导入方式可参考:
    • 如何在vs2017及以前版本(vs2010、vs2015)上添加 添加类型库中的MFC类
    • 如何在vs2019及以后版本(如vs2022)上添加 添加ActiveX控件中的MFC类
    • 如何使用vs2022通过excel.exe生成VC、C++能够使用的头文件

一、导入头文件

#include "CApplication.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"
#include "CRange.h"
#include "CFont0.h"

二、使用示例1

1、打开excel驱动及操作excel (读、写、新建sheet,选择rang,行、列等)

//默认使用第一个sheetint nSheetNumber=1;//创建对象CApplication app;if( !app.CreateDispatch(_T("Excel.Application"))){AfxMessageBox("没有安装office2007以上版本,无法操作excel文件");return ;}//定义其他内部对象CWorkbooks   books;CWorkbook    book;CWorksheets  sheets;CWorksheet   sheet;CFont0 font;CRange range;CString FieldName,FieldValue;COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR); books=app.get_Workbooks();//需要在c盘建立一个excel文件,也可以改成系统自带的excel文件// book=books.Add(COleVariant("c:\\aa.xlsx"));book = books.Add(covOptional); book.put_Title("Mybooks");sheets=book.get_Sheets();	 sheet=sheets.get_Item(COleVariant((short)nSheetNumber));sheet.put_Name("wxpSheet");//---------------------app.put_Visible(TRUE);//可见性app.put_UserControl(TRUE);//只读	//设置标题FieldName="a1";FieldValue="数据A";range=sheet.get_Range(COleVariant(FieldName),COleVariant(FieldName));range.put_Value2(COleVariant(FieldValue));FieldName="B1";FieldValue="数据B";range=sheet.get_Range(COleVariant(FieldName),COleVariant(FieldName));range.put_Value2(COleVariant(FieldValue));//填充数据-------------------------------------------------------for(int row=1;row<10;++row){//每一行的数据 for(int col=0;col<10;++col){//放置自己的指定数据------------------------------FieldName.Format("%c%d",'a'+col,(row+1));FieldValue.Format("(%d,%d)",row+1,col+1);		 range=sheet.get_Range(COleVariant(FieldName),COleVariant(FieldName));// range.put_Value2(COleVariant(FieldValue));range.put_Formula(_variant_t("=RAND()*100"));range.put_NumberFormat(_variant_t("00.00"));		 //设置隔行颜色if(row %2==0){  font=range.get_Font();font.put_Bold(COleVariant((short)TRUE));font.put_Color(COleVariant((long)RGB(255, 0, 0))); //  font.put_Name(COleVariant(_T("黑体")));	}}//end of col}//end of row//设计计算公式,所有excel中的公式都可以使用-------------------------FieldName="a11";range=sheet.get_Range(COleVariant(FieldName),COleVariant(FieldName));range.put_Formula(COleVariant(_T("=sum(a2:a10")));//自适应列宽度--------------------------------CRange      cols;cols=range.get_EntireColumn();cols.AutoFit();//::Sleep(5000);//读取内容-----------------------------------------------------FieldName="a11";range = sheet.get_Range(COleVariant(FieldName),COleVariant(FieldName));COleVariant cov = range.get_Value2();CString str="success";cov.ChangeType(VT_BSTR);str=cov.bstrVal;	AfxMessageBox(str);//------------------------------------------------------------------//关闭excel文件,根据需要自行决定books.Close();app.Quit();books.ReleaseDispatch();app.ReleaseDispatch();

2、结果

在这里插入图片描述

三、使用示例2

1、打开指定excel,设置对齐方式,设置字体颜色,合并单元格

//变量定义
CApplication app;          //Excel应用程序接口
CWorkbooks books;         //工作薄集合
CWorkbook book;          //工作薄
CWorksheets sheets;         //工作表集合
CWorksheet sheet;          //工作表
CRange range;                 //Excel中针对单元格的操作都应先获取其对应的Range对象
CFont0 font;
CRange cols;
CRange iCell;
LPDISPATCH lpDisp;
COleVariant vResult;
COleVariant	covTrue((short)TRUE);
COleVariant covFalse((short)FALSE);
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);//初始化
if (!app.CreateDispatch("Excel.Application"))
{this->MessageBox("无法创建Excel应用!");return;
}app.put_Visible(FALSE);     //可见
app.put_UserControl(TRUE); //用户可控制//打开XLS文件
books.AttachDispatch(app.get_Workbooks());
lpDisp = books.Open("C:\\test\\excel\\test.xlsx",covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional);//得到Workbook
book.AttachDispatch(lpDisp);//得到Worksheets
sheets.AttachDispatch(book.get_Worksheets());//得到当前活跃sheet
//如果有单元格正处于编辑状态中,此操作不能返回,会一直等待lpDisp = book.get_ActiveSheet();
sheet.AttachDispatch(lpDisp);//*****
//读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列
CRange usedRange;usedRange.AttachDispatch(sheet.get_UsedRange());
range.AttachDispatch(usedRange.get_Rows());//已经使用的行数
long iRowNum = range.get_Count();
range.AttachDispatch(usedRange.get_Columns());//已经使用的列数
long iColNum = range.get_Count();//已使用区域的起始行,从开始
long iStartRow = usedRange.get_Row();//已使用区域的起始列,从开始
long iStartCol = usedRange.get_Column();//读取第一个单元格的值
range.AttachDispatch(sheet.get_Cells());range.AttachDispatch(range.get_Item(COleVariant((long)1), COleVariant((long)1)).pdispVal);vResult = range.get_Value2();CString str;
if (vResult.vt == VT_BSTR)       //字符串
{str = vResult.bstrVal;
}
else if (vResult.vt == VT_R8)     //8字节的数字{str.Format("%f", vResult.dblVal);
}
else if (vResult.vt == VT_DATE)    //时间格式
{SYSTEMTIME st;VariantTimeToSystemTime((long)&vResult.date, &st);
}
else if (vResult.vt == VT_EMPTY)   //单元格空的
{str = "";
}//读取第一个单元格的对齐方式,数据类型:VT_I4
//读取水平对齐方式
range.AttachDispatch(sheet.get_Cells());
iCell.AttachDispatch((range.get_Item(COleVariant(long(1)), COleVariant(long(1)))).pdispVal);
vResult.lVal = 0;
vResult = iCell.get_HorizontalAlignment();
if (vResult.lVal != 0)
{switch (vResult.lVal){case 1:      //默认break;case -4108:  //居中break;case -4131: //*左break;case -4152: //*右break;}
}//垂直对齐方式
iCell.AttachDispatch((range.get_Item(COleVariant(long(1)), COleVariant(long(1)))).pdispVal);
vResult.lVal = 0;vResult = iCell.get_VerticalAlignment();
if (vResult.lVal != 0)
{switch (vResult.lVal){case -4160:  //*上break;case -4108:  //居中break;case -4107:  //*下break;}
}//设置第一个单元格字体颜色:红色
range.AttachDispatch(sheet.get_Cells());
range.AttachDispatch((range.get_Item(COleVariant(long(1)), COleVariant(long(1)))).pdispVal);font.AttachDispatch(range.get_Font());
font.put_Color(COleVariant((long)0xFF0000));//合并单元格的处理//包括判断第一个单元格是否为合并单元格,以及将第一个单元格进行合并
CRange unionRange;range.AttachDispatch(sheet.get_Cells());
unionRange.AttachDispatch(range.get_Item(COleVariant((long)1), COleVariant((long)1)).pdispVal);vResult = unionRange.get_MergeCells();
if (vResult.boolVal == -1)             //是合并的单元格  
{//合并单元格的行数range.AttachDispatch(unionRange.get_Rows());long iUnionRowNum = range.get_Count();//合并单元格的列数range.AttachDispatch(unionRange.get_Columns());long iUnionColumnNum = range.get_Count();//合并区域的起始行,列long iUnionStartRow = unionRange.get_Row();       //起始行,从开始long iUnionStartCol = unionRange.get_Column();    //起始列,从开始
}else if (vResult.boolVal == 0)
{//不是合并的单元格
}//将第一个单元格合并成行,列
range.AttachDispatch(sheet.get_Cells());unionRange.AttachDispatch(range.get_Item(COleVariant((long)1), COleVariant((long)1)).pdispVal); //第一个单元格
unionRange.AttachDispatch(unionRange.get_Resize(COleVariant((long)3), COleVariant((long)2)));     //GetResize(3,2) 从第一个单元格开始合并行列的所有单元格
unionRange.Merge(COleVariant((long)0));   //合并单元格//将文件保存为.xls
app.put_DisplayAlerts(FALSE);
book.SaveAs(COleVariant("C:\\test\\excel\\test1.xlsx"), covOptional, covOptional,covOptional, covOptional, covOptional, 0,covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);
//book.Save();book.Close(covOptional, COleVariant("C:\\test\\excel\\test.xlsx"), covOptional);
books.Close();//释放对象(相当重要!)
range.ReleaseDispatch();
cols.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
//App一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错
app.Quit();
app.ReleaseDispatch();

2、结果

在这里插入图片描述
更多使用方式,可以参考VC 设置EXCEL单元格的格式

相关文章:

如何在VS2022上的MFC项目中操作Excel(VS2010、VS2012、VS2015、VS2017、VS2019使用方法一样)

先决条件 本机安装office2003、2007、2010、2016及以后版本&#xff0c;总之必须安装office导入Excel库文件&#xff0c;导入方式可参考&#xff1a; 如何在vs2017及以前版本(vs2010、vs2015)上添加 添加类型库中的MFC类如何在vs2019及以后版本(如vs2022)上添加 添加ActiveX控…...

【Java8系列06】Java8数据计算

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Andrioid T 实现充电动画(2)

Andrioid T 实现充电动画&#xff08;2&#xff09; 以MTK平台为例&#xff0c;实现充电动画 效果图 资源包 修改文件清单 system/vendor/mediatek/proprietary/packages/apps/SystemUI/res/layout/prize_charge_layout.xmlsystem/vendor/mediatek/proprietary/packages/ap…...

静态方法和属性的经典使用-单例设计模式

单例设计模式 一、设计模式二、单例模式1、饿汉式2、懒汉式3、区别 单例设计模式是静态方法和属性的经典使用。 一、设计模式 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱&#xff0c;不同的棋局&…...

TCP七层协议

物理层 中间的物理链接可以是光缆、电缆、双绞线、无线电波。中间传的是电信号&#xff0c;即010101...这些二进制位。 比特(bit)是二进制&#xff08;Binary Digit&#xff09;的简称&#xff0c;电脑所有的信息都是二进制的&#xff0c;就是0和1组成的。 数据链路层 早期…...

规则引擎Drools使用,0基础入门规则引擎Drools(五)实战+决策表

文章目录 系列文章索引十、个人所得税计算器实战1、名词解释2、计算规则3、实现步骤 十一、信用卡申请实战1、计算规则2、实现 十二、保险产品准入规则实战1、决策表2、基于决策表的入门案例3、保险产品规则介绍4、实现步骤5、资料 系列文章索引 规则引擎Drools使用&#xff0…...

Java后端开发——MVC商品管理程序

Java后端开发——MVC商品管理程序 本篇文章内容主要有下面几个部分&#xff1a; MVC架构介绍项目环境搭建商品管理模块Servlet代码重构BaseServlet文件上传 MVC 是模型-视图-控制器&#xff08;Model-View-Controller&#xff09;&#xff0c;它是一种设计模式&#xff0c;也…...

【隐私计算】VOLE (Vector Oblivious Linear Evaluation)学习笔记

近年来&#xff0c;VOLE&#xff08;向量不经意线性评估&#xff09;被用于构造各种高效安全多方计算协议&#xff0c;具有较低的通信复杂度。最近的CipherGPT则是基于VOLE对线性层进行计算。 1 VOLE总体设计 VOLE的功能如下&#xff0c;VOLE发送 Δ \Delta Δ和 b b b给send…...

国产linux单用户模式破解无密码登陆 (麒麟系统用户登录密码遗忘解决办法)

笔者手里有一批国产linu系统&#xff0c;目前开始用在日常的工作生产环境中&#xff0c;我这个老程序猿勉为其难的充当运维的或网管的角色。 国产linux系统常见的为麒麟Linux&#xff0c;统信UOS等&#xff0c;基本都是基于debian再开发的linux。 问题描述&#xff1a; 因为…...

GPT市场将取代插件商店 openAI已经关闭plugins申请,全部集成到GPTs(Actions)来连接现实世界,可以与物理世界互动了。

Actions使用了plugins的许多核心思想&#xff0c;也增加了新的特性。 ChatGPT的"Actions"与"Plugins"是OpenAI在GPT模型中引入的两种不同的功能扩展机制。这两种机制的目的是增强模型的功能&#xff0c;使其能够处理更多样化的任务和请求。下面是对两者的比…...

PHP定义的变量 常量 静态变量等储存在内存什么位置?

在 PHP 中&#xff0c;变量、常量和静态变量都存储在内存中。它们的存储位置和生命周期有所不同。 变量&#xff1a;PHP 中的变量是动态类型的&#xff0c;它们的值和类型可以随时改变。当 PHP 脚本执行时&#xff0c;会在内存中分配一块空间来存储变量的值&#xff0c;这个空…...

C#中GDI+绘图应用(柱形图、折线图和饼形图)

目录 一、柱形图 1.示例源码 2.生成效果 二、折线图 1.示例源码 2.生成效果 三、饼形图 1.示例源码 2.生成效果 GDI绘制的一些常用的图形&#xff0c;其中包括柱形图、折线图和饼形图。 一、柱形图 柱形图也称为条形图&#xff0c;是程序开发中比较常用的一种图表技术…...

连锁零售企业如何提高异地组网的稳定性?

随着数字化时代的到来&#xff0c;连锁零售企业面临着日益复杂和多样化的网络挑战。连锁零售企业是在不同地理位置拥有分支机构和零售店&#xff0c;可能同城或异地&#xff0c;需要确保各个地点之间的网络连接稳定和可靠。但由于不同地区的网络基础设施差异、网络延迟和带宽限…...

如何靠掌握自己的大数据打破信息流的壁垒?

在当今数字化时代&#xff0c;打造自己的私域流量已经成为商家乃至获取竞争优势的关键手段之一。通过掌握自己的大数据&#xff0c;可以更好地了解用户需求和市场趋势&#xff0c;优化产品和服务&#xff0c;从而打破信息流的壁垒。本文将就如何通过打造自己的私域流量并掌握大…...

LabVIEW绘制带有多个不同标尺的波形图

LabVIEW绘制带有多个不同标尺的波形图 通过在同一波形图上使用多个轴&#xff0c;可以使用不同的标尺绘制数据。请按照以下步骤操作。 将波形图或图表控件放在前面板上。 1. 右键点击您要创建多个标尺的轴&#xff0c;然后选择复制标尺。例如&#xff0c;如果要为一个…...

Oracle行转列,列转行使用实例

-----1.行转换为列 select a.fworkcenter as 车间,F1||-数量 as 类型, fspec as 规格 ,ftype as 前缀 , to_char(fdate,YYYY-MM-dd) as 日期, (case when a.fcode in (900,901) then to_char(fcount,fm90.990) else cast(fcount as varchar(20)) end) 值 , …...

056-第三代软件开发-软件打包

第三代软件开发-软件打包 文章目录 第三代软件开发-软件打包项目介绍软件打包1 下载 linuxdepoyqt 工具2 安装 linuxdepoyqt3 qmake配置4 打包程序 总结 关键字&#xff1a; Qt、 Qml、 linuxdeployqt、 Ubuntu、 AppImage 项目介绍 欢迎来到我们的 QML & C 项目&…...

C++相关闲碎记录(2)

1、误用shared_ptr int* p new int; shared_ptr<int> sp1(p); shared_ptr<int> sp2(p); //error // 通过原始指针两次创建shared_ptr是错误的shared_ptr<int> sp1(new int); shared_ptr<int> sp2(sp1); //ok 如果对C相关闲碎记录(1)中记录的shar…...

如何快速搭建一个大模型?简单的UI实现

&#x1f525;博客主页&#xff1a;真的睡不醒 &#x1f680;系列专栏&#xff1a;深度学习环境搭建、环境配置问题解决、自然语言处理、语音信号处理、项目开发 &#x1f498;每日语录&#xff1a;相信自己&#xff0c;一路风景一路歌&#xff0c;人生之美&#xff0c;正在于…...

国家开放大学 平时作业 测试题 训练

试卷代号&#xff1a;1340 古代小说戏曲专题 参考试题&#xff08;开卷&#xff09; 一、选择&#xff08;每题1分&#xff0c;共10分&#xff09; 1.下列作品中属于唐传奇的是( )。 A.《公孙九娘》 B.《观音作别》 C《碾玉观音》 …...

从硬复位到裸机运行:一张图看懂ZYNQ7000系列启动全流程(附Stage0/1/2详细解析)

从硬复位到裸机运行&#xff1a;ZYNQ7000启动全流程深度解析 当一块ZYNQ7000芯片首次通电时&#xff0c;内部究竟发生了什么&#xff1f;这个看似简单的上电过程&#xff0c;实际上隐藏着一套精密的启动机制。对于FPGA/SOC开发者而言&#xff0c;理解这套机制不仅是掌握ZYNQ开发…...

AI安全中的门控发布机制与能力验证实践

我不能按照您的要求生成关于“TAI #200: Anthropic’s Mythos Capability Step Change and Gated Release”的博文内容。原因如下&#xff1a;该标题中出现的“TAI”&#xff08;通常指The AI Index或Technical AI Safety相关报告编号&#xff09;、“Anthropic”&#xff08;一…...

2025-2026年护眼灯品牌推荐:十大排行产品专业评测熬夜加班防眼干疲劳性价比高注意事项

摘要 当家庭与办公场景对光环境的要求从“照亮”升级为“护眼”&#xff0c;决策者面临的核心挑战已转变为如何在纷繁的技术参数与品牌承诺中&#xff0c;识别出真正能长期守护视觉健康、并适配多元场景的专业解决方案。根据全球市场研究机构Grand View Research的报告&#xf…...

强制启动 Cursor IDE 主程序(不带 Agent 模式)

&#x1f527; 终极解决&#xff1a;强制启动 Cursor IDE 主程序&#xff08;不带 Agent 模式&#xff09;方法 1&#xff1a;用「命令行」强制启动主程序&#xff08;最稳&#xff09;按 WinR 打开运行窗口&#xff0c;输入 cmd 回车&#xff0c;打开命令提示符输入下面这行命…...

动态图神经网络实现多商品时序协同预测

1. 项目概述&#xff1a;为什么传统时序模型在多商品预测中频频“掉链子”你有没有遇到过这样的场景&#xff1a;一家区域连锁超市的运营团队&#xff0c;每天盯着几十种SKU的销售数据发愁——酸奶销量突然飙升&#xff0c;但库存系统还在按上周的均值补货&#xff1b;新款保温…...

Linux ln 软硬链接详解——底层原理+生产实战+彻底区分(零踩坑)

前言很多新手永远分不清软硬链接&#xff0c;只会背“软链接像快捷方式、硬链接像副本”&#xff0c;一旦遇到生产删文件、日志切割、程序部署就翻车。本文从inode底层原理讲起&#xff0c;配合完整实战、对比、生产场景&#xff0c;让你彻底吃透 ln 软硬链接&#xff0c;面试、…...

mob源码深度解析:Go语言实现高效Git协作工具的架构奥秘

mob源码深度解析&#xff1a;Go语言实现高效Git协作工具的架构奥秘 【免费下载链接】mob Tool for smooth git handover. 项目地址: https://gitcode.com/gh_mirrors/mo/mob 在团队协作开发中&#xff0c;Git代码交接常常成为效率瓶颈。mob作为一个用Go语言编写的Git协作…...

什么是换根DP及第一步操作说明

第一步 以任意一点统计我们规定任意一个点作为根 root&#xff0c;进行树形 DP 的操作。获取以确定 root 为根的状态下&#xff0c;所有子树的深度 deep[]。具体的&#xff0c;设当前 dfs 的点为 cur&#xff0c;孩子节点是 nex&#xff1a;对每个进入 dfs 的 deep[cur] 初始化…...

巨亏47亿,市值5000亿:拆解智谱AI的定价逻辑

2026年1月8日&#xff0c;智谱以每股116.2港元登陆港交所。截至5月中旬&#xff0c;其股价一度冲上1160港元&#xff0c;市值突破5000亿港元&#xff0c;较发行价累涨近10倍。而同期披露的2025年财报显示&#xff0c;公司全年营收7.24亿元&#xff0c;经调整净亏损31.82亿元。来…...

用Python复现黏菌算法SMA:从生物觅食到代码优化的完整实战

用Python复现黏菌算法SMA&#xff1a;从生物觅食到代码优化的完整实战 黏菌算法&#xff08;Slime Mould Algorithm, SMA&#xff09;作为一种新兴的智能优化算法&#xff0c;近年来在工程优化、机器学习参数调优等领域展现出独特优势。本文将带您从生物行为理解到Python实现&a…...