中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 文件系统
直接读取Excel文件数据
作者:未知 时间:2005-07-20 14:21 出处:VC知识库 责编:chinaitpower
              摘要:直接读取Excel文件数据

直接读取Excel文件数据


作者/weigf

下载源代码

前言
  由于种种需要直接进行读取Excel文件数据,然而在网上Search多次也没有找到好的方法,
一般就通过ODBC或OLE方式进行读取,但这两种方法都具有局限性...(我相信大家都很清楚)。
怎么办呢?没办法了,只好选择最艰难的路了--分析Excel文件格式。
介绍
  MS Excel是众所周知的电子表格处理软件。Excel文件格式是特定的BIFF(Binary Interchange File Format),BIFF里存储了很多记录,第条记录包括记录头和记录体。记录头是4byte,前两位指定记录类型的代码(opcode),后两位指定记录长度;记录体是存储该记录的实际数据。
比如:

BOF record
           |  Record Header    |    Record Body    |
Byte       |  0    1    2    3 |  0    1    2    3 |
           -----------------------------------------
Contents   | 09 | 00 | 04 | 00 | 02 | 00 | 10 | 00 |
           -----------------------------------------
           | opcode  | length  | version |  file   |
           |         |         |  number |  type   |
记录头:
	opcode: 09h is BOF;
	length: 04h record body is 4 bytes long;
记录体:
	version number:02h is version number (2 for the initial version of Excel)
	file type:10h is a worksheet file;
具体可参考MS Excel File Format。

描述
以下是对本文程序简单描述。

      第一步:打开文件
	CFile f;
	CFileException e;

	// 打开文件
	if (!f.Open("D:\\Book1.xls", CFile::modeRead, &e))
	{
		TCHAR szError[1024];
		e.GetErrorMessage(szError, 1024);
		AfxMessageBox(szError);
		return;
	}
	第二步:读取版本号
	// 读取版本
	while (dwPos < dwLen)
	{
		nRead = f.Read((void*)&RecNo, 2);
		if (RecNo == XL_BOF)	
		{
			WORD Ver, Type;
			f.Read((void*)&RecLen, 2);
			f.Read((void*)&Ver, 2);
			f.Read((void*)&Type, 2);
			f.Seek(RecLen, CFile::current);

			int ver = 0;
			switch (Ver)
			{
			case BIFF7:
				ver = 7;
				break;
			case BIFF8:
				ver = 8;
				AfxMessageBox("Biff8");
				break;
			}

			int type = 0;
			switch (Type)
			{
			case WORKBOOK:
				type = 5;
				AfxMessageBox("Workbook");
				break;
			case WORKSHEET:
				type = 16;
				AfxMessageBox("Worksheet");
				break;
			case CHART:
				type = 32;
				AfxMessageBox("Chart");
				break;
			}

			break;
		}
		dwPos = f.GetPosition();
	}	
	第三步:读其它数据
	f.SeekToBegin();
	dwPos = f.GetPosition();
	// 读表格数据
	while (dwPos < dwLen)
	{
		nRead = f.Read((void*)&RecNo, 2);
		switch (RecNo)
		{
		case XL_BOF:
			{
				f.Read((void*)&RecLen, 2);
				AfxMessageBox("Bof");
			}
			break;
		case XL_BOUNDSHEET:
			{
				DWORD	temp;
				BYTE	visi;
				BYTE	type;
				TCHAR	name;
				
				f.Read((void*)&RecLen, 2);
				f.Read((void*)&temp, 4);
				f.Read((void*)&visi, 1);
				f.Read((void*)&type, 1);
				f.Read((void*)&StrLen, 2);
				f.Read((void*)&name, StrLen);
				
				char buf[128];
				memset(buf, 0x0, 128);
				strncpy(buf, &name, StrLen);
				
				AfxMessageBox(buf);
			}
			break;
		case XL_DIMENSION:
			f.Read((void*)&RecLen, 2);
			f.Seek(RecLen, CFile::current);
			AfxMessageBox("Dimension");
			break;
		case 0xE2:	// INTERFACED
			f.Read((void*)&RecLen, 2);
			AfxMessageBox("e2");
			break;
		case XL_SST:
			f.Read((void*)&RecLen, 2);
			f.Seek(RecLen, CFile::current);
			AfxMessageBox("SST");
			break;
		case XL_NUMBER:
			f.Read((void*)&RecLen, 2);
			AfxMessageBox("Number");
			break;
		case XL_STRING:
			f.Read((void*)&RecLen, 2);
			AfxMessageBox("String");
			break;
		case XL_RK:
			f.Read((void*)&RecLen, 2);
			AfxMessageBox("RK");
			break;
		case XL_LABEL:
			{
				f.Read((void*)&RecLen, 2);
				AfxMessageBox("Label");
			}
			break;
		case 0xD6:
			f.Read((void*)&RecLen, 2);
			AfxMessageBox("RString");
			break;
		case XL_EOF:
			dwPos = dwLen;
			AfxMessageBox("Eof");
			break;
		default:
			nRead = f.Read((void*)&RecLen, 2);
			if (nRead == 0)
				dwPos = dwLen;
			break;
		}
	}
	第四步:关闭文件
	f.Close();   
结束
本方讲述的是独立于MS Office系统,分析Excel文件格式并读取其数据。上述程序只读取最基本的信息。若需应用还需更完整的分析(我也在进行中...),当然读取Excel文件方法有多种,在这里只讲述了我使用的方法,
希望与各们朋友多交流!

参考文选
1. Microsoft Excel File Format
2. MSDN Library

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有