Excel 对于很多人来说应当是日常工作中接触最多的一类办公软件了,然而我们对其却没有真正深入了解过。最近闲来无事,简单学习了下。Excel 文件本质上是一个包含多个 xml 文件的压缩包。我们可以通过将 Excel 文件的扩展名更改为 .zip 或 .rar ,解压该文件来查看其结构。下面便以下面截图的 Excel 文件简单说下其对应的结构文件都是做什么的。

首先我将制作好的“Excel~文件结构初窥.xlsx”文件拓展名改为 .zip 然后对其解压,得到下面的文件目录。

  • _rels 文件夹:内含一个名为 .rels 的文件,包含关于该工作簿程序包的各文件关系。
  • docProps 文件夹:内含一个 app.xml 与一个 core.xml 分别定义工作簿的各元数据。
  • xl 文件夹:内含多个文件夹及文件,主要为描述该工作簿下各工作表的文件。
  • [Content_Types].xml 文件:列出了该工作簿下包含的各个部件信息。

[Content_Types].xml 文件

首先说下 [Content_Types].xml 文件吧,了解完它之后应该可以对我们之后要展开的东西的脉络更清晰些。下面是我制作好的工作簿的 [Content_Types].xml 内的代码:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
    <Default Extension="bin" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings"/>
    <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
    <Default Extension="xml" ContentType="application/xml"/>
    <Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/>
    <Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>
    <Override PartName="/xl/worksheets/sheet2.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>
    <Override PartName="/xl/worksheets/sheet3.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>
    <Override PartName="/xl/theme/theme1.xml" ContentType="application/vnd.openxmlformats-officedocument.theme+xml"/>
    <Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/>
    <Override PartName="/xl/sharedStrings.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"/>
    <Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/>
    <Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/>
</Types>
  • Type : 包含枚举 VSIX 包中的文件类型的子元素
  • xmlns :(必选)使用此 [Content_Types].xml 文件的架构的位置
  • Default :ZIP压缩包每种文件类型的引用, Extension 值为 VSIX 包中的文件扩展名
  • Override :不同类型文档内容的 XML 部件的引用, PartName 值为链接外部文件的位置
  • ContentType :说明与文件扩展名相关联的内容类型

_rels 文件夹

_rels 文件夹下只有一个 .rels 文件,用于说明该程序包中的各文件关系。其代码如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/>
    <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
    <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>
</Relationships>
  • Id :唯一值,可以是任意字符串
  • Type :包含各文件的关系类型
  • Target :包含各文件的位置

docProps 文件夹

docProps 文件夹下包含两个文件:app.xml 与 core.xml 。分开来说明一下。

app.xml

app.xml 文件下定义了该文档的一些基本属性,包括但不限于“加密情况”、“工作簿名称”、“公司名称”、“应用程序版本”等,就本例而言,代码中我已经做了相应的注释,大家看下即可。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
<!-- 应用程序名称 -->
    <Application>Microsoft Excel</Application>
    <!-- 是否加密 -->
    <DocSecurity>0</DocSecurity>
    <ScaleCrop>false</ScaleCrop>
    <!-- Excel头部标题信息 -->
    <HeadingPairs>
	<vt:vector size="2" baseType="variant">
            <vt:variant>
                <vt:lpstr>工作表</vt:lpstr>
            </vt:variant>
            <vt:variant>
	        <vt:i4>3</vt:i4>
	    </vt:variant>
	</vt:vector>
    </HeadingPairs>
    <!-- Excel底部工作表信息 -->
    <TitlesOfParts>
	<vt:vector size="3" baseType="lpstr">
            <vt:lpstr>Sheet1</vt:lpstr>
            <vt:lpstr>Sheet2</vt:lpstr>
            <vt:lpstr>Sheet3</vt:lpstr>
        </vt:vector>
    </TitlesOfParts>
    <!-- 公司名称 -->
    <Company></Company>
    <!-- 最新链接 -->
    <LinksUpToDate>false</LinksUpToDate>
    <!-- 是否共享 -->
    <SharedDoc>false</SharedDoc>
    <!-- 超链接更改 -->
    <HyperlinksChanged>false</HyperlinksChanged>
    <!-- 应用程序版本 -->
    <AppVersion>16.0300</AppVersion>
</Properties>

core.xml

core.xml 文件中定义的信息与 app.xml 类似,也是一些基础属性信息,具体代码如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <!-- 作者 -->
    <dc:creator>QuietGuoGuo</dc:creator>
    <!-- 最后一次保存者 -->
    <cp:lastModifiedBy>QuietGuoGuo</cp:lastModifiedBy>
    <!-- 创建内容的时间 -->
    <dcterms:created xsi:type="dcterms:W3CDTF">2019-01-14T16:19:53Z</dcterms:created>
    <!-- 最后一次保存的日期 -->
    <dcterms:modified xsi:type="dcterms:W3CDTF">2019-01-17T13:34:41Z</dcterms:modified>
</cp:coreProperties>

如果非要更直观地说的话,该文件定义的信息你可以通过右键“属性/详细信息”查看到,如下图所示:

xl 文件夹

上面提到的文件基本上是描述整个工作簿的,xl 文件夹里面的内容主要是描述工作簿下各个工作表的。其文件结构与程序包的有点类似,本例中该文件夹下的文件如下图所示:

先说下外面这几个文件:

  • sharedStrings.xml :记录表格中输入的各数据信息
  • styles.xml :Excel 工作表中设置的各样式信息
  • workbook.xml :定义工作簿中的各个部件信息

_rels 文件夹

与前面根目录下的 _rels 文件夹类似,只不过该文件夹下文件名为 workbook.xml.rels ,用于说明该工作簿下各文件的关系。其代码如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet3.xml"/>
    <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet2.xml"/>
    <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>
    <Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Target="sharedStrings.xml"/>
    <Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>
    <Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/>
</Relationships>

printerSettings 文件夹

printerSettings 文件夹下有一个 printerSettings1.bin 文件,主要是描述应用程序打印时如何打印文档的信息。

theme 文件夹

theme 文件夹下包含工作簿主题的数据的XML文件。比如这里的 theme1.xml 。代码不贴了,没多大意义。

worksheets 文件夹


worksheets 文件夹下主要是各个工作表的一些信息,sheet1.xml、sheet2.xml、sheet3.xml 里都是一些描述表的代码,这里就不细说了。

同样该文件夹下又有一个 _rels 文件夹,其中有个 sheet1.xml.rels 文件,用于说明该工作表下各文件的关系。代码如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings" Target="../printerSettings/printerSettings1.bin"/>
    <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://blog.quietguoguo.com/" TargetMode="External"/>	
</Relationships>

当然,这里我只是建立了一个简单的工作簿作为例子,更丰富的工作簿可能包含一些我上面没提到的文件及文件夹,正常。

参考文档:

https://docs.microsoft.com/zh-cn/dotnet/api/documentformat.openxml?view=openxml-2.8.1

https://docs.microsoft.com/zh-cn/dotnet/api/documentformat.openxml.extendedproperties?view=openxml-2.8.1

https://docs.microsoft.com/zh-cn/visualstudio/extensibility/the-structure-of-the-content-types-dot-xml-file?view=vs-2017

写到最后有点烦躁,如果有错误信息,希望看到的小伙伴指出。