VS2022 MFC对话框应用OLE读写操作excel

一、添加文件和代码需要包含的库

解决方案资源管理器-工程名称-右键-添加-新建项-MFC-TypeLib中的MFC类-双击或添加-实现接口的位置-文件-点击文件路径旁的 "..." 浏览按钮。你需要找到并选择 EXCEL.EXE 文件。其常见路径为 C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE(Office 2016及更高版本默认路径)或 C:\Program Files (x86)\Microsoft Office\Office*版本号*\EXCEL.EXE -可用接口_Application、_Workbook、_Worksheet、Range、Workbooks、Worksheets->-实现接口显示对应的名称-确定

二、向导生成的代码通常不能直接编译,还需要做一些清理工作:

  1. 注释冗余导入 :打开刚生成的每个类的头文件(如 CApplication.h、CWorkbook.h等),找到类似下面这行的代码并将其注释掉:

    复制代码
    // #import "C:\\Program Files\\Microsoft Office\\root\\Office16\\EXCEL.EXE" no_namespace

    如果多个文件都保留这行,编译时会导致类型重复定义

  2. CRange.h会报错:CRange.h(335,10): error C2059: 语法错误:","双击错误直接找到对应的段是VARIANT DialogBox()

    {

    VARIANT result;

    InvokeHelper(0xf5, DISPATCH_METHOD, VT_VARIANT, (void*)&result, nullptr);

    return result;

    }我直接给注释掉了,有解决办法的请给出,谢谢!

三、添加头文件,在pch.h里添加#include "framework.h"

#include "CApplication.h"

#include "CRange.h"

#include "CWorkbook.h"

#include "CWorkbooks.h"

#include "CWorksheet.h"

#include "CWorksheets.h"

#include <afxdisp.h> // ★ OLE 自动化核心

四、在工程的InitInstance()文件里添加if (!AfxOleInit())

{

return false;

}

五、应用

CApplication ExcelApp; //Excel应用程序对象

CWorkbooks wbsMyBooks; //excel工作簿集合对象

CWorkbook wbMyBook; //excel工作簿对象

CWorksheets wssMysheets; //excel工作表集合对象

CWorksheet wsMysheet; //excel单个工作表对象

CRange rgMyRge; //excel单元格范围

CRange iCell;//单个单元格

CString data_w;

//定义一个COleVariant类型的变量covOptional,并将其初始化为一个错误值。

// 这个变量通常用于在调用Excel对象的方法时表示可选参数未提供。

COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); //可选参数

//定义一个COleVariant类型的变量vResult,用于存储从Excel单元格中读取的值。

//这个变量可以存储不同类型的数据,例如字符串、数字等。

COleVariant vResult; //存储查询结果

/************************启动Excel******************************/

//创建Excel 2000服务器(启动Excel)

if (!ExcelApp.CreateDispatch("Excel.Application", NULL))

{

AfxMessageBox("创建Excel服务失败!");

exit(1);

}

/************************启动Excel******************************/

/************************打开Excel******************************/

//得到文档

//获取Excel应用程序中的工作簿集合对象,并将其附加到wbsMyBooks变量上。

wbsMyBooks.AttachDispatch(ExcelApp.get_Workbooks(), true); //获取工作簿集合

//在Excel中打开指定路径的工作簿,并将其附加到wbMyBook变量上。

wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t(Filepath))); //打开指定文件

//得到Worksheets

wssMysheets.AttachDispatch(wbMyBook.get_Worksheets(), true);//获取工作表集合

//得到sheet1

wsMysheet.AttachDispatch(wssMysheets.get_Item(_variant_t("sheet1")), true); //获取名为"sheet1"的工作表对象

/************************打开Excel******************************/

/************************写入数据*****************************/

rgMyRge.AttachDispatch(wsMysheet.get_Cells()); //获取工作表中的所有单元格,并将其附加到rgMyRge变量上。

//获取当前行(n_row)和第i列的单元格对象,并将其附加到rgMyRge变量上。

rgMyRge.AttachDispatch(rgMyRge.get_Item(COleVariant((long)n_row), COleVariant((long)j)).pdispVal); // 定位到第n_row行第i列

//将m_str数组中对应索引的值写入当前单元格中。

rgMyRge.put_Value2(COleVariant((m_strj)));//写入对应的数据

/********************写入数据*****************************/

/**********************保存并关闭***************************/

wbMyBook.SaveCopyAs(COleVariant(Filepath));//保存副本 将当前工作簿另存为指定路径的文件。

wbMyBook.Close(COleVariant(short(FALSE)), COleVariant(Filepath), covOptional); //关闭工作簿 关闭工作簿对象,并指定不保存更改,提供文件路径和可选参数。

wbsMyBooks.Close();//关闭工作簿集合对象,释放资源。

ExcelApp.Quit(); //退出Excel应用程序,释放资源。

// 释放所有Dispatch对象

rgMyRge.ReleaseDispatch();

wsMysheet.ReleaseDispatch();

wssMysheets.ReleaseDispatch();

wbMyBook.ReleaseDispatch();

wbsMyBooks.ReleaseDispatch();

ExcelApp.ReleaseDispatch();

/**********************保存并关闭***************************/

相关推荐
小小龙学IT36 分钟前
Go 语言 cgo 与 C/C++ 互操作深度解析:从 fwlib 直连到工业数采网关实战系列
c语言·c++·golang
程序员老陆2 小时前
C++ 多线程通信方式全景:从共享内存到结构化协调
开发语言·c++
某不知名網友3 小时前
ROS2 核心通信:话题发布与订阅详解
开发语言·c++
C++ 老炮儿的技术栈3 小时前
char (*csConnectName)[256]; 和 char csConnectName [256] 有什么区别
java·c语言·开发语言·c++·人工智能·算法·c
百数平台3 小时前
百数表格知识库配置指南:Excel/CSV 上传、表结构字段类型与 NL2SQL 查询全说明
excel
大鹏说大话3 小时前
C++ STL 容器怎么选?vector、list、map、unordered_map 对比
开发语言·c++·list
JMchen3 小时前
性能优化——让Native代码飞起来
android·c++·性能优化
chenbingjie_c3 小时前
手撕 C++ priority_queue:二叉堆 + 模板仿函数 + 模板特化(保姆级逐函数拆解)
开发语言·c++
小小龙学IT4 小时前
C++ Redis 客户端深度解析(hiredis 与 redis-plus-plus)——工业数采实时缓存 C++ 侧实战
c++·redis·缓存
垆边人似月.4 小时前
华为机试题 :最长递增子序列题目
数据结构·c++·算法·华为