VC2010对Excel的操作

转载请标明:转载自【小枫栏目】,博文链接:http://blog.csdn.net/rexuefengye/article/details/11482713

1.创建新的C++工程


创建基于对话框的MFC程序


2.添加库、添加Excel类库


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



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




可以看到,六个类被添加了进来。


3.修改头文件


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



4.添加头文件

在stdAfx.h头文件中添加加进来的这几个头文件

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

5.编译,会出现两个错误:

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

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

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

	VARIANT DialogBox()
	{
		VARIANT result;
		InvokeHelper(0xf5, DISPATCH_METHOD, VT_VARIANT, (void*)&result, NULL);
		return result;
	}

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


6.在对话框中添加一个编辑框,并为其关联一CEdit类型变量m_Path,添加“打开”按钮,实现打开一已经存在的Excel文件。并将路径显示在编辑框中。


实现代码如下。

void CExportToExcelDlg::OnBnClickedButtonOpen()
{
	CFileDialog file(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
		_T("EXCEL文件t(*.xls;*.xlsx)|*.xls;*.xlsx||"),AfxGetMainWnd());
	if(file.DoModal()==IDOK)
	{
		CString strPath=file.GetPathName();
		m_Path.SetWindowTextW(strPath);
		CApplication app;
		CWorkbook book;
		CWorkbooks books;
		if (!app.CreateDispatch(_T("Excel.Application")))
		{
			MessageBox(_T("Error!Creat Excel Application Server Faile!"));
			exit(1);
		}
		//books.AttachDispatch(app.get_Workbooks(),true);
		//book.AttachDispatch(books.Add(_variant_t(strPath)));
		books = app.get_Workbooks();		
		book = books.Add(_variant_t(strPath));

		app.put_Visible(true);

		//结尾,释放
		book.ReleaseDispatch();   
		books.ReleaseDispatch();   
		app.ReleaseDispatch();
		app.Quit();

	}
}

7.在对话框中添加“写入”按钮,实现新建一Excel文件(存在则覆盖),并向文件中写入数据。实现代码如下。

void CExportToExcelDlg::OnBnClickedButtonWrite()
{
	CString strFile = _T("D:\\WriteToExcelTest.xlsx");

	COleVariant 
		covTrue((short)TRUE), 
		covFalse((short)FALSE), 
		covOptional((long)DISP_E_PARAMNOTFOUND,   VT_ERROR); 

	CApplication app;
	CWorkbook book;
	CWorkbooks books;
	CWorksheet sheet;
	CWorksheets sheets;
	CRange range;
	CFont font;

	if (!app.CreateDispatch(_T("Excel.Application")))
	{
		MessageBox(_T("Error!Creat Excel Application Server Faile!"));
	}

	books = app.get_Workbooks();
	//books.AttachDispatch(app.get_Workbooks());可代替上面一行
	book = books.Add(covOptional);
	//book.AttachDispatch(books.Add(covOptional),true); 可代替上面一行
	sheets=book.get_Worksheets();
	//sheets.AttachDispatch(book.get_Worksheets(),true); 可代替上面一行
	sheet = sheets.get_Item(COleVariant((short)1));
	//sheet.AttachDispatch(sheets.get_Item(_variant_t("sheet1")),true); 可代替上面一行
	//下面两行,是向A1中写入"Yeah!I can write data to excel!"
	range = sheet.get_Range(COleVariant(_T("A1")),COleVariant(_T("A1"))); 
	range.put_Value2(COleVariant(_T("Yeah!I can write data to excel!")));
	
	//下面是向第二行的前十个单元格中输入1到10,十个数字
	for(long i=1;i<11;i++)
		range.put_Item(_variant_t((long)2),_variant_t((long)i),_variant_t((long)i));

	//设置列宽
	range = sheet.get_Range(COleVariant(_T("A1")),COleVariant(_T("J1")));
	range.put_ColumnWidth(_variant_t((long)5));

	//显示表格
	app.put_Visible(TRUE);

	//保存
	book.SaveCopyAs(COleVariant(strFile)); 
	book.put_Saved(true);

	//结尾,释放
	book.ReleaseDispatch();   
	books.ReleaseDispatch();   
	app.ReleaseDispatch();
	app.Quit(); 

}

8.在对话框中添加列表控件,并关联变量m_Grid,并设置显示为报表样式。在对话框中添加“写入列表”按钮,实现将对话框中已有的表写入到Excel中。实现代码如下。
在初始化函数中,先初始化列表。

//设置列表视图的扩展风格
	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,100,0);
	m_Grid.InsertColumn(1,_T("姓名"),LVCFMT_LEFT,100,1);
	m_Grid.InsertColumn(2,_T("所属部门"),LVCFMT_LEFT,100,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("宣传部"));

再编写按钮的响应函数

void CExportToExcelDlg::OnBnClickedButtonWritelist()
{
	// TODO: 在此添加控件通知处理程序代码
	CString strFile = _T("D:\\WriteListToExcelTest.xlsx");

	COleVariant 
		covTrue((short)TRUE), 
		covFalse((short)FALSE), 
		covOptional((long)DISP_E_PARAMNOTFOUND,   VT_ERROR); 

	CApplication app;
	CWorkbook book;
	CWorkbooks books;
	CWorksheet sheet;
	CWorksheets sheets;
	CRange range;

	if (!app.CreateDispatch(_T("Excel.Application")))
	{
		MessageBox(_T("Error!Creat Excel Application Server Faile!"));
		exit(1);
	}
	books = app.get_Workbooks();
	book = books.Add(covOptional);
	sheets = book.get_Worksheets();
	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++)
	{
		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)));
			}
		}
	}
	//保存
	book.SaveCopyAs(COleVariant(strFile)); 
	book.put_Saved(true);
	app.put_Visible(true); 
	
	//释放对象 
	range.ReleaseDispatch(); 
	sheet.ReleaseDispatch(); 
	sheets.ReleaseDispatch(); 
	book.ReleaseDispatch(); 
	books.ReleaseDispatch();
	app.ReleaseDispatch(); 
	app.Quit(); 
}

效果图:




按【打开】按钮,出现打开对话框,可选择Excel打开。



按【写入】按钮,打开Excel文件。



按下【写入列表】,打开Excel文件。



引用文章:http://wenku.baidu.com/view/d7383548767f5acfa1c7cd30.html

【前言】 工作或学习中可能需要实现基于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. 【后记】 本程序主要基于网络CSDN中---“Excel封装V2.0”---完成,下载地址是:http://download.csdn.net/detail/yeah2000/3576494,在此表示感谢!同时, 1)在其基础上作了小改动,改正了几个小错误,添加了几个小接口; 2)添加了如何使用的例子,原程序是没有的; 3)详细的注释 发现不足之处,还请大家多多指教!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血枫叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值