微软的Excel格式有两种:.xls和.xlsx。Excel2003及之前的版本是.xls格式,从Excel2007开始支持.xlsx格式。只使用基本功能的话两种格式看起来并没有多大差别,但是两者文件格式确实截然不同的。

excel97-2003(xls格式)

XLS文件最为一个文件流(FileStream),是由多个子流(SubStream)构成的,下面这张图是将各个SubStream按顺序依次展现出来,这些SubStream都是有若干个整数倍Block(1 block = 512 bytes)组成。

SubStream

 

XLS Header

占1个block(512bytes)固定大小

WorkBook

最小占8个block(4096bytes)

Summary Information

占8个block(4096bytes)固定大小

Document Summary Information

占8个block(4096bytes)固定大小

XLS Header扩展区

只有.xls文件超过一定大小时,才会出现

BigBolck pointer

最小占1个(512bytes)

RootEntry

占1个block(512bytes)

其中所有单元格数据记录在WorkBook子流中,以下为WorkBook区的重要内容结构。

0x0809 WorkbookHeader,即BOF,长度范围1~20

offset

size

content

0

2

存放XLS文件的版本类型 BIFF8/BIFF8X 0x0600 BIFF7 0x0500

2

2

WorkBookGlobals,0x0005

0x0031 FONT,长度24bytes。0x041EFORMAT

0x00E0 XF ExtendFORMAT

0x0293 STYLE

0x0085 BOUNDSHEET,即Sheet指针区,N个Sheet则有N个0x0085,包含每个Sheet的名称、sheet数据内容在xls文件中的偏移量。

offset

size

content

0

2

数据段长度(Sheet指针区和名称区长度)

2

4

该Sheet的BOF的绝对位移量,相对于Workbook

6

 

Sheet名称区,长度为数据段长度-2

0x008C Country,语言和地区设置。

0x00FC SST内容(SharingStringTable用来存放字符串,目的是为了让各个sheet都能够共享该SST中字符串内容)(Excel表数据,所有Sheet数据均放于此)

offset

size

content

0

4

数据中所有字符串的数量

4

4

将要放在SST中字符串的数量

以下开始针对每个字符串进行循环处理

   

8

2

该字符串的长度,若为双字节字符也算做一个

10

1

字符串中若包含双字节字符(如中文),则为0x01,若为纯ASCII字符,则为0x00

11

n

存放字符串信息

0x00FF ExtendedSST内容 在读取XLS文件时显得不重要,但当创建XLS文件时却非常重要

offset

size

content

0

2

每一区块字符串的个数,其值>=8

以下开始针对每一区块字符串进行循环处理

   

2

4

每一区块第一个字符的绝对位置

6

2

每一区块第一个字符的相对位置

8

2

保留

0x0809 Sheet1内容

0x0809 Header,20bytes

0x020BIndex,16+4*N个字节

(注:注意标志后有两位Size位,要从Size位计起)

offset

size

content

0

4

保留

4

4

第一行的序号

8

4

最后一行的序号(OpenOffice上介绍是sheet结尾的第一个未使用行的序号,行数的基数按0开始)

10

4

指向DEFCOLWIDTH(0x0055)相对于Workbook Header的位置

14

4*N

指向DBCELL(0x00D7)相对于WorkbookHeader的位置,当存在多个DBCELL时,需要设置多个。N为该sheet的行数/32

0x0055 DEFCOLWIDTH,6bytes

0x0200 Dimensions,18byte,存放sheet1的行数和列数。

offset

size

content

0

2

段大小(下列数据段大小)

2

4

第一行的序号

6

4

最后一行的序号

10

2

第一列的序号

12

2

最后一列的序号

12

2

保留

RowBlock

0x0208 Row,20bytes,Sheet中有多少行就有对应多少个0x0208开头的行信息,如果sheet中有5行,那么RowBlock的大小就是20*5bytes

offset

size

content

0

2

行的序号

2

2

列的序号

CellBlock

设置sheet中每一个单元格的信息,顺序为针对每一行的每一列依次设置,如00,01,02……10,11,12……20,21,22……

0x00FD LABELSST,14bytes,针对字符串值已经在SST中保存,这里只保存其对应的序号。记录文字串(在共享资料表裡)的Cell,格式为:

