Simon 's Blog
» 做笔记做笔记
Toggle navigation
Simon 's Blog
HOME
总裁介绍
coper
zongcai
what
ARCH
TAGS
navigation
!!! XLSX内容概述
? SpreadsheetML ?
2021-09-13 10:35:37
56
0
0
simon88
? SpreadsheetML ?
# 电子表格内容概述 SpreadsheetML 文档是一个包含许多不同部分(主要是 XML 文件)的包。  但是,大部分实际内容都可以在一个或多个工作表部分(每个工作表一个)和一个 sharedStrings 部分中找到。对于 Microsoft Excel,内容位于 xl 文件夹中,工作表位于工作表子文件夹中。  工作簿部分不包含实际内容,仅包含电子表格的一些属性,并引用包含数据的单独工作表部分。 ``` <workbook . . .> . . . <workbookPr . . ./> <sheets> <sheet name="sheet1" r:id="rId1"/> <sheet name="sheet2" r:id="rId2"/> <sheet name="sheet3" r:id="rId3"/> </sheets> . . . </workbook> ``` 工作表可以是网格、图表或对话表。 ### 网格 单元格网格(或“单元格表”)是最常见的类型或工作表。单元格可以包含文本、布尔值、数字、日期和公式。从一开始就了解大多数文本值并不存储在工作表部件中是很重要的。为了尽量减少值的重复,作为字符串的单元格值单独存储在 shareStrings 部分中。(但是,这种概括有一个例外。单元格可以是*inlineStr*类型,在这种情况下存储字符串在单元格本身的 `is`元素中。)所有其他单元格值——布尔值、数字、日期和公式(以及公式的值)都存储在单元格中。 工作表的某些属性位于根`<worksheet>`元素的开头。网格列的数量和大小在`<cols>`中定义。然后工作表的核心数据跟随在`<sheetData>`元素中。工作表数据分为行 ( `<row>` ),每行中有单元格 ( `<c>` )。行被编号或索引,从 1 开始,带有`r`属性(例如,`行 r="1"`)。行中的每个单元格也有一个引用属性,它将行号与列结合起来以形成引用属性(例如,`<cr="D3">`)。如果行中的单元格没有内容,则行定义中将省略该单元格。 ``` <worksheet . . .> . . . <cols> <col min="1" max="1" width="26.140625" customWidth="1"/> . . . </cols> <sheetData> <row r="1"> <c r="A1" s="1" t="s"> <v>0</v> . . . </c> </row> . . . </sheetData> . . . <mergeCells count="1"> <mergeCell ref="B12:J16"/> </mergeCells> <pageMargins . . ./> <pageSetup . . ./> <tableParts ccount="1"> <tableParts count="1"/> </tablePart r:id="rId2"/> </worksheet> ``` 单元格的构成对于理解电子表格内容的整体架构很重要。每个单元格使用`t`属性指定其类型。可能的值包括: - *b*代表布尔值 - *d*日期 - *e*错误 - *inlineStr*用于内联字符串(即不存储在共享字符串部分,而是直接存储在单元格中) - *n*为数字 - *s*用于共享字符串(因此存储在共享字符串部分而不是单元格中) - *str*表示公式(表示公式的字符串) 当单元格是数字时,该值将作为`<c>`(单元格元素)的子元素存储在`<v>`元素中 。 ``` <cr="B2" s="5" t="n"> <v>400</v> </c> ``` 日期是相同的,但日期以 ISO 8601 格式存储为值。对于内联字符串,该值位于 `<is>`元素内。但当然实际文本进一步嵌套在`t 中,`因为文本可以被格式化。 ``` <c r="C4" s="2" t="inlineStr"> <is> <t>my string</t> </is> </c> ``` 对于公式,公式本身作为`<c>`的子元素存储在`f`元素中。遵循公式的是`<v>`元素内的实际计算值。 ``` <c r="B9" s="3" t="str"> <f>SUM(B2:B8)</f> <v>2105</v> </c> ``` 当单元格的数据类型为*s* for shared string时,则将该字符串存储在shared strings部分。但是,单元格仍然包含`<v>`元素中的值,该值是共享字符串部分中存储字符串的索引(从零开始)。因此,例如,在下面的示例中,实际字符串是共享字符串部分中`<si>`元素的第 9 次出现。 ``` <cr="C1" s="4" t="s"> <v>8</v> </c> ``` 共享字符串部分可能如下所示: ``` <sst xmls="http://schemas.openmlformats.org/spreadsheetml/2006/main" count="19" uniqueCount="13"> <si><t>Expenses</t></si> <si><t>Amount</t></si> <si><t>Food</t></si> <si><t>Totals</t></si> <si><t>Entertainment</t></si> <si><t>Car Payment</t></si> <si><t>Rent</t></si> <si><t>Utilities</t></si> <si><t>Insurance</t></si> <si><t>Date Paid</t></si> . . . </sst> ``` ### 表 工作表上的数据可以组织成表格。表格通过明确标记的列、行和数据区域来帮助为数据提供结构和格式。可以轻松添加行和列,并使用下拉箭头自动添加筛选和排序功能。  单元格的实际表格数据通常与任何其他数据一样存储在工作表部分中,但表格的定义存储在单独的表格部分中,该部分从表格所在的工作表中引用。 ``` <worksheet . . .> . . . <sheetData> . . . </sheetData> . . . <tableParts count="1"> <tableParts count="1"> </tablePart r:id="rId2"/> </worksheet> ``` 工作表的 rels 部分如下: ``` <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/table" Target=".. /tables/table1.xml"/> ``` 表部分如下所示。  表格部分的内容如下。 ``` <table xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" id="1" name="Table1" displayName="Table1" ref="A18:C22" totalRowShown="0"> <autoFilter ref="A18:C22"/> <tableColumns count="3"> tableColumn id="1" name="Expenses" tableColumn id="2" name="Amount" tableColumn id="3" name="Date Paid" </tableColumns> <tableStyleInfo name="TableStyleMedium9" showFirstColumn="0" showLastColumn="0" showRowStripes="1" showColumnStripes="0"/> </table> ``` 上面红色的`ref`属性定义了工作表中构成表格的单元格范围。 ### 数据透视表 数据透视表用于聚合数据,并以可理解的布局汇总和显示数据。例如,假设我有一个大型电子表格,其中包含四个城市的四种产品的销售额。我可能有一个关于产品、日期、销售数量、城市和州的列。每个城市的每个产品每天都有一个条目,或每天 16 个条目。所以即使只有 4 个城市的 4 个产品,我一年也可以有 5840 行数据。如果想确定春季月份销量最高的城市怎么办?什么产品在改进?哪个城市的红色小部件销量最高?数据透视表有助于汇总数据并快速提供这些问题的答案。  数据透视表有一个行轴、一个列轴、一个值区域和一个报表筛选区域。每个表还有一个字段列表,用户可以从中选择要包含在数据透视表中的字段。以下是按产品汇总销售和收入的数据透视表。  数据透视表由以下组件组成。 1. 数据透视表汇总了基础数据。此数据可能与数据透视表位于同一工作表中,也可能位于不同的工作表中,也可能来自外部源。 2. 该数据的缓存或副本在称为 pivotCacheRecords 部分的部分中创建;例如,当外部数据源不可用时,就需要缓存。 3. 有一个 pivotCacheDefinition 部分定义了数据透视表中的每个字段并包含共享项,就像 sharedStrings 部分包含用于删除工作表中冗余的字符串一样。 4. 数据透视表部分定义数据透视表本身的布局,指定行轴、列轴、报表过滤器和值区域上的字段。  工作簿指向并拥有 pivotCacheDefinition 部分。工作簿中有对数据透视表数据缓存的引用,在对工作表的引用之后: ``` <pivotCaches> <pivotCache cacheId="13" r:id="rId4"/> </pivotCaches> ``` 工作簿的 rels 部分包含该参考: ``` <Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition" Target="pivotCache/pivotCacheDefinition1.xml"/> ``` pivotCacheDefinition 部分又指向pivotCacheRecords 部分。 ``` <pivotCacheDefinition xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/spreadsheetml/2006/relationships" r:id="rId1" refreshBy="XXXX" refreshedDate="41059.666109143516" createdVersion="1" refreshedVersion="3" recordCount="32" upgradeOnRefresh="1"> . . . </pivotCacheDefinition> ``` pivotCacheDefinition 的 rels 部分包含该引用: ``` <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheRecord" Target="pivotCacheRecords1.xml"/> ``` pivotCacheDefinition 部分还在其`<cacheSource>`元素中引用源数据: ``` <cacheSource type="worksheet"> <worksheetSource ref="A1:F33" sheet="Sheet1"/> </cacheSource> ``` 包含数据透视表的工作表引用了数据透视表部分。(可能有多个,因为工作表可以有多个数据透视表。)工作表的 rels 部分包含该引用: ``` <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotTable" Target="../pivotTables/pivotTable1.xml"/> ``` pivotTable 部分引用了 pivotCacheDefinitions 部分。数据透视表部分的 rels 部分包含该引用: ``` <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition" Target="../pivotCache/pivotCacheDefinition1.xml"/> ``` #### 枢轴缓存定义 现在让我们简要地看一下这些部分,并尝试理解它们。让我们从pivotCacheDefinition 开始。如上所述,它指定了源数据的位置。它还定义了源数据中的每个字段(例如要使用的数据类型和格式),包括数据透视表中未使用的字段。(实际使用的字段在数据透视表部分中指定。)并且它用作共享字符串的缓存,就像 SharedStrings 部分用于存储出现在工作表中的字符串一样。 我们示例工作表中六个字段的定义如下。 ``` <pivotCacheDefinition ...> <cacheSource type="worksheet"> >worksheetSource ref="A1:F33" sheet="Sheet1"/> </cacheSource> <cacheFields count="6"> <cacheField name="Product" numFmtId="0"> <sharedItems count="4"> <s v="Green Widget"/> <s v="Red Widget"/> <s v="Grey Widget"/> <s v="Blue Widget"/> </sharedItems> </cacheField> <cacheField name="Quantity Sold" numFmtId="0"> <sharedItems containsSemiMixedTypes="0" containsString="0" containsNumber="1" containsInteger="1" minValue="1" maxValue="9"/> </cacheField> <cacheField name="Date" numFmtId="14"> <sharedItems containsSemiMixedTypes="0" containsNoDate="0" containsDate="1" containsString="0" minDate="2012-03-04T00:00:00" maxDate="2012-03-06T00:00:00 count=2"> <d v="2012-03-04T00:00:00"/> <d v="2012-03-05T00:00:00"/> </sharedItems> </cacheField> <cacheField name="Revenue" numFmtId="165"> <sharedItems containsSemiMixedTypes="0" containsString="0" containsNumber="1" containsInteger="1" minValue="1" maxValue="9"/> </cacheField> <cacheField name="City" numFmtId="0"> <sharedItems count="4"> <s v="Rochester"/> <s v="Albany"/> <s v="Pittsburgh"/> <s v="Philadelphia"/> </sharedItems> </cacheField> <cacheField name="State" numFmtId="0"> <sharedItems count=2"> <s v="NY"/> <s v="PA"/> </sharedItems> </cacheField> </cacheFields> </pivotCacheDefinition> ``` 上面定义的第一个字段是产品字段。它由共享字符串值组成。如果该字段没有共享字符串值(例如上面定义的第二个字段——已售数量字段),则这些值将直接存储在 pivotCacheRecords 部分中。 #### 枢轴缓存记录 让我们看一下 pivotCacheRecords 部分,看看字段定义如何与缓存数据相关。下面是缓存中的前两行数据。 ``` <pivotCacheRecords . . .> <r> <x v="0"/> <n v="2"/> <x v="0"/> <n v="2"/> <x v="0"/> <x v="0"/> </r> <r> <x v="1"/> <n v="3"/> <x v="0"/> <n v="3"/> <x v="0"/> <x v="0"/> </r> . . . </pivotCacheRecords> ``` 这对应于下面显示的工作表中的数据。  首先请注意,缓存数据的每条记录 ( `<r>` ) 具有与 pivotCacheDefinition 中定义的相同数量的值 - 在我们的示例中为六个。每个记录中包含以下可能的元素: - `<x>` - 指示索引值引用在 pivotCacheDefinition 中定义的字段的项目 - `<s>` - 指示字符串值在记录中内联表达 - `<n>` - 指示在记录中内联表达数值 查看上面来自pivotCacheRecords 的两个示例记录,我们从pivotCacheDefinition 中知道六个值依次是产品、数量、日期、收入、城市和州。第一条记录中的 Product 字段是<xv="0"/>,因此值 (0) 是 product 字段中列出的项目的索引。列出的第一个(索引 0)是 Green Widget。第二个或数量字段值为<nv="2"/>,因此值 (2) 是内联表示的数值。第三个或日期字段值是<xv="0"/>,因此值 (0) 是日期字段(2012-03-04T00:00:00 或 3/4)中列出的项目的索引。等等。 #### 数据透视表 现在让我们看一下 pivotTable 部分。根元素是`<pivotTableDefinition>`元素。这里面有几个组成部分。首先,指定数据透视表在工作表上的位置。位置很简单。请注意,第一个标题和数据列均已指定。 ``` <pivotTableDefinition . . .> <location ref="B37:G43 firstHeaderRow="1" firstDataRow="2" firstDataCol="4"/> </cacheSource> ``` 项字段和每个字段的其他字段的信息的顺序,然后通过指定`<透视字段>`内的元素`<透视字段>`。 ``` <pivotFields count="6"> <pivotField axis="axisRow" compact="0" outline="0" subtotalTop="0" showAll="0" includeNewItemsFilter="1"> <items count="5"> <item sd="0" x="3"/> <item sd="0" x="0"/> <item sd="0" x="2"/> <item sd="0" x="1"/> <item t="default"/> </items> </pivotField> <pivotField dataField="1" compact="0" outline="0" subtotalTop="0" showAll="0" includeNewItemsFilter="1"/> <pivotField axis="axisRow" compact="0" numFmtId="14" outline="0" subtotalTop="0" showAll="0" includeNewItemsFilter="1"> <items count="3"> <item sd="0" x="0"/> <item sd="0" x="1"/> <item t="default"/> </items> </pivotField> . . . </pivotFields> ``` 从 pivotCacheDefinition 我们知道上面的第一个`<pivotField>`是乘积。它列出了 5 个项目。第一个是<item sd="0" x="3"/>。该`SD`属性表示该项目是否隐藏。值为*0*表示该项目未隐藏。的`X`属性是用于在物品的索引`<cacheField>`在pivotCacheDefinition产物。所述`<cacheField>`如下所示。请注意,索引 3 处项目的值是*Blue Widget*,因此如果显示产品字段以及在何处显示,Blue Widget 应首先出现在数据透视表中。 ``` <cacheField name="Product" numFmtId="0"> <sharedItems count="4"> <s v="Green Widget"/> <s v="Red Widget"/> <s v="Grey Widget"/> <s v="Blue Widget"/> </sharedItems> </cacheField> ``` 第二项的索引为 0,即“Green Widget”,第三项为 2 或“Grey Widget”,第四项为 1 或“Red Widget”。请注意,`<item t="default"/>`表示小计或总计。 继`<透视字段>`集是`<rowFields>`集合。此集合指定行轴上的数据透视表中实际存在哪些字段以及顺序。在我们的示例中,当我们完全展开第一行时,我们看到一行首先包含一个产品,然后是一个城市,然后是一个州,然后是一个日期。这些是行字段。  按照`<pivotFields>`集合中的索引顺序,这是`0、4、5、2`。对应的`<rowFields>`如下所示。 ``` <rowFields count="4"> <field x="0"/> <field x="4"/> <field x="5"/> <field x="2"/> </rowFields> ``` 后`<rowFields>`集合是`<rowItems>`集合。这是行轴中所有值的集合。数据透视表中的每一行都有一个`<i>`元素。对于每个`<i>,`有与行中项目值一样多的`<x>`元素。的`v`属性是基于零的索引引用`<透视字段>`项目的值。如果没有`v`,则该值被假定为0的值*盛大*的`牛逼`表示总计在最后一行项目值。 ``` <rowItems count="5"> <i> <x/> </i> <i> <x v="1"/> </i> <i> <x v="2"/> </i> <i> <x v="3"/> </i> <i t="grand"> <x/> </i> </rowItems> ``` `紧随其后`的是`<colFields>`集合,指示哪些字段位于数据透视表的列轴上。这里`<x>`再次是`<pivotField>`集合的索引。 ``` <colFields count="1"> <field x="-2"/> </colFields> ``` `<colItems>`集合在`后面`,列出了列轴上的所有值。 ``` <colItems count="2"> <i> <x/> </i> <i i="1"> <x v="1"/> </i> </colItems> ``` 也可能有一个`<pageFields>`集合,它描述了在报告过滤器区域中找到了哪些字段。 最后,还有一个`<dataFields>`集合,它描述了在数据透视表的值区域中找到了哪些字段。在我们的示例中,值区域中有两个字段——销售数量总和和收入总和。下面是合集。该`FLD`属性是该领域的指标被汇总。 ``` <dataFields count="2"> <dataField name="Sum of Quantity Sold" fld="1" baseField="0" baseItem="0"/> <dataField name="Sum of Revenue" fld="3" baseField="0" baseItem="0"/> </dataFields> ```
上一篇:
PDF基础文件结构
下一篇:
XLSX样式和格式
0
赞
56 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
0
条评论
More...
<>