VS2010 对Excel读写操作

本文介绍如何使用VS2010进行Excel的基本读写操作,包括创建表格、填充数据、设置样式等,并提供了完整的实例代码。

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

VS2010对Excel读写操作

一、开发环境

  • 编程环境 VS2010
  • office版本 office 2010
  • 注意 :这里office版本号不一定非得和vs版本号一致。

二、基本实现功能

  • 基本实现对Excel的读写
  • 创建一个表格,并向里面写入内容

三、基本操作步骤

1. 新建一个基于MFC的对话框工程。
  • 如下图。注意:勾选基本对话框。默认编码方式使用的是Unicode库,在对字符操作时需要将char转化为TCHAR,一般用_T(“xxx”)即可。(vc6 默认不是uicode这点需要区别)
    图1

其余选择,默认直接点击完成即可。生成一个基本对话框。
图2
将上面的默认控件删除。

2. 导入Excel类库
  • 从office安装目录下找到EXCEL.exe(D:\Program Files(x86)\Microsoft Office\Office14),在VS2010中添加类库(从类库中添加)类向导->添加类->从类库中添加。如下图:
    图3

图4

  • 依次从接口:_Application、_Workbook、_Worksheet、Workbooks、Worksheets、Font、Range(暂时只用到这些)生成对应的类(CApplication 、CWorkbook、CWorksheet、CWorkbook、Cworksheets、CFont0、CRange)如下图所示。点击确定,总生成对应.h、.cpp文件并添加到工程。
    图5

  • 在所建对话框添加一个按钮,名字修改为导出EXCEL,ID修改为IDC_BTN_EXCEL,添加一个消息消息函数(这里为OnBtnExcel())。

3. 解决导入工程后的编译错误。
  • 在stdafx.h中包含,以上头文件,编译。
#include "CApplication.h"
#include "CFont0.h"
#include "CRange.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"
  • 屏蔽掉导入每个头文件下的//#import “D:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE” no_namespace
  • 编译出现1>c:\users\desktop\exceltest\crange.h(335): warning C4003: “DialogBoxW”宏的实参不足。将DialogBox修改为_DialogBox。
4. 实例代码。
  • 在CExcelTestApp的InitInstance初始化com组件,添加COM/OLE支持
	if(CoInitialize(NULL)!=0)
	{
		AfxMessageBox(_T("初始化失败"));
	}

同时在ExitInstance里释放资源

    CoUninitialize();  //释放com资源
  • 在对话框的按钮事件实现导出EXCEL。