2byte:第几行(由0编起)

2byte:第几列(由0编起)

2byte:XFrecord索引值

4byte:共享字串表的索引值

0x027E RK2,14bytes,针对RK值(指编过码的整型或浮点型值)

0x00BD MULRK,28bytes记录数字(多个连续列)的Cell,格式为:

2byte:第几行(由0编起)

2byte:起始列(由0编起)

?byte:RKCell资讯(每个6byte)

2byte:XFrecord索引值

4byte:RK数值(后述)

2byte:结束列(由0编起)

0x00D7 DBCELL,随着行数的变化而发生变化

offset

size

content

0

4

DBCELL的偏移量减去RowBlock中第一个Row的偏移量

4

2

CellBlock中首行的第一个Cell的偏移量减去RowBlock中第二个Row的偏移量

以下为循环处理部分,1<n<=Max_Row

   

6

2

CellBlock中第n行的第一个Cell的偏移量减去第n-1行的第一个Cell的偏移量

当XLS中的行数大于32时,系统将循环处理,对于每个32行内容单独生成RowBlock、CellBlock和DBCELL。

0x0809 Sheet2内容

0x0809 Sheet3内容(如果有Sheet2、Sheet3)

0x000A EOF,Workbook结束标示符

==========这是吐槽线===========

这格式确实已经落后了,实在是太复杂。。。如果可以,我不再想碰这。

excel2007(xlsx格式)

xlsx格式相比旧的xls格式的数据结构要简单的多,其使用xml格式进行存储。

如下的表格:

 

A

B

C

1

姓名

性别

年龄

2

张三

30

3

小明

16

4

小红

20

然后将xlsx文件后缀改为zip,用压缩软件打开,其内容存储在sheet1.xml文件里:

<sheetData>
   <row r="1" spans="1:3" x14ac:dyDescent="0.2">
       <c r="A1" t="s">
           <v>0</v>
       </c>
       <c r="B1" t="s">
           <v>2</v>
       </c>
       <c r="C1" t="s">
           <v>1</v>
       </c>
   </row>
   <row r="2" spans="1:3" x14ac:dyDescent="0.2">
       <c r="A2" t="s">
           <v>3</v>
       </c>
       <c r="B2" t="s">
           <v>6</v>
       </c>
       <c r="C2">
           <v>30</v>
       </c>
   </row>
   <row r="3" spans="1:3" x14ac:dyDescent="0.2">
       <c r="A3" t="s">
           <v>4</v>
       </c>
       <c r="B3" t="s">
           <v>6</v>
       </c>
       <c r="C3">
           <v>16</v>
       </c>
   </row>
   <row r="4" spans="1:3" x14ac:dyDescent="0.2">
       <c r="A4" t="s">
           <v>5</v>
       </c>
       <c r="B4" t="s">
           <v>7</v>
       </c>
       <c r="C4">
           <v>20</v>
       </c>
   </row>
</sheetData>

<c></c>标签就代表每个单元格,t="s"表示值为字符串,对应的字符串值可以在sharedStrings.xml里找到:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="9" uniqueCount="8">
   <si>
       <t>姓名</t>
   </si>
   <si>
       <t>年龄</t>
   </si>
   <si>
       <t>性别</t>
   </si>
   <si>
       <t>张三</t>
   </si>
   <si>
       <t>小明</t>
   </si>
   <si>
       <t>小红</t>
   </si>
   <si>
       <t>男</t>
   </si>
   <si>
       <t>女</t>
   </si>
</sst>

从两个xml内容对比可知,第二个xml是Excel的内容去重后的内容集合,第一个项目xml通过集合的index来关联第二个xml的内容

