直接读取Excel文件数据
下载源代码
前言
由于种种需要直接进行读取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文件数据相关推荐
- 利用pandas读取Excel文件数据
说明 pandas能帮助我们在Python 代码中直接读取Excel 文件数据. 但只有pandas是不行的,会报错: ImportError: Missing optional dependency ...
- 读取EXCEL文件数据,再调用第三方接口,将第三方数据重新写入到EXCEL文件
读取EXCEL文件数据,再调用第三方接口,将第三方数据重新写入到EXCEL文件 工作中涉及很多提供文档数据,少则几条,多则上万,少的可以自己编辑一个,静态final来自己定义,一旦数太多得话,就得使用 ...
- php读取excel文件数据
PHP读取excel文件数据一般用phpexcel插件,但这个插件目前已经不再维护,改用phpspreadsheet,可以从github上clone. 该插件读取excel数据还是很方便的,代码如下: ...
- VC6.0读取Excel文件数据
VC6.0读取Excel文件数据 文件存储在Excel文件中,因此第一步是能够在程序中方便地读取表格数据,这里用的是VC6.0 MFC.文章内容仅供参考,程序不完整. 完整的VC6.0相关程序,需要的 ...
- 读取excel文件数据,插入sqlite,在dataGridView读取显示
读取excel文件数据,插入sqlite,在dataGridView读取显示 布局 将读取的文件excel 以及sqlite小型数据库位置(在项目文件下/bin/debug/-DB) 直接上代码 测试
- excel导入matlab NaN,Matlab GUI 读取excel文件数据时,出现NaN的问题
Matlab GUI 读取excel文件数据时,经常会用到如下一段代码,本人有两处不甚明白,请前辈解惑. 源代码 [num,text,raw]=xlsread('123.xls'); for i=1: ...
- 读取Excel文件数据
1.用APP直接读取Excel文件 这种方法原理是用APP打开EXCEL文件,操作单元格读取数据,快速比较慢,基本不采用这种方式. 2.用APP把Excel文件转成Txt文件,再读取Txt文件 过程 ...
- Python使用pandas读取Excel文件数据和预处理小案例
假设有Excel文件data.xlsx,其中内容为 现在需要将这个Excel文件中的数据读入pandas,并且在后续的处理中不关心ID列,还需要把sex列的female替换为1,把sex列的male替 ...
- vue3+ts读取excel文件数据
先下载xlsx依赖 npm i xlsx --save 在所需页面引入xlsx依赖 import * as xlsx from "xlsx"; 必须这样写 写别的引入会报错!! ...
- Java读取Excel文件数据并将记录写入到新的文件中--POI技术实现
1. apache poi包里有4个主要的类: Workbook----工作表,通过WorkbookFactory的create(FileInputStream fis)方法获取, Sheet---- ...
最新文章
- java8的jvm优化_基于JDK8 版本的SpringBoot 启动参数优化(建议收藏)
- 生产环境一次诡异的NPE问题,反转了4次
- python语言程序设计基础第二版答案-python语言程序设计基础(第二版)第五章答案随笔...
- linux服务器报Too many open files的解决方法
- C# — Windows服务安装后自动停止问题
- E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)
- 如何监视Java EE数据源
- javascript动态创建table
- 软件工程项目冲刺第二天
- Java连接程序数据源
- 优化Nginx的处理性能
- Exponentially Weighted Moving-Average
- 电子招投标系统解决方案
- 虚拟化识别共享USB加密狗|银行U盾等解决方案
- Milvus 在 AVX-512 与 AVX2 的性能对比
- 【USACO题库】3.4.4 Raucous Rockers“破锣摇滚”乐队
- 实例详解——编译器命令#pragma section作用于函数时作用域是否覆盖到其子函数...
- 阿冰自己弄网站,利于开发的工具
- **任务一 WEB学习 笔记**
- win2008 r2折腾php7.1记录