Excel 2007 底层实现方式

Posted 请叫我大表哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Excel 2007 底层实现方式相关的知识,希望对你有一定的参考价值。

一、EXCEL的底层实现

能力有限,了解的比较浅,有不足之处望指正,首先看下图:

一、 excel2007是使用xml格式来存储的,把一个excel文件后缀改为.zip,打开之后就直接可以看到一个excel文件对应的xml格式的文件了。

1.1、docProps目录

1.1.1、 core.xml文件

<?xml version="1.0" encoding="utf-8"?>
<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>Administrator</dc:creator>
  <!-- 最后修改人 -->
  <cp:lastModifiedBy>Administrator</cp:lastModifiedBy>
  <!-- 创建时间 -->
  <dcterms:created xsi:type="dcterms:W3CDTF">2008-09-11T17:22:52Z</dcterms:created>
  <!-- 修改时间 -->
  <dcterms:modified xsi:type="dcterms:W3CDTF">2017-03-31T15:29:39Z</dcterms:modified>
</cp:coreProperties>
View Code

1.1.2、 app.xml文件

<?xml version="1.0" encoding="utf-8"?>
<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>
    <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>
    <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/>
    <LinksUpToDate>false</LinksUpToDate>
    <!-- 是否共享 -->
    <SharedDoc>false</SharedDoc>
    <HyperlinksChanged>false</HyperlinksChanged>
    <!-- 版本 -->
    <AppVersion>12.0000</AppVersion>
</Properties>
View Code

 1.2、 xl目录,该目录保存的就是excel中的详细内容了

1.2.1、workbook.xml文件

  文件包含一对<sheets>标签,其中的每个<sheet>元素都代表Excel 2007文件中的一个sheet,工作表的名称就是其name属性的值,这里有三个sheet

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" 
    xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
    <fileVersion appName="xl" lastEdited="4" lowestEdited="4" rupBuild="4506"/>
    <workbookPr defaultThemeVersion="124226"/>
    <bookViews>
        <workbookView xWindow="0" yWindow="105" windowWidth="12765" windowHeight="5715"/>
    </bookViews>
    <sheets>
        <sheet name="Sheet1" sheetId="1" r:id="rId1"/>
        <sheet name="Sheet2" sheetId="2" r:id="rId2"/>
        <sheet name="Sheet3" sheetId="3" r:id="rId3"/>
    </sheets>
    <calcPr calcId="125725"/>
</workbook>
View Code

1.2.2、 _rels/workbook.xml.rels

  定义每个sheetid对应的sheet内容文件sheet1.xml,共享的单元格内容文件sharedstring.xml,样式文件style.xml是当前单元格的样式字体,颜色等样式的xml配置。

<?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>
View Code

1.2.3、 worksheets文件夹,保存的就是excel中的sheet

