Excel文件结构详解
1. Excel文件格式概述
了解Excel文件的内部结构对于高级使用和编程处理非常重要。Excel使用多种文件格式,每种格式都有其特定的用途和特点。
主要文件格式
.xlsx - Excel工作簿(默认格式)
.xlsm - 启用宏的Excel工作簿
.xls - Excel 97-2003工作簿(旧格式)
.xlsb - Excel二进制工作簿
.csv - 逗号分隔值文件
.xltx - Excel模板
.xltm - 启用宏的Excel模板
.xlsm - 启用宏的Excel工作簿
.xls - Excel 97-2003工作簿(旧格式)
.xlsb - Excel二进制工作簿
.csv - 逗号分隔值文件
.xltx - Excel模板
.xltm - 启用宏的Excel模板
.xlsx文件格式
现代Excel使用.xlsx格式,这是一种基于Open XML标准的压缩格式。了解其内部结构有助于编程处理和文件恢复。
重要提示:.xlsx文件本质上是一个ZIP压缩包,解压后可以看到其内部XML结构。
2. .xlsx文件内部结构
当你解压一个.xlsx文件时,会看到以下目录结构:
workbook.xlsx/
├── [Content_Types].xml # 内容类型定义
├── _rels/ # 关系目录
│ └── .rels # 主关系文件
├── docProps/ # 文档属性
│ ├── app.xml # 应用程序属性
│ └── core.xml # 核心属性(作者、创建时间等)
├── xl/ # 工作簿主要内容
│ ├── workbook.xml # 工作簿定义
│ ├── _rels/ # 工作簿关系
│ ├── worksheets/ # 工作表目录
│ │ ├── sheet1.xml # 第一个工作表
│ │ ├── sheet2.xml # 第二个工作表
│ │ └── ...
│ ├── styles.xml # 样式定义
│ ├── sharedStrings.xml # 共享字符串
│ ├── theme/ # 主题
│ │ └── theme1.xml
│ └── media/ # 媒体文件(图片等)
├── [Content_Types].xml # 内容类型定义
├── _rels/ # 关系目录
│ └── .rels # 主关系文件
├── docProps/ # 文档属性
│ ├── app.xml # 应用程序属性
│ └── core.xml # 核心属性(作者、创建时间等)
├── xl/ # 工作簿主要内容
│ ├── workbook.xml # 工作簿定义
│ ├── _rels/ # 工作簿关系
│ ├── worksheets/ # 工作表目录
│ │ ├── sheet1.xml # 第一个工作表
│ │ ├── sheet2.xml # 第二个工作表
│ │ └── ...
│ ├── styles.xml # 样式定义
│ ├── sharedStrings.xml # 共享字符串
│ ├── theme/ # 主题
│ │ └── theme1.xml
│ └── media/ # 媒体文件(图片等)
关键文件说明
- workbook.xml:定义工作簿的结构,包含所有工作表的引用
- sheet*.xml:包含每个工作表的实际数据、公式和格式
- styles.xml:定义单元格样式、字体、边框、填充等
- sharedStrings.xml:存储所有文本字符串,节省空间
- [Content_Types].xml:定义文件中各部分的MIME类型
3. 工作簿结构(workbook.xml)
workbook.xml是Excel文件的核心,定义了整个工作簿的结构。
主要组成部分
<workbook>
<fileVersion .../>
<workbookPr .../>
<bookViews>
<workbookView .../>
</bookViews>
<sheets>
<sheet name="Sheet1" sheetId="1" r:id="rId1"/>
<sheet name="Sheet2" sheetId="2" r:id="rId2"/>
</sheets>
<definedNames>
<definedName name="MyRange">Sheet1!$A$1:$C$10</definedName>
</definedNames>
<calcPr .../>
</workbook>
<fileVersion .../>
<workbookPr .../>
<bookViews>
<workbookView .../>
</bookViews>
<sheets>
<sheet name="Sheet1" sheetId="1" r:id="rId1"/>
<sheet name="Sheet2" sheetId="2" r:id="rId2"/>
</sheets>
<definedNames>
<definedName name="MyRange">Sheet1!$A$1:$C$10</definedName>
</definedNames>
<calcPr .../>
</workbook>
工作表引用
每个工作表都有一个唯一的ID和关系ID,通过这些ID可以找到对应的工作表XML文件。
4. 工作表结构(sheet.xml)
每个工作表都有独立的XML文件,包含该工作表的所有数据、公式和格式信息。
基本结构
<worksheet>
<dimension ref="A1:D10"/>
<sheets>
<sheetView .../>
</sheets>
<cols>
<col min="1" max="1" width="15"/>
</cols>
<sheetData>
<row r="1">
<c r="A1">
<v>123</v>
</c>
<c r="B1" t="s">
<v>0</v>
</c>
</row>
</sheetData>
<mergeCells>
<mergeCell ref="A1:B1"/>
</mergeCells>
<conditionalFormatting>
<cfRule .../>
</conditionalFormatting>
</worksheet>
<dimension ref="A1:D10"/>
<sheets>
<sheetView .../>
</sheets>
<cols>
<col min="1" max="1" width="15"/>
</cols>
<sheetData>
<row r="1">
<c r="A1">
<v>123</v>
</c>
<c r="B1" t="s">
<v>0</v>
</c>
</row>
</sheetData>
<mergeCells>
<mergeCell ref="A1:B1"/>
</mergeCells>
<conditionalFormatting>
<cfRule .../>
</conditionalFormatting>
</worksheet>
单元格数据类型
单元格的type属性(t)定义了数据的类型:
无属性或t="n" - 数字
t="s" - 字符串(引用sharedStrings.xml)
t="str" - 内联字符串
t="b" - 布尔值
t="e" - 错误值
t="d" - 日期
t="s" - 字符串(引用sharedStrings.xml)
t="str" - 内联字符串
t="b" - 布尔值
t="e" - 错误值
t="d" - 日期
5. 共享字符串表(sharedStrings.xml)
为了优化文件大小,Excel将所有文本字符串存储在一个共享字符串表中。
结构示例
<sst xmlns="..." count="10" uniqueCount="5">
<si>
<t>产品名称</t>
</si>
<si>
<t>数量</t>
</si>
<si>
<t>单价</t>
</si>
<si>
<t>合计</t>
</si>
<si>
<t>总计</t>
</si>
</sst>
<si>
<t>产品名称</t>
</si>
<si>
<t>数量</t>
</si>
<si>
<t>单价</t>
</si>
<si>
<t>合计</t>
</si>
<si>
<t>总计</t>
</si>
</sst>
优化技巧:当多个单元格包含相同的文本时,使用共享字符串表可以显著减少文件大小。
6. 样式定义(styles.xml)
styles.xml定义了工作簿中使用的所有样式,包括字体、填充、边框、数字格式等。
样式结构
<styleSheet xmlns="...">
<numFmts count="2">
<numFmt numFmtId="164" formatCode="#,##0.00"/>
</numFmts>
<fonts count="3">
<font>
<sz val="11"/>
<name val="Calibri"/>
<b/>
<color rgb="FF0000"/>
</font>
</fonts>
<fills count="2">
<fill>
<patternFill patternType="solid">
<fgColor rgb="4CAF50"/>
</patternFill>
</fill>
</fills>
<borders count="1">
<border>
<left style="thin">
<color rgb="000000"/>
</left>
</border>
</borders>
<cellXfs count="5">
<xf numFmtId="0" fontId="0" fillId="0" borderId="0"/>
<xf numFmtId="164" fontId="1" fillId="1" borderId="1"/>
</cellXfs>
<cellStyles count="1">
<cellStyle xfId="0" name="Normal"/>
</cellStyles>
</styleSheet>
<numFmts count="2">
<numFmt numFmtId="164" formatCode="#,##0.00"/>
</numFmts>
<fonts count="3">
<font>
<sz val="11"/>
<name val="Calibri"/>
<b/>
<color rgb="FF0000"/>
</font>
</fonts>
<fills count="2">
<fill>
<patternFill patternType="solid">
<fgColor rgb="4CAF50"/>
</patternFill>
</fill>
</fills>
<borders count="1">
<border>
<left style="thin">
<color rgb="000000"/>
</left>
</border>
</borders>
<cellXfs count="5">
<xf numFmtId="0" fontId="0" fillId="0" borderId="0"/>
<xf numFmtId="164" fontId="1" fillId="1" borderId="1"/>
</cellXfs>
<cellStyles count="1">
<cellStyle xfId="0" name="Normal"/>
</cellStyles>
</styleSheet>
7. 公式存储
公式存储在工作表XML文件的<c>元素中,使用<f>标签表示。
公式示例
<c r="D2">
<f>B2*C2</f>
<v>5000</v>
</c>
<c r="D3">
<f t="shared" ref="D2:D10" si="0">B3*C3</f>
<!-- 共享公式 -->
</c>
<f>B2*C2</f>
<v>5000</v>
</c>
<c r="D3">
<f t="shared" ref="D2:D10" si="0">B3*C3</f>
<!-- 共享公式 -->
</c>
公式类型
- 普通公式:t属性不存在或为空
- 共享公式:t="shared",用于优化相似公式的存储
- 数组公式:t="array"
- 数据表公式:t="dataTable"
8. 关系文件(_rels)
关系文件定义了文件内部各部分之间的关联关系,是Open XML格式的重要组成部分。
主关系文件
<Relationships xmlns="...">
<Relationship Id="rId1"
Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
Target="xl/workbook.xml"/>
<Relationship Id="rId2"
Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties"
Target="docProps/core.xml"/>
<Relationship Id="rId3"
Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties"
Target="docProps/app.xml"/>
</Relationships>
<Relationship Id="rId1"
Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
Target="xl/workbook.xml"/>
<Relationship Id="rId2"
Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties"
Target="docProps/core.xml"/>
<Relationship Id="rId3"
Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties"
Target="docProps/app.xml"/>
</Relationships>
9. 媒体文件
Excel文件中的图片、图表等媒体文件存储在xl/media目录中。
媒体类型
xl/media/
├── image1.png
├── image2.jpg
├── chart1.xml
└── ...
├── image1.png
├── image2.jpg
├── chart1.xml
└── ...
10. .xlsm与.xlsx的区别
.xlsm文件是启用宏的工作簿,与.xlsx的主要区别在于:
- 包含宏代码:可以存储VBA代码
- 额外的文件:包含vbaProject.bin文件
- 安全警告:打开时会显示安全警告
.xlsm文件结构
workbook.xlsm/
├── [Content_Types].xml
├── _rels/
├── docProps/
├── xl/
│ ├── workbook.xml
│ ├── worksheets/
│ ├── styles.xml
│ ├── sharedStrings.xml
│ ├── vbaProject.bin
│ └── _rels/
│ └── workbook.xml.rels
├── [Content_Types].xml
├── _rels/
├── docProps/
├── xl/
│ ├── workbook.xml
│ ├── worksheets/
│ ├── styles.xml
│ ├── sharedStrings.xml
│ ├── vbaProject.bin
│ └── _rels/
│ └── workbook.xml.rels
11. .xls旧格式
.xls是Excel 97-2003使用的二进制格式,称为BIFF(Binary Interchange File Format)。
特点
- 二进制格式,不能直接查看内容
- 最大行数限制为65536行
- 最大列数限制为256列
- 不支持现代Excel功能
- 兼容性更好,但功能受限
注意:.xls格式已经过时,建议使用.xlsx格式,除非有特殊的兼容性需求。
12. .xlsb二进制格式
.xlsb是Excel二进制工作簿格式,结合了二进制和XML的优点。
特点
- 文件体积更小,加载速度更快
- 支持现代Excel功能
- 不适合版本控制和内容查看
- 适合大型数据集
13. CSV格式
CSV(Comma-Separated Values)是一种简单的文本格式,常用于数据交换。
CSV示例
产品名称,数量,单价,金额
产品A,100,50,5000
产品B,200,80,16000
产品C,150,60,9000
产品A,100,50,5000
产品B,200,80,16000
产品C,150,60,9000
特点
- 纯文本格式,易于处理
- 不包含格式和公式
- 兼容性极好
- 适合数据导入导出
14. Excel文件操作最佳实践
文件管理
- 定期备份重要文件
- 使用有意义的文件名
- 保持文件结构简洁
- 避免过度使用合并单元格
性能优化
- 减少不必要的格式设置
- 避免使用过多的条件格式
- 清理未使用的样式和名称
- 对于大数据集,考虑使用Excel表格
版本控制
- 使用.xlsx格式便于版本控制
- 避免使用.xlsm进行版本控制(二进制内容难以比较)
- 考虑使用CSV进行数据版本控制
15. 本章小结
本章详细介绍了Excel文件的内部结构,你现在应该了解:
- Excel的主要文件格式及其用途
- .xlsx文件的内部XML结构
- 工作簿、工作表、单元格的层次关系
- 数据、样式、公式的存储方式
- 共享字符串表的作用
- 不同格式的优缺点
- 文件管理的最佳实践
学习建议:了解Excel文件结构对于编程处理Excel文件非常重要。如果你打算使用Python或GoLang处理Excel,建议深入理解这些概念。
在下一章中,我们将开始学习Excel的基本操作,包括数据输入、编辑和管理等内容。