mfc对Excel的操作

文章介绍了如何在MFC环境下配置Excel操作,包括引入资源类、选择Office安装目录中的接口。详细步骤涉及从Excel导入数据到ListControl,以及将ListControl数据导出到Excel,提供了关键代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mfc对Excel的操作

配置环境

首要条件:安装好Office

引入Excel资源类

在解决方案资源管理器中右击项目:添加->新建项
请添加图片描述

选择MFC->TypeLib中的MFC类
请添加图片描述

实现接口的位置选文件,位置选择EXCEL.EXE(从Office安装目录中找),实现接口选择_Application_Workbook_WorksheetRangeWorkbooksWorksheets
请添加图片描述

在解决方案资源管理器的头文件中会出现.h文件。
请添加图片描述

在项目的头文件下引入Excel类的头文件。

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

在刚引入的头文件中注释一下代码:

//#import "D:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" no_namespace

进入CRange.h文件中

将DialogBox改为_DialogBox

配置完成。

对Excel操作

从Excel中导入数据操作

Excel中的数据导入到List Control中显示出来。

// 按下导入数据按钮
void CDialogTest::ImportData()
{
	// 选择合适的文件读入数据
	//
	//设置过滤器
	TCHAR szFilter[] = _T("Excel文件(*.xls/*.xlsx)|*.xls*|所有文件(*.*)|*.*||");
	CFileDialog fileDlg(TRUE, _T("doc"), _T(""), OFN_OVERWRITEPROMPT, szFilter, this);
	CString sExcelFile;
	// 构造打开文件对话框
	if (IDOK == fileDlg.DoModal())
	{
		// 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径存储到strFilePath中
		sExcelFile = fileDlg.GetPathName();
		//MessageBox(sExcelFile, _T("Output")); // 输出打开文件所在的路径
	}

	if (sExcelFile == "") return;

	//读取Excel中的数据
	ReadAllItem(sExcelFile);
}

// 读出Excel所有内容,将其所有内容显示在list上
void CDialogTest::ReadAllItem(CString sExcelFile) // 读取Excel文本
{
	CApplication App;//创建应用实例
	CWorkbooks Books;//工作簿,多个Excel文件
	CWorkbook Book;//单个工作簿
	CWorksheets sheets;//多个sheets页面
	CWorksheet sheet;//单个sheet页面
	CRange range;//操作单元格
	CRange iCell;
	LPDISPATCH lpDisp;
	COleVariant vResult;  //COleVariant类是对VARIANT结构的封装
	COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);


	if (!App.CreateDispatch(_T("Excel.Application"), NULL))
	{
		AfxMessageBox(_T("无法启动Excel服务器!"));
		return;
	}


	Books.AttachDispatch(App.get_Workbooks());
	lpDisp = Books.Open(sExcelFile, 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);

	//获取行列号
	range = sheet.get_UsedRange();
	range = range.get_Rows();
	long rows = range.get_Count();
	range = range.get_Columns();
	long columns = range.get_Count();

	// 清空List数据
	m_List.DeleteAllItems(); //清空所有表项

	// 设置Id的值
	CString strSql = _T("select * from UserInfo;");

	CString strLastId;
	int lastId = RowToId[m_rows - 1] + 1;

	for (long i = 2; i < rows + 1; i++) // 从第二行开始读数据,第一行是表头的信息
	{
		CStringArray strListData; // 存储放在List中的Data信息

		for (long j = 1; j < columns + 1; j++)
		{
			range.AttachDispatch(sheet.get_Cells());
			range.AttachDispatch(range.get_Item(COleVariant(i), COleVariant((long)j)).pdispVal);   //第一变量是行,第二个变量是列,即第i行第j列
			vResult = range.get_Value2();
			CString str;
			if (vResult.vt == VT_BSTR) //字符串  
			{
				str = vResult.bstrVal;
				strListData.Add(str);
			}
			else if (vResult.vt == VT_R8) //8字节的数字  
			{
				str.Format(_T("%.lf"), vResult.dblVal);
				strListData.Add(str);
			}
			else // 若Excel有个单元格为空时会出现错误
			{
				strListData.Add(_T(""));
			}
		}
		m_List.InsertItem(i - 2, strListData[0]);
		m_List.SetItemText(i - 2, 1, strListData[1]);
		m_List.SetItemText(i - 2, 2, strListData[2]);
	}

	Books.Close();
	App.Quit();
	//释放对象      
	range.ReleaseDispatch();
	sheet.ReleaseDispatch();
	sheets.ReleaseDispatch();
	Book.ReleaseDispatch();
	Books.ReleaseDispatch();
	App.ReleaseDispatch();
}

将数据导出Excel操作

List Control的数据导入Excel

// 导出所有数据
void CDialogTest::ExportData(CString sExcelFile)
{
	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;
	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("id"), _T("Account"), _T("Pass") };
	for (int setnum = 0; setnum < m_List.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_ListData.GetItemText(setnum - 1, num)));//GetItemText()获取第setnum-1行,num列的文本
			}
		}
	}
	//保存
	book.SaveCopyAs(COleVariant(sExcelFile));  //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();
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值