当前位置: 首页 > 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《碾玉观音》 …...

后端防止重复提交相同数据处理方式(Redis)

使用AOP注解处理接口幂等性&#xff0c;默认禁止同一用户在上次提交未果后10秒内又重复提交 在原先的sameUrlData的注解上进行了copy新建优化&#xff0c;使用redis去setnx的参数视项目使用点而调整&#xff0c;不一定是每个项目都适合这种取参形式。 源码如下: package com…...

最小栈[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 设计一个支持push&#xff0c;pop&#xff0c;top操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现MinStack类: MinStack()初始化堆栈对象。 void push(int val)将元素val推入堆栈。 void pop()删除堆栈顶部的元素。 in…...

Oracle(2-9) Oracle Recovery Manager Overview and Configuration

文章目录 一、基础知识1、User Backup VS RMAN2、Restoring &Recovering DB 还原&恢复数据库3、Recovery Manager Features 管理恢复功能4、RMAN Components RMAN组件5、Repository1: Control File 存储库1:控制文件6、Channel Allocation 通道道分配7、Media Manageme…...

滑动验证码

先上图 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>滑动验证码</title><style>* {margin: 0;padding: 0;}.box {position: relative;width: 375px;margin: 100px a…...

数据爬取+可视化实战_告白气球_词云展示----酷狗音乐

一、前言 歌词上做文本分析&#xff0c;数据存储在网页上&#xff0c;需要爬取数据下来&#xff0c;词云展示在工作中也变得日益重要&#xff0c;接下来将数据爬虫与可视化结合起来&#xff0c;做个词云展示案例。 二、代码 # -*- coding:utf-8 -*- # 酷狗音乐 通过获取每首歌…...

rkmedia_vi_get_frame_test.c 代码解析

使用示例&#xff1a; 录像&#xff1a; rkmedia_vi_get_frame_test -a /etc/iqfiles/ -I 1 -o 1080.nv12 然后用yuvplayer.exe可以播放。 录像10帧&#xff1a; rkmedia_vi_get_frame_test -a /etc/iqfiles/ -I 1 -o 1080.nv12 -c 10 解析代码&#xff1a; #include <as…...

探究Kafka原理-3.生产者消费者API原理解析

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44…...

Linux系统iptables扩展

目录 一. iptables规则保存 1. 导出规则保存 2. 自动重载规则 ①. 当前用户生效 ②. 全局生效 二. 自定义链 1. 新建自定义链 2. 重命名自定义链 3. 添加自定义链规则 4. 调用自定义链规则 5. 删除自定义链 三. NAT 1. SNAT 2. DNAT 3. 实验 ①. 实验要求 ②. …...

Openwrt 系统安装 插件名称与中文释义

系统镜像 当时是去官网找对应的&#xff0c;但是作为门外汉&#xff0c;想简单&#xff0c;可以试试这个网站 插件 OpenWrt/Lede全部插件列表功能注释...

[原创]Delphi的SizeOf(), Length(), 动态数组, 静态数组的关系.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi…...