MFC导出到Excel

2023-10-27

软件:vs2013

程序功能:将ListControl内容导出到Excel里

步骤:

第一步:创建基于对话框的MFC工程

第二步:添加库、添加Excel类库

在工程名上右键,选择“添加”—“类”(或者点击菜单栏的“项目”->“添加类”),选择“TypeLib中的MFC类”(MFC Class From TypeLib)

类来源选“注册表”,在可用的类型库中选择“Microsoft Excel 12.0 Object Library<1.6>”在接口列表框中选择需要的类,在此,我们选择_Application,_Workbook,Worksheet,Range,Workbooks,Worksheets这六个就可以了。

但是有的接口里没东西,例如:

怎么办呢?不急。可以选“文件”,找到EXCEL.EXE的位置,来进行添加:(我的位置在:D:\office\Office14\EXCEL.EXE)

第三步:修改头文件

分别将加进来的六个头文件上面的“#import "C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" no_namespace”注释掉。

第四步:编译,修改错误

编译,会出现两个错误:

…\crange.h(335): warning C4003: “DialogBoxW”宏的实参不足

…\crange.h(335): error C2059: 语法错误:“,”

双击错误提示,定位在错误行,

    VARIANT DialogBox()

    {

         VARIANT result;

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

         return result;

    }

将该函数名“DialogBox()”前面加“_”下划线,即“_DialogBox()”,这样就可以编译成功了。

第五步:删除对话框内容,添加对应控件

1.在对话框中添加列表控件,关联变量m_Grid,并设置显示为报表样式:

打开工具箱选择List Control(列表控件),移到合适位置后,更改属性,鼠标右击选择“属性”,View-->Report,Border-->True

添加变量:类别Control,变量名m_Grid

2.在对话框中添加“导出”按钮

第六步:代码(可以直接将代码复制运行下)

添加头文件

#include "CWorkbook.h"                //管理单个工作表
#include "CWorkbooks.h"         //统管所有的工作簿
#include "CApplication.h"          //Excel应用程序类,管理我们打开的这整个Excel应用
#include "CRange.h"               //区域类,对EXcel的大部分操作都要和这个打招呼
#include "CWorksheet.h"            //工作薄中的单个工作表
#include "CWorksheets.h"            //统管当前工作簿中的所有工作表

在初始化函数中,先初始化列表(C导出到ExcleDlg::OnInitDialog)红框里为添加的代码位置

//设置列表视图的扩展风格
	m_Grid.SetExtendedStyle(LVS_EX_FLATSB            //扁平风格显示滚动
		| LVS_EX_FULLROWSELECT                       //允许整行选中
		| LVS_EX_HEADERDRAGDROP               //允许整列拖动
		| LVS_EX_ONECLICKACTIVATE                //单击选中项
		| LVS_EX_GRIDLINES                  //画出网格线
		);
	//设置表头
	m_Grid.InsertColumn(0, _T("编号"), LVCFMT_LEFT, 80, 0);
	m_Grid.InsertColumn(1, _T("姓名"), LVCFMT_LEFT, 80, 1);
	m_Grid.InsertColumn(2, _T("所属部门"), LVCFMT_LEFT, 80, 2);

	//向列表中插入数据
	int count = 0;
	m_Grid.InsertItem(count, _T("001"));//行
	m_Grid.SetItemText(count, 1, _T("张一"));
	m_Grid.SetItemText(count++, 2, _T("销售部"));

	m_Grid.InsertItem(count, _T("002"));
	m_Grid.SetItemText(count, 1, _T("张二"));
	m_Grid.SetItemText(count++, 2, _T("研发部"));
	m_Grid.InsertItem(count, _T("003"));
	m_Grid.SetItemText(count, 1, _T("张三"));
	m_Grid.SetItemText(count++, 2, _T("采购部"));
	m_Grid.InsertItem(count, _T("004"));
	m_Grid.SetItemText(count, 1, _T("张四"));
	m_Grid.SetItemText(count, 2, _T("宣传部"));

