直接读取Excel文件数据
2006-10-27 14:31
507 查看
下载源代码
前言
由于种种需要直接进行读取Excel文件数据,然而在网上Search多次也没有找到好的方法,
一般就通过ODBC或OLE方式进行读取,但这两种方法都具有局限性...(我相信大家都很清楚)。
怎么办呢?没办法了,只好选择最艰难的路了--分析Excel文件格式。
介绍
MS Excel是众所周知的电子表格处理软件。Excel文件格式是特定的BIFF(Binary Interchange File Format),BIFF里存储了很多记录,第条记录包括记录头和记录体。记录头是4byte,前两位指定记录类型的代码(opcode),后两位指定记录长度;记录体是存储该记录的实际数据。
比如:
描述
以下是对本文程序简单描述。
前言
由于种种需要直接进行读取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();
相关文章推荐
- 直接读取Excel文件数据
- 直接读取Excel文件数据
- 用C#编程从数据库中读取图片数据导进Excel文件的方法(如何从数据库中读取保存的文件,直接打开,中间不保存到本地)
- 用C#编程从数据库中读取图片数据导进Excel文件的方法(如何从数据库中读取保存的文件,直接打开,中间不保存到本地)
- 直接读取Excel文件数据
- 直接读取Excel文件数据
- Unity3D -- 从excel文件中读取数据
- ASP.NET中上传并读取Excel文件数据
- DELPHI中使用ADO直接访问Excel数据文件
- C# 读取EXCEL文件出现数据丢失问题,数据不完整
- c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件
- 在DELPHI中使用ADO直接访问Excel数据文件(收藏)
- 将后台数据读取到前台的EXCEL文件中去,用javascript实现.(发一个原创)
- asp.net中打开Excel上传文件,读取数据的方法
- 解析特定Excel文件并进行数据读取和保存
- C#读取Excel文件数据
- Apache POI -- 读取Excel文件数据导入到数据库
- 【JAVA】apache poi excel 文件读取,各种数据类型,不规则excel格式都可以读取
- Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据
- robotFramework 读取Excel文件数据