VS2008用mfc读Excel文件


1、获取驱动代码:自己添加的成员函数CString CMFC_SEECOLORDlg::GetExcelDriver(void),这里参考自:http://bbs.csdn.net/topics/340079163#new_post

CString CMFC_SEECOLORDlg::GetExcelDriver(void)
{
	wchar_t szBuf[2001];
	wchar_t excl[]=L"Excel";
	WORD cbBufMax = 2000;
	WORD cbBufOut;
	wchar_t *pszBuf = szBuf;
	CString sDriver;
	// 获取已安装驱动的名称(涵数在odbcinst.h里)
	if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))
		return L"";

	// 检索已安装的驱动是否有Excel...     
	do
	{
		if (wcsstr(pszBuf, excl) != 0)
		{
			//发现 !
			sDriver = CString(pszBuf);
			break;
		}
		wchar_t ze={'\0'};
		pszBuf = wcschr(pszBuf,ze) + 1;
	}
	while (pszBuf[1] != '\0');
	return sDriver;

}

2、读Excel的代码:加一个读Excel按钮,添加它的响应函数void CMFC_SEECOLORDlg::OnBnClickedButtonRead(),百度得到的,嘿嘿、、

void CMFC_SEECOLORDlg::OnBnClickedButtonRead()
{		// TODO: Add your control notification handler code here
	CDatabase database;
	CString sSql;
	CString sItem1, sItem2,sItem3;
	CString sDriver;
	CString sDsn;
	CString sFile,sPath;

	//获取主程序所在路径,存在sPath中
	GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
	sPath.ReleaseBuffer ();
// 	MessageBox(sPath);
	int nPos;
	nPos=sPath.ReverseFind ('\\');
	sPath=sPath.Left (nPos);
	sFile = sPath + _T("\\Demo.xls");     // 将被读取的Excel文件名
	// 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)" 
	sDriver = GetExcelDriver();
	MessageBox(sDriver);
	if (sDriver.IsEmpty())
	{
		// 没有发现Excel驱动
		AfxMessageBox(_T("没有安装Excel驱动!"));
		return;
	}
	// 创建进行存取的字符串
	sDsn.Format(_T("ODBC;DRIVER={%s};DSN=' ';DBQ=%s"), sDriver, sFile);
	TRY
	{
		// 打开数据库(既Excel文件)
		database.Open(NULL, false, false, sDsn);
		CRecordset recset(&database);
		// 设置读取的查询语句.

		sSql = "SELECT Num,Name, Age " //设置索引顺序     
			"FROM Exceldemo " ;                
		"ORDER BY Name ";

		// 执行查询语句
		recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
		// 获取查询结果
		while (!recset.IsEOF())
		{
			//读取Excel内部数值
			recset.GetFieldValue(_T("Num"), sItem1);
			recset.GetFieldValue(_T("Name"), sItem2);
			recset.GetFieldValue(_T("Age"), sItem3);
			//显示记取的内容
			m_ExcelList.AddString( sItem1 + _T(" --> ")+sItem2+ _T(" --> ")+sItem3 );
			// 移到下一行
			recset.MoveNext();
		}
		// 关闭数据库
		database.Close();

	}
	CATCH(CDBException, e)
	{
		// 数据库操作产生异常时...
		AfxMessageBox(_T("数据库错误: ")+ e->m_strError);
	}
	END_CATCH;
}


3、写Excel的代码:加一个写Excel按钮,添加它的响应函数void CMFC_SEECOLORDlg::OnBnClickedButtonWrite(),也是百度了,文库里有下载、、

void CMFC_SEECOLORDlg::OnBnClickedButtonWrite()
{
	// TODO: Add your control notification handler code here
	// TODO: Add your control notification handler code here
	CDatabase database;
	CString sDriver = _T("MICROSOFT EXCEL DRIVER (*.XLS)"); // Excel安装驱动
	CString sExcelFile,sPath; 
	CString sSql;

	//获取主程序所在路径,存在sPath中
	GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
	sPath.ReleaseBuffer ();
	int nPos;
	nPos=sPath.ReverseFind ('\\');
	sPath=sPath.Left (nPos);
	sExcelFile = sPath + _T("\\Demo.xls");     // 要建立的Excel文件
	TRY
	{
		// 创建进行存取的字符串
		sSql.Format(_T("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"),sDriver, sExcelFile, sExcelFile);
		// 创建数据库 (既Excel表格文件)
		if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
		{
			// 创建表结构(序号、姓名、年龄)
			sSql = "CREATE TABLE Exceldemo (Num Number,Name TEXT,Age NUMBER)";//可以用中文表示序号,姓名,年龄等
			database.ExecuteSQL(sSql);
			// 插入数值
			sSql = "INSERT INTO Exceldemo (Num,Name,Age) VALUES (1,'小西',24)";
			database.ExecuteSQL(sSql);
			sSql = "INSERT INTO Exceldemo (Num,Name,Age) VALUES (2,'小东',22)";
			database.ExecuteSQL(sSql);
			sSql = "INSERT INTO Exceldemo (Num,Name,Age) VALUES (3,'小朱',25)";
			database.ExecuteSQL(sSql);
			sSql = "INSERT INTO Exceldemo (Num,Name,Age) VALUES (4,'小鸭',27)";
			database.ExecuteSQL(sSql);
		}     
		// 关闭数据库

		database.Close();
		AfxMessageBox(_T("Excel文件写入成功!"));
	}
	CATCH_ALL(e)
	{
		TRACE1("Excel驱动没有安装: %s",sDriver);
	}
	END_CATCH_ALL;


}




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值