编写按钮的响应函数:
 

	CString strFile = _T("E:\\Test.xls");
	COleVariant
		covTrue((short)TRUE),
		covFalse((short)FALSE),
		covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	CApplication app;
	CWorkbooks books;
	CWorkbook book;
	CWorksheets sheets;
	CWorksheet sheet;
	CRange range;
	CFont font;
	if (!app.CreateDispatch(_T("Excel.Application")))
	{
		MessageBox(_T("创建失败!"));
		return;
	}

	books = app.get_Workbooks();
	book = books.Add(covOptional);
	sheets = book.get_Worksheets();             //得到books
	sheet = sheets.get_Item(COleVariant((short)1));
	//得到全部Cells
	range.AttachDispatch(sheet.get_Cells());
	CString sText[] = { _T("编号"), _T("姓名"), _T("所属部门") };
	for (int setnum = 0; setnum < m_Grid.GetItemCount() + 1; setnum++)   //GetItemCount()列表的里面的条目数量, 横着的  行
	{
		for (int num = 0; num < 3; num++)
		{
			if (!setnum)
			{
				range.put_Item(_variant_t((long)(setnum + 1)), variant_t((long)(num + 1)),
					_variant_t(sText[num]));
			}
			else
			{
				range.put_Item(_variant_t((long)(setnum + 1)), _variant_t((long)(num + 1)),
					_variant_t(m_Grid.GetItemText(setnum - 1, num)));//GetItemText()获取第setnum-1行,num列的文本
			}
		}
	}
	//保存
	book.SaveCopyAs(COleVariant(strFile));  //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();

最终结果如下:

按下导出按钮后

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MFC导出到Excel 的相关文章

随机推荐

  • linux安装 MySQL 5.7

    我的是CentOS 7 虚拟机 因为之前一直安装失败 浪费了不少时间 特此记录一下正确安装步骤 亲测可用 1 下载命令 wget https dev mysql com get mysql57 community release el7 9
  • 微信小程序云开发——图片展示,视频播放案例

    这次是帮朋友写的一个简单的小程序 考虑到成本和页面简单的问题 我就决定用小程序云开发来进行开发 后来实际开发的时候发现 页面用到图片实在是太多 CDN流量一个月5G根本不够用 但是我看到了数据库一天可以免费访问5万次 我就决定用base64
  • 区块链存证原理

    公证通 Factom公证通 一本由共识算法维护的账本 网录科技 网录科技CTO汪波 区块链做存证的原理及方式 专注区块链技术开发 网录科技千万级天使轮融资 Blockstack 官网 https blockstack org 白皮书 htt
  • 用python编写daemon监控进程并自动恢复

    用python编写daemon监控进程并自动恢复 下面这个程序是用于python编写daemon监控进程并自动恢复 参考http pythonhosted org KiTT modules kitt daemon html usr bin
  • mac下 docker 挂载目录权限问题(operation not permitted)

    在docker run 或者 docker compose yml 添加privileged true privileged的含义是让容器内的root拥有真正root用户的权限 否则它只是一个名为root的普通用户 但是在macos下 即使
  • select函数使用时应注意的问题

    问题一 fd set和timeval的重置 select函数的使用一般分为以下几步 1 FD ZERO fd set 2 FD SET int fd fd set 3 int select int n fd set readfds fd s
  • VSCode批量代码比较

    前言 最近因为工作原因 需要找出一个工程里面修改过的地方 VSCode里自带代码比较功能 可以高亮代码不同的地方 然而手动一个个打开文件来比较显然非常的繁琐 在网上检索后发现并没有相关的方法 因此 为了解决这个问题 在查阅了官方文档后 决定
  • 操作系统笔记整理12——磁盘存储器的管理

    点此链接可跳转到 操作系统笔记整理 目录索引页 参考书籍 计算机操作系统 第四版 汤小丹等编著 文章目录 点此链接可跳转到 操作系统笔记整理 目录索引页 外存的组织方式 连续组织方式 链接组织方式 隐式链接 显示链接 FAT File Al
  • [架构之路-200]- 性能需求与性能分析:影响性能的主要因素

    目录 前言 关于性能的几点说明 第一章 性能需求 提出各种性能指标 1 1 可靠性或可用性 stablity 1 2 处理能力或效率 Performance 1 2 1 指标是吞吐率 1 2 2 指标是响应时间 1 2 3 指标是资源利用率
  • 数据库SQL查询(一)

    本文介绍SQL查询 如何在海量数据中筛选想要数据 数据库管理系统选择 关系型数据库mysql 数据库管理工具选择 navicat 本文中查询语句和查询案例参考自 https edu csdn net course detail 27673
  • QXlsx读写数据库

    最近写读写xlsx文件的工具 用了Qt自带的比较卡 操作也不舒服 最后选择用了QXlsx QXlsx源码地址 github https github com dbzhang800 QtXlsxWriter QXlsx官网连接 Documen
  • AIX 软件包理论与实践

    AIX 软件包理论与实践 文档选项 打印本页 将此页作为电子邮件发送 未显示需要 JavaScript 的文档选项
  • Win10系统如何共享文件夹,教你怎么操作

    如何在两台电脑之间实现快速传输文件 最简单快捷的方法就是让这两台电脑共享文件夹 甚至都不用第三方的工具了 很多人可能都不知道如何设置共享文件 这里就和大家分享以下方法吧 更多系统教程尽在小白系统重装官网 系统 win10专业版 电脑 惠普
  • 使用openmv将检测到的视频传输到esp8266-12f使用spi来传输视频

    使用 OpenMV 将检测到的视频传输到 ESP8266 12F 使用 SPI 来传输视频的步骤如下 在 OpenMV 中使用摄像头捕捉视频 然后使用图像处理算法进行处理 将处理后的视频帧转换为适合通过 SPI 传输的格式 例如 JPEG
  • vue导出功能

    导出功能支持多级表头导出 导出后的excel自带可修改的样式 目录 前言 一 安装相关依赖 二 文件目录 1 Blob js 2 export js 3 Export2Excel js 三 创建导出组件 四 使用导出组件 前言 表格导出功能
  • Linux OOM killer(转)

    OOM killer 当物理内存和交换空间都被用完时 如果还有进程来申请内存 内核将触发OOM killer 其行为如下 1 检查文件 proc sys vm panic on oom 如果里面的值为2 那么系统一定会触发panic 2 如
  • 最新AI创作系统ChatGPT程序源码+详细搭建部署教程+微信公众号版+H5源码/支持GPT4.0+GPT联网提问/支持ai绘画+MJ以图生图+思维导图生成!

    使用Nestjs和Vue3框架技术 持续集成AI能力到系统 新增 MJ 官方图片重新生成指令功能 同步官方 Vary 指令 单张图片对比加强 Vary Strong Vary Subtle 同步官方 Zoom 指令 单张图片无限缩放 Zoo
  • stm32 esp8266配网-smartConfig和BT串口方式配网

    stm32 esp8266 ota系列文章 stm32 esp8266 ota 快速搭建web服务器之docker安装openresty stm32 esp8266 ota升级 tcp模拟http stm32 esp8266 ota升级 h
  • 概要设计、详细设计:概念、方法、实践步骤

    完整软件开发流程 需求分析 概要设计 详细设计 一 1 概念 方法 实践步骤 设计是指根据需求开发的结果 对产品的技术实现由粗到细进行设计的过程 根据设计粒度和目的的不同可以将设计分为概要设计 详细设计等阶段以便于管理和确保质量 设计内容也
  • MFC导出到Excel

    软件 vs2013 程序功能 将ListControl内容导出到Excel里 步骤 第一步 创建基于对话框的MFC工程 第二步 添加库 添加Excel类库 在工程名上右键 选择 添加 类 或者点击菜单栏的 项目 gt 添加类 选择 Type