/**********************************************************************
*作者:ywx2904
*函数名:OnBtnExcel
*功  能:创建Excel,向里面添加内容,并导出
*参  数: 无
*返回值:无
***********************************************************************/
void CExcelTestDlg::OnBtnExcel()
{
	//1.创建基本对象
	CApplication App;  //创建应用程序实例
	CWorkbooks Books;  //工作簿,多个Excel文件
	CWorkbook Book;    //单个工作簿
	CWorksheets sheets;//多个sheet页面
	CWorksheet sheet;  //单个sheet页面
	CRange range;      //操作单元格
	//2.打开指定Excel文件,如果不存在就创建
	char path[MAX_PATH];
	GetCurrentDirectory(MAX_PATH,(TCHAR*)path);//获取当前路径
	CString strExcelFile =(TCHAR*) path;
	CString strdevName = _T("\\Test.xlsx");	   //xls也行
	strExcelFile += strdevName;
	COleVariant
		covTrue((short)TRUE),
		covFalse((short)FALSE),
		covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);

	LPDISPATCH lpdisp = NULL;
	//1.创建Excel实例
	if(!App.CreateDispatch(_T("Excel.Application"),NULL))
	{
		AfxMessageBox(_T("创建Excel实例失败"));
		exit(-1);
	}
	else
	{
		AfxMessageBox(_T("创建成功"));
	}
	App.put_Visible(TRUE);	//打开Excel
	App.put_UserControl(FALSE);	
	//2. 得到workbooks容器
	Books.AttachDispatch(App.get_Workbooks());
	Book.AttachDispatch(Books.Add(covOptional));
	sheets.AttachDispatch(Book.get_Worksheets());
	sheet.AttachDispatch(sheets.get_Item(COleVariant((short)1)));	//获取sheet1
	sheet.put_Name(_T("TestName"));	    //设置sheet1名字

	//3. 加载要合并的单元格
	range.AttachDispatch(sheet.get_Range(COleVariant(_T("B2")),COleVariant(_T("E2"))),TRUE);
	range.Merge(COleVariant((long)0));  //合并单元格

	//4. 设置表格内容
	range.AttachDispatch(sheet.get_Cells(),TRUE);				//加载所有单元格
	range.put_Item(COleVariant((long)2),COleVariant((long)2),COleVariant(_T("电气工程及其自动化课程统计")));
	range.put_Item(COleVariant((long)3),COleVariant((long)2),COleVariant(_T("课程名称")));
	range.put_Item(COleVariant((long)3),COleVariant((long)3),COleVariant(_T("课时")));
	range.put_Item(COleVariant((long)3),COleVariant((long)4),COleVariant(_T("难度")));
	range.put_Item(COleVariant((long)3),COleVariant((long)5),COleVariant(_T("教学方式")));

	range.put_Item(COleVariant((long)4),COleVariant((long)2),COleVariant(_T("电磁场")));
	range.put_Item(COleVariant((long)4),COleVariant((long)3),COleVariant(_T("30")));
	range.put_Item(COleVariant((long)4),COleVariant((long)4),COleVariant(_T("变态难")));
	range.put_Item(COleVariant((long)4),COleVariant((long)5),COleVariant(_T("老师讲课")));

	range.put_Item(COleVariant((long)5),COleVariant((long)2),COleVariant(_T("电机学")));
	range.put_Item(COleVariant((long)5),COleVariant((long)3),COleVariant(_T("40")));
	range.put_Item(COleVariant((long)5),COleVariant((long)4),COleVariant(_T("难")));
	range.put_Item(COleVariant((long)5),COleVariant((long)5),COleVariant(_T("老师讲课加实验")));

	range.put_Item(COleVariant((long)6),COleVariant((long)2),COleVariant(_T("PLC")));
	range.put_Item(COleVariant((long)6),COleVariant((long)3),COleVariant(_T("20")));
	range.put_Item(COleVariant((long)6),COleVariant((long)4),COleVariant(_T("普通")));
	range.put_Item(COleVariant((long)6),COleVariant((long)5),COleVariant(_T("老师讲课加实验")));


	//range.put_Item(COleVariant((long)7),COleVariant((long)2),COleVariant(_T("电力系统")));
	//range.put_Item(COleVariant((long)7),COleVariant((long)3),COleVariant(_T("50")));
	//range.put_Item(COleVariant((long)7),COleVariant((long)4),COleVariant(_T("难")));
	//range.put_Item(COleVariant((long)7),COleVariant((long)5),COleVariant(_T("老师讲课加实验")));

	range.AttachDispatch(sheet.get_UsedRange());//加载已使用的单元格
	range.put_WrapText(COleVariant((long)1));   //设置文本自动换行
	
	//5.设置对齐方式
	//水平对齐:默认 1 居中 -4108, 左= -4131,右=-4152
	//垂直对齐:默认 2 居中 -4108, 左= -4160,右=-4107
	range.put_VerticalAlignment(COleVariant((long)-4108));
	range.put_HorizontalAlignment(COleVariant((long)-4108));
	//6.设置字体颜色
	CFont0 ft;
	ft.AttachDispatch(range.get_Font());
	ft.put_Name(COleVariant(_T("楷体")));	//字体
	ft.put_ColorIndex(COleVariant((long)1));//颜色	//黑色
	ft.put_Size(COleVariant((long)12));     //大小

	range.AttachDispatch(sheet.get_Range(COleVariant(_T("B2")),COleVariant(_T("E2"))),TRUE);
	ft.AttachDispatch(range.get_Font());
	ft.put_Name(COleVariant(_T("华文行楷")));
	ft.put_Bold(COleVariant((long)1));
	ft.put_ColorIndex(COleVariant((long)5));    //颜色	
	ft.put_Size(COleVariant((long)18));         //大小
	Book.SaveCopyAs(COleVariant(strExcelFile)); //保存

	Book.put_Saved(TRUE);
	//8.释放资源
	range.ReleaseDispatch();
	sheet.ReleaseDispatch();
	sheets.ReleaseDispatch();
	Book.ReleaseDispatch();
	Books.ReleaseDispatch();
	App.ReleaseDispatch();
}
5. 最终效果

图6

四、基本原理介绍

一般操作Excel步骤
  • 创建一个Excel应用程序 app
  • 得到Workbooks容器
  • 打开一个workbook或者创建一个workbook
  • 得到workbook的worksheets容器
  • 打开一个worksheet或者创建一个worksheet
  • 通过Range对worksheet里的单元格进行读写操作。
  • 保存Excel释放资源

五、参考文献

http://blog.youkuaiyun.com/xiaoxiangyuan123456/article/details/70941588
http://m.blog.youkuaiyun.com/Augusdi/article/details/5782575

【前言】 工作或学习中可能需要实现基于VC读\写Excel文件的功能,本人最近也遇到了该问题。中间虽经波折,但是最终还是找到了解决问题的办法。 在此跟大家分享,希望对跟我同样迷茫过的同学们有所帮助。 1、程序功能 1)打开一个excel文件; 2)显示到CListCtrl上; 3)新建一个Excel文件。 以上均在对话框中实现。 2、平台 VC++2010 3、实现方法 常用的Excel打开方式有两种 1)通过数据库打开; 2)OLE方式打开。 由于方式1)操作繁琐,经常出现莫名的错误,这里选用方式2). 4、准备步骤 首先新建一个Dialog窗体程序,添加list control和两个按钮 1)将ExcelLib文件夹拷贝到程序目录下; 2)将Export2Excel.h,Export2Excel.cpp两个文件添加到项目; 3)包含头文件,#include "ExcelLib/Export2Excel.h" 通过以上步骤在程序中引入了可以读取Excle文件的CExport2Excel类; 5、打开excel文件 通过按钮点击打开 void CExcelTestDlg::OnBnClickedButtonOpenExcel() { //获取文件路径 CFileDialog* lpszOpenFile; CString szGetName; lpszOpenFile = new CFileDialog(TRUE,"","",OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,"Excel File(*.xlsx;*.xls)|*.xls;*.xlsx",NULL); if (lpszOpenFile->DoModal()==IDOK) { szGetName = lpszOpenFile->GetPathName(); SetWindowText(szGetName); delete lpszOpenFile; } else return; //打开文件 //文件中包含多个sheet时,默认打开第一个sheet CExport2Excel Excel_example; Excel_example.OpenExcel(szGetName); //获取sheet个数 int iSheetNum = Excel_example.GetSheetsNumber(); //获取已使用表格行列数 int iRows = Excel_example.GetRowCount(); int iCols = Excel_example.GetColCount(); //获取单元格的内容 CString cs_temp = Excel_example.GetText(1,1); //AfxMessageBox(cs_temp); //List control上显示 //获取工作表列名(第一行) CStringArray m_HeadName; m_HeadName.Add(_T("ID")); for (int i=1;iGetItemCount()>0) { m_list.DeleteColumn(0); } //初始化ClistCtrl,加入列名 InitList(m_list,m_HeadName); //填入内容 //第一行是标题,所以从第2行开始 CString num; int pos; for (int row = 2;row<=iRows; row++) { pos = m_list.GetItemCount(); num.Format(_T("%d"),pos +1); m_list.InsertItem(pos,num); for (int colum=1;columDoModal()==IDOK) { szGetName = lpszOpenFile->GetPathName(); SetWindowText(szGetName); delete lpszOpenFile; } else return; //文件全名称 CString csFileName = szGetName; //需要添加的两个sheet的名称 CString csSheetName = "newSheet"; CString csSheetName2 = "newSheet2"; // 新建一个excel文件,自己写入文字 CExport2Excel Excel_example; //新建excel文件 Excel_example.CreateExcel(csFileName); //添加sheet,新加的sheet在前,也就是序号为1 Excel_example.CreateSheet(csSheetName); Excel_example.CreateSheet(csSheetName2); //操作最开始添加的sheet:(newSheet) Excel_example.SetSheet(2); //添加表头 Excel_example.WriteHeader(1,"第一列"); Excel_example.WriteHeader(2,"第二列"); //添加核心数据 Excel_example.WriteData(1,1,"数据1"); Excel_example.WriteData(1,2,"数据2"); //保存文件 Excel_example.Save(); //关闭文件 Excel_example.Close(); } 7、注意事项 1)一般单个Excel文件包含多个sheet,程序默认打开第一个; 2)指定操作sheet,使用Excel_example.SetSheet(2)函数; 3)打开文件时最左侧的sheet序号为1,新建excel时最新添加的sheet序号为1. 【后记】 本程序主要基于网络优快云中---“Excel封装库V2.0”---完成,下载地址是:http://download.youkuaiyun.com/detail/yeah2000/3576494,在此表示感谢!同时, 1)在其基础上作了小改动,改正了几个小错误,添加了几个小接口; 2)添加了如何使用的例子,原程序是没有的; 3)详细的注释 发现不足之处,还请大家多多指教!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值