Excel 文件格式解析相关推荐

  1. python实战|python爬取58同城租房数据并以Excel文件格式保存到本地

    python实战|python爬取58同城租房数据并以Excel文件格式保存到本地 一.分析目标网站url 目标网站:https://cq.58.com/minsuduanzu/ 让我们看看网站长啥样 ...

  2. Java进度条(excel文件解析)的实现

    文件上传页面 <!doctype html> <html> <head> <meta charset="utf-8"> <ti ...

  3. Android init.rc文件格式解析

    /****************************************************************************** Android init.rc文件格式解 ...

  4. python pandas读取excel-Python使用Pandas读写Excel实例解析

    这篇文章主要介绍了Python使用Pandas读写Excel实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Pandas是python的一个 ...

  5. 【Android 逆向】Android 逆向方法 ( 静态逆向解析 | 函数调用分析 | 动态运行跟踪 | 运行日志分析 | 文件格式解析 | 敏感信息分析 | 网络信息监控 | 环境伪装模拟 )

    文章目录 一.Android 逆向方法 1.静态逆向解析 2.函数调用分析 3.动态运行跟踪 4.运行日志分析 5.文件格式解析 6.敏感信息分析 7.网络信息监控 8.软件动态调试 9.环境伪装模拟 ...

  6. struts导入Excel进行解析

    为什么80%的码农都做不了架构师?>>>    struts导入Excel进行POI解析,源码地址:http://download.csdn.net/detail/bq1073100 ...

  7. gcc 删除elf_ELF文件格式解析器 原理 + 代码

    本文为看雪论坛精华文章 看雪论坛作者ID:菜鸟m号 附件链接:[原创] ELF文件格式解析器 原理 + 代码 写在前面: 读<Linux二进制>,发现作者对 ELF文件格式部分并没有做详细 ...

  8. cfile清空文件内容_编译-链接-加载 :ELF文件格式解析

    摘要:对于C++的初学者,经常在程序的编译或者加载过程中遇到很多错误,类似undefined reference to ... 和 GLIBCXX_3.4.20 not found 等.这些错误都涉及 ...

  9. 打开Excel显示:新建EXCEL文件格式和扩展名不匹配(原因+解决办法)

    打开Excel显示:新建EXCEL文件格式和扩展名不匹配(原因+解决办法) 我最开始安装了Office2019,然后安装了WPS(版本:11.1),然后WPS默认开启了自动更新(关闭方法自行百度),把 ...

  10. jxls使用excel公司_使用jXLS将Excel文件解析为JavaBeans

    jxls使用excel公司 这篇文章展示了如何使用jXLS将Excel文件解析为JavaBeans列表. 这是我编写的通用实用程序方法: /** * Parses an excel file into ...

最新文章

  1. Linux--VI命令大全
  2. 关于页面有多个验证控件和多个按钮的问题
  3. xi mapping function-concat
  4. ubuntu安装java8
  5. 分析深圳电信的新型HTTP劫持方式
  6. 蓄水池抽样(Reservoir Sampling)
  7. 【java】java 随机数 Random ThreadLocalRandom SecureRandom
  8. 为什么不该唯经验论?!
  9. Linux格式化分区报错Could not start /dev/sda No such file or directory 解决办法
  10. sxssfworkbook 设置单元格大小_Offset属性和Resize属性相结合,完美实现选择区域大小的改变...
  11. java图片滑动_java图片滑动验证(登录验证)原理与实现方法详解
  12. vb.net 教程 3-1 窗体编程基础 2
  13. linux 版的 wps 缺少字体的解决办法
  14. java 取系统当前时间_java获取当前系统时间方法
  15. 美女时钟(shell)
  16. 小象学院python网课值得吗-小象学院的机器学习集训营课程怎么样?
  17. 搭建公众号微商城+小程序微商城 企业商城系统一条龙 拖拽可视化装修模板
  18. android 模拟自动点击,自动点击器(模拟点击)
  19. Android 使用ADB命令安装、卸载软件
  20. 打字 html,html - 在线打字测试(dazi.kukuw.com)

热门文章

  1. uniapp下微信小程序超过2MB大小限制的解决方法
  2. C语言中实现字符串的拼接
  3. 计算机图形学红绿蓝组合颜色,二、颜色_计算机图形学(部分章节二)_ppt_大学课件预览_高等教育资讯网...
  4. Tushare介绍和入门级实践(2)——使用tushare接口获取沪深300成分股的财报数据并输出到本地
  5. 2022年天猫618超级红包玩法入口
  6. web漏洞扫描器原理_每周一喂丨用于渗透测试的10种漏洞扫描工具
  7. 英雄联盟轮播图手动轮播
  8. 计算机学院运动会海报,《图文》运动会宣传海报资料
  9. android设备登录是什么手机_Android手机丢失或被盗?现在就告诉你如何找回它
  10. 《墨菲定律》读书笔记