1.2.4、sheet.xml文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" 
    xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
    <!-- 
        容积,即该sheet中以供占用了多大的地方,哪个单元格到哪个单元格,矩形的左上角单元格和右下角单元格
        此属性可以判断列数,如下就是:(M-A+1)
    -->
    <dimension ref="A1:M8"/>
    <!-- sheet视图的配置信息,如打开时默认选中的单元格是哪个 -->
    <sheetViews>
        <sheetView tabSelected="1" workbookViewId="0">
            <selection activeCell="G12" sqref="G12"/>
        </sheetView>
    </sheetViews>
    <!-- sheet的格式参数 -->
    <sheetFormatPr defaultRowHeight="14.25"/>
    <!-- 行中每列的配置参数 -->
    <cols>
        <col min="1" max="1" width="7.875" customWidth="1"/>
        <col min="2" max="2" width="6.75" customWidth="1"/>
        <col min="3" max="3" width="6" customWidth="1"/>
        <col min="4" max="4" width="4.5" customWidth="1"/>
        <col min="5" max="5" width="8.5" customWidth="1"/>
        <col min="6" max="6" width="9.375" customWidth="1"/>
        <col min="7" max="7" width="13.5" customWidth="1"/>
        <col min="8" max="8" width="7" customWidth="1"/>
        <col min="9" max="9" width="7.625" customWidth="1"/>
        <col min="10" max="10" width="4.625" customWidth="1"/>
        <col min="11" max="11" width="9.5" bestFit="1" customWidth="1"/>
    </cols>
    <!-- 数据区域,这个里面就是我们的单元格的相关数据信息了,是以行(Row)的方式记录的 -->
    <sheetData>
        <!-- excel中的行 -->
        <row r="1" spans="1:13">
            <!-- 
                excel中的列
                    r:单元格坐标
                    s:单元格的style,对应style.xml中cellXfs元素下的某个元素xf元素,
                      此处就是对应索引为12的元素,从0开始计算,即为第13个xf元素。
                    t:元素类型,s表示是字符串类型,对应到sharedStrings.xml中的sst元素
            -->
            <c r="A1" s="12" t="s">
                <!-- 
                    如果是t="s" 则存储的是sharedStrings.xml中sst元素下的某个si元素,此处对应索引为0的元素,即第一个si元素
                    否则,这里存储的就是单元格的值 
                -->
                <v>0</v>
            </c><c r="B1" s="12" t="s">
                <v>10</v>
            </c><c r="C1" s="12" t="s">
                <v>1</v>
            </c><c r="D1" s="12" t="s">
                <v>2</v>
            </c><c r="E1" s="12" t="s">
                <v>3</v>
            </c><c r="F1" s="12" t="s">
                <v>4</v>
            </c><c r="G1" s="12" t="s">
                <v>5</v>
            </c><c r="H1" s="12" t="s">
                <v>6</v>
            </c><c r="I1" s="12" t="s">
                <v>7</v>
            </c><c r="J1" s="12" t="s">
                <v>8</v>
            </c><c r="K1" s="12" t="s">
                <v>9</v>
            </c>
        </row>
        <row r="2" spans="1:13">
            <c r="A2" t="s">
                <v>11</v>
            </c><c r="B2" s="10" t="s">
                <v>12</v>
            </c><c r="C2" s="1">
                <v>2</v>
            </c><c r="D2" s="2" t="s">
                <v>13</v>
            </c><c r="E2" s="3" t="s">
                <v>14</v>
            </c><c r="F2" s="4">
                <v>89</v>
            </c><c r="G2" s="5">
                <v>10</v>
            </c><c r="H2" s="6">
                <v>12</v>
            </c><c r="I2" s="7">
                <v>0.2</v>
            </c><c r="J2" s="8">
                <v>0.5</v>
            </c><c r="K2" s="9">
                <v>4564645</v>
            </c><c r="L2" s="10"/>
            <c r="M2" s="11"/>
        </row>
        <row r="3" spans="1:13">
            <!-- 
                此处为什么没有A3?
                因为excel中常规列如果没有值,此处就不记录,因此在读取excel是应该特别注意,否则可能导致列错乱
            -->
            <c r="B3" s="10"/>
            <c r="C3" s="1"/>
            <c r="D3" s="2"/>
            <c r="E3" s="3"/>
            <c r="F3" s="4"/>
            <c r="G3" s="5"/>
            <c r="H3" s="6"/>
            <c r="I3" s="7"/>
            <c r="J3" s="8"/>
            <c r="K3" s="9"/>
        </row>
        
        <!-- 该行每列都是常规列,因此没有值的就不记录在这里 -->
        <row r="4" spans="1:13">
            <c r="A4" s="12" t="s">
                <v>15</v>
            </c><c r="E4" t="s">
                <v>16</v>
            </c>
        </row>
        <!-- 5,6,7 行都是合并再一起

以上是关于Excel 2007 底层实现方式的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot+POI方式导出excel加水印

SpringBoot+POI方式导出excel加水印

以编程方式创建 Excel 2007 表格

C#以流方式把DataGridView数据导出Excel!

Excel-怎样实现行列转置

Excel 到关系数据库 - Access 2007