作者/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

转载于:https://www.cnblogs.com/MaxWoods/archive/2007/04/17/717079.html

直接读取Excel文件数据相关推荐

  1. 利用pandas读取Excel文件数据

    说明 pandas能帮助我们在Python 代码中直接读取Excel 文件数据. 但只有pandas是不行的,会报错: ImportError: Missing optional dependency ...

  2. 读取EXCEL文件数据,再调用第三方接口,将第三方数据重新写入到EXCEL文件

    读取EXCEL文件数据,再调用第三方接口,将第三方数据重新写入到EXCEL文件 工作中涉及很多提供文档数据,少则几条,多则上万,少的可以自己编辑一个,静态final来自己定义,一旦数太多得话,就得使用 ...

  3. php读取excel文件数据

    PHP读取excel文件数据一般用phpexcel插件,但这个插件目前已经不再维护,改用phpspreadsheet,可以从github上clone. 该插件读取excel数据还是很方便的,代码如下: ...

  4. VC6.0读取Excel文件数据

    VC6.0读取Excel文件数据 文件存储在Excel文件中,因此第一步是能够在程序中方便地读取表格数据,这里用的是VC6.0 MFC.文章内容仅供参考,程序不完整. 完整的VC6.0相关程序,需要的 ...

  5. 读取excel文件数据,插入sqlite,在dataGridView读取显示

    读取excel文件数据,插入sqlite,在dataGridView读取显示 布局 将读取的文件excel 以及sqlite小型数据库位置(在项目文件下/bin/debug/-DB) 直接上代码 测试

  6. excel导入matlab NaN,Matlab GUI 读取excel文件数据时,出现NaN的问题

    Matlab GUI 读取excel文件数据时,经常会用到如下一段代码,本人有两处不甚明白,请前辈解惑. 源代码 [num,text,raw]=xlsread('123.xls'); for i=1: ...

  7. 读取Excel文件数据

    1.用APP直接读取Excel文件 这种方法原理是用APP打开EXCEL文件,操作单元格读取数据,快速比较慢,基本不采用这种方式. 2.用APP把Excel文件转成Txt文件,再读取Txt文件  过程 ...

  8. Python使用pandas读取Excel文件数据和预处理小案例

    假设有Excel文件data.xlsx,其中内容为 现在需要将这个Excel文件中的数据读入pandas,并且在后续的处理中不关心ID列,还需要把sex列的female替换为1,把sex列的male替 ...

  9. vue3+ts读取excel文件数据

     先下载xlsx依赖 npm i xlsx --save 在所需页面引入xlsx依赖 import * as xlsx from "xlsx";  必须这样写 写别的引入会报错!! ...

  10. Java读取Excel文件数据并将记录写入到新的文件中--POI技术实现

    1. apache poi包里有4个主要的类: Workbook----工作表,通过WorkbookFactory的create(FileInputStream fis)方法获取, Sheet---- ...

最新文章

  1. java8的jvm优化_基于JDK8 版本的SpringBoot 启动参数优化(建议收藏)
  2. 生产环境一次诡异的NPE问题,反转了4次
  3. python语言程序设计基础第二版答案-python语言程序设计基础(第二版)第五章答案随笔...
  4. linux服务器报Too many open files的解决方法
  5. C# — Windows服务安装后自动停止问题
  6. E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)
  7. 如何监视Java EE数据源
  8. javascript动态创建table
  9. 软件工程项目冲刺第二天
  10. Java连接程序数据源
  11. 优化Nginx的处理性能
  12. Exponentially Weighted Moving-Average
  13. 电子招投标系统解决方案
  14. 虚拟化识别共享USB加密狗|银行U盾等解决方案
  15. Milvus 在 AVX-512 与 AVX2 的性能对比
  16. 【USACO题库】3.4.4 Raucous Rockers“破锣摇滚”乐队
  17. 实例详解——编译器命令#pragma section作用于函数时作用域是否覆盖到其子函数...
  18. 阿冰自己弄网站,利于开发的工具
  19. **任务一 WEB学习 笔记**
  20. win2008 r2折腾php7.1记录

热门文章

  1. 数据挖掘面试题之梯度提升树
  2. JAVA 模拟瞬间高并发
  3. TestNg测试框架使用
  4. MSP430学习小结2-程序主体结构安排及低功耗-转载
  5. MongoDB学习笔记—Linux下搭建MongoDB环境
  6. 【好】Paxos以及分布式一致性的学习
  7. 5 张图带你搞懂容器网络的工作原理
  8. 震惊!Faker.js作者删库,理由竟然是 拒绝被“白嫖”~
  9. 面试了一个6年的Java,竟然什么都不会!
  10. 阿里妈妈大规模在线分层实验实践