基於 DocumentFormat.OpenXml 操做 Excel (2)-- 文檔結構

  上一節初步使用了OpenXML 的SDK , DocumentFormat.OpenXml 來操做生成一個Excel ,爲了更好的理解這個類庫的使用,須要大體瞭解一個Excel文檔的基本結構。 而操做這個以及這個類庫裏面大體經常使用類的組織方式。數組

  在OpenXML 的SDK 中,SpreadsheetDocument 類,表示 Excel 文檔包。要操做Excel,都須要基於它來建立 的一個實例,而後來操做。其中操做Excel的時候,大多數要用到的類型及其關係以下圖所示:app

 

  以上只是展現部分類型,還有一些其它的不怎麼用的類型沒有展現如 表明主題ThemePart,表明對話框表格DialogsheetPart 等等。 另外咱們新建一個Excel文檔TestExcelFile.xlsx】,輸入幾個單元格數據, 表頭姓名和班級,微軟雅黑字體,加粗和居中,同時增長三行數據。保存後,修改後綴名爲zip, 而且解壓來對比查看。 這裏須要注意,用office excel軟件 和 wps 軟件,建立的excel文件,會不大同樣的,由於軟件初始化的時候是不同,給默認excel保存的東西也是不同。ide

  具體以下圖所示:佈局

   

  接下來,經過上面第一張關於OpenXML SDK 中類的關係圖,和第二張圖所展現的解壓縮後的Excel信息 來一塊兒對比看看。字體

 --》Excel 文件 與 SpreadsheetDocument 類型

  SpreadsheetDocument 就表示一個Excel文檔包(不止是xlsx,也能夠是xlsm等其它excel文件類型), 一個Excel文檔,它內部是由多個部件來組成的。而[Content_Types].xml 這個文件,包含了這個Excel文檔包裏全部相關部件的關聯信息,這個裏面包含了有什麼部件,每一個部件放在什麼文件,而它的內容類型是什麼。ui

具體內容以下:spa

 1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 2 <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
 3     <Default Extension="bin" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings"/>
 4     <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
 5     <Default Extension="xml" ContentType="application/xml"/>
 6     <Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/>
 7     <Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>
 8     <Override PartName="/xl/theme/theme1.xml" ContentType="application/vnd.openxmlformats-officedocument.theme+xml"/>
 9     <Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/>
10     <Override PartName="/xl/sharedStrings.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"/>
11     <Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/>
12     <Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/>
13     <Override PartName="/docProps/custom.xml" ContentType="application/vnd.openxmlformats-officedocument.custom-properties+xml"/>
14 </Types>

  在DocumentFormat.OpenXml 這個SDK裏面,包含了不少類後面會有一個Part結尾,好比WorkbookPartWorksheetPart WorkbookStylesPart 等等,這種就表示一個Excel文檔裏面的其中一個部件,而部件是有層級關聯的,部件包含子部件。好比 WorkbookPart 是基於 SpreadsheetDocument , 而 WorksheetPart 是基於 WorkbookPart; 而每個Part都有一個對應的XML文件來描述這個部件的總體信息,經過xml元素來描述部件的內容,而這些部件最終結合起來,成爲咱們看到的Excel文檔。excel

 --》workbook.xml 文件 與 WorkbookPart 類型

  SpreadsheetDocument 下通常會建立一個關鍵部件,就是WorkbookPart ,表明工做簿,對應的就是在解壓後的文件裏面的xl文件夾裏面的workbook.xml文件。而一般WorkbookPart 裏面的還須要建立一個Workbook對象( workbookpart.Workbook = new Workbook() )。那麼Workbook WorkbookPart 之間的聯繫是什麼呢? WorkbookPart 有一個對應的xml文件來描述它,那麼Workbook 就是這個xml文件的根節點code

打開workbook.xml文件,以下orm

 1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 2 <workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
 3     xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
 4     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x15"
 5     xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main">
 6     <fileVersion appName="xl" lastEdited="6" lowestEdited="6" rupBuild="14420"/>
 7     <workbookPr filterPrivacy="1" defaultThemeVersion="164011"/>
 8     <bookViews>
 9         <workbookView xWindow="0" yWindow="0" windowWidth="22260" windowHeight="12645"/>
10     </bookViews>
11     <sheets>
12         <sheet name="Sheet1" sheetId="1" r:id="rId1"/>
13     </sheets>
14     <calcPr calcId="162913"/>
15     <extLst>
16         <ext uri="{140A7094-0E35-4892-8432-C4D2E57EDEB5}"
17             xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main">
18             <x15:workbookPr chartTrackingRefBase="1"/>
19         </ext>
20     </extLst>
21 </workbook>

  workbook.xml文件,根節點就是對應代碼中的Workbook類對象。每一個元素節點,都會有對應的類型,好比sheets節點元素,對應 Sheets 類型,而 sheet節點元素,對應Sheet 類型,通常元素節點名稱 和 對應的對象類型名稱都一致,可是也不必定是,有時候元素節點是縮寫,簡寫之類的,好比上面的 calcPr 節點元素,對應則是 CalculationProperties 類。

  workbook 元素下面,不少子元素,每個元素做用,則須要查詢微軟的文檔,和對應的Open XML 標準說明,才能知道。 可是咱們作功能導入導出,通常涉及到的,無非是 sheets節點元素和其下的sheet節點元素 。 上一節中,已經針對節點對應的 Sheets 類型 和 Sheet 類型作過了說明,下面再詳細說明一次。

  Sheets 類型對應XML裏面 sheets節點元素,它做用就是相似數組和列表;而Sheet 類型,對應sheet節點元素 , 表示一個工做簿中用到的表,通常狀況下,咱們經常使用的一個是 工做表(WorkSheet),還有可能會用到的就是圖表(ChartSheet)了。而因爲這些表的定義比較複雜,因此Excel中,都是一個獨立的部件(有單獨的xml來描述)存在。 而這裏的sheet 就只是一個關聯關係,有對應表展現的名字,表的Id,所關聯的表明具體表的部件,和表的類型是什麼,默認狀況下沒有type屬性,就是工做表(WorkSheet)。

 --》Excel 文件 與 SpreadsheetDocument 類型

  既然說了Sheet,就來看看這個WorksheetPart 類型,這個部件屬於WorkbookPart 子部件,它須要經過WorksheetPart 類型對象來建立(語法:workbookPart.AddNewPart<WorksheetPart>();),而且能夠建立多個。在上圖中所示,xl文件夾中,有一個worksheets文件夾,裏面會存在多個XML文件,每個XML文件描述一個WorksheetPart部件的信息, 而 打開Sheet1.xml查閱其信息, XML根節點元素是 worksheet ,對應咱們的類型就是 Worksheet類,其子元素有 sheetViews,sheetFormatPr ,sheetData等等。

具體的XML能夠看看下面代碼:

 1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 2 <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
 3     xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
 4     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac"
 5     xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
 6     <dimension ref="A1:B4"/>
 7     <sheetViews>
 8         <sheetView tabSelected="1" workbookViewId="0"/>
 9     </sheetViews>
10     <sheetFormatPr defaultRowHeight="14.25" x14ac:dyDescent="0.2"/>
11     <sheetData>
12         <row r="1" spans="1:2" ht="15" x14ac:dyDescent="0.25">
13             <c r="A1" s="1" t="s">
14                 <v>0</v>
15             </c>
16             <c r="B1" s="1" t="s">
17                 <v>1</v>
18             </c>
19         </row>
20         <row r="2" spans="1:2" x14ac:dyDescent="0.2">
21             <c r="A2" t="s">
22                 <v>2</v>
23             </c>
24             <c r="B2" t="s">
25                 <v>3</v>
26             </c>
27         </row>
28         <row r="3" spans="1:2" x14ac:dyDescent="0.2">
29             <c r="A3" t="s">
30                 <v>5</v>
31             </c>
32             <c r="B3" t="s">
33                 <v>3</v>
34             </c>
35         </row>
36         <row r="4" spans="1:2" x14ac:dyDescent="0.2">
37             <c r="A4" t="s">
38                 <v>6</v>
39             </c>
40             <c r="B4" t="s">
41                 <v>4</v>
42             </c>
43         </row>
44     </sheetData>
45     <phoneticPr fontId="1" type="noConversion"/>
46     <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
47     <pageSetup paperSize="9" orientation="portrait" horizontalDpi="300" verticalDpi="300" r:id="rId1"/>
48 </worksheet>

  從上面的這個XML文檔, worksheet根節點元素,表示一個工做表,其子元素就是構造這個工做表的主要部分。

  簡單敘述下幾個節點的意義:

   (1) dimension 節點元素: 對應類型SheetDimension類型,表示維度,工做表維度,工做表中使用的單元格的行和列的邊界。通常能夠理解爲你在工做表中,輸入的全部數據中,使用到最大的列,使用的最大的行數,所造成的一個四方形區間。

   (2) sheetViews 節點元素: 對應類型SheetViews類型,工做表視圖定義,通常用它表示當前工做表選擇的部分,好比你光標所在的位置,選中的部分等等。 好比下方代碼片斷,結合selection 節點,activeCell屬性表示選擇框在哪一個單元格,sqref屬性表示選擇的部分;固然,Excel裏面是能夠選中多個區域,那麼會變成是:<selection activeCell="F4" sqref="B6 C2:C3 C4:F4"/> 這樣子的。

<sheetViews>
    <sheetView tabSelected="1" workbookViewId="0">
        <selection activeCell="A1" sqref="A1"/>
    </sheetView>
</sheetViews>

  不過在 sheetViews 節點元素下,還有其它的功能,涉及多窗口窗格子的選擇等等,具體能夠再細細研究。

  (3) sheetFormatPr 節點元素:對應類型 SheetFormatProperties 類型,工做表的格式屬性,通常能夠設置默認行高,默認的列寬度等等。

  (4) sheetData 節點元素:對應類型 SheetData 類型,這個表示單元格表的數據信息的集合,裏面包含了每一個單元格的信息。這個基本上是咱們作導入導出等功能的時候,最須要打交道的類型之一了。從上面XML代碼中,看起來仍是很容易理解的。 在這個sheetData節點下,有節點元素row (對應類型Row類型),表示一行; 而節點元素row的下面,有節點元素c(對應類型Cell類型),表示一單元格;其節點元素c的下面,有節點元素v(對應類型CellValue類型), 表示單元格的內容值,不過這個值的內容,和其節點元素c的一個t屬性有關係, 後續再來探討。

   (5) phoneticPr  節點元素: 對應類型 PhoneticProperties類型,這個和拼音文本的有關。

   (6) pageMargins 節點元素: 對應類型 PageMargins類型,定義工做表的頁邊距,對應Excel功能裏面的頁面佈局-頁邊距功能。

   (7) pageSetup 節點元素: 對應類型 PageSetup類型,涉及到Excel頁面設置的一些功能內容,包含紙張大小,紙張方向,紙張高度,寬度等等。

  根據上述說起的 XML 元素節點,和最上面的圖 對比來看,WorksheetPart 類型下方,還有幾個類型沒有出現。 其中 Columns類型 和 Column類型, 這2個類型通常是用來定義列寬。而MergeCells 類型 和 MergeCell 類型主要是合併單元格相關。

 --》sharedStrings.xml 文件 與 SharedStringTablePart 類型

   sharedStrings.xml 文件,對應類型 SharedStringTablePart 類型,這部分主要表示,共享字符串部分,用來減小文件大小的。

具體的XML能夠看看下面代碼:

 1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 2 <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="8" uniqueCount="7">
 3     <si>
 4         <t>姓名</t>
 5         <phoneticPr fontId="1" type="noConversion"/>
 6     </si>
 7     <si>
 8         <t>班級</t>
 9         <phoneticPr fontId="1" type="noConversion"/>
10     </si>
11     <si>
12         <t>王同窗</t>
13         <phoneticPr fontId="1" type="noConversion"/>
14     </si>
15     <si>
16         <t>一班</t>
17         <phoneticPr fontId="1" type="noConversion"/>
18     </si>
19     <si>
20         <t>二班</t>
21         <phoneticPr fontId="1" type="noConversion"/>
22     </si>
23     <si>
24         <t>陳同窗</t>
25         <phoneticPr fontId="1" type="noConversion"/>
26     </si>
27     <si>
28         <t>林同窗</t>
29         <phoneticPr fontId="1" type="noConversion"/>
30     </si>
31 </sst>

  根據以上的XML代碼,結合咱們Excel文件輸入的數據,Excel默認把這些數據存放在這個共享字符串變量裏面,而單元格的值是純粹引用這裏而已,後續再探討。

 --》styles.xml 文件 與 WorkbookStylesPart 類型

  styles.xml 文件,對應類型 WorkbookStylesPart 類型。 這個類型相對複雜不少,主要涵蓋的內容是Excel裏面的樣式,包含字體的定義,填充色定義,邊框定義等等。

樣式部分暫時不在這裏探討了,後續單獨說明。能夠先看看具體的XML代碼:

 1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 2 <styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
 3     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac x16r2"
 4     xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"
 5     xmlns:x16r2="http://schemas.microsoft.com/office/spreadsheetml/2015/02/main">
 6     <fonts count="3" x14ac:knownFonts="1">
 7         <font>
 8             <sz val="11"/>
 9             <color theme="1"/>
10             <name val="等線"/>
11             <family val="2"/>
12             <scheme val="minor"/>
13         </font>
14         <font>
15             <sz val="9"/>
16             <name val="等線"/>
17             <family val="3"/>
18             <charset val="134"/>
19             <scheme val="minor"/>
20         </font>
21         <font>
22             <b/>
23             <sz val="11"/>
24             <color theme="1"/>
25             <name val="微軟雅黑"/>
26             <family val="2"/>
27             <charset val="134"/>
28         </font>
29     </fonts>
30     <fills count="2">
31         <fill>
32             <patternFill patternType="none"/>
33         </fill>
34         <fill>
35             <patternFill patternType="gray125"/>
36         </fill>
37     </fills>
38     <borders count="1">
39         <border>
40             <left/>
41             <right/>
42             <top/>
43             <bottom/>
44             <diagonal/>
45         </border>
46     </borders>
47     <cellStyleXfs count="1">
48         <xf numFmtId="0" fontId="0" fillId="0" borderId="0"/>
49     </cellStyleXfs>
50     <cellXfs count="2">
51         <xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/>
52         <xf numFmtId="0" fontId="2" fillId="0" borderId="0" xfId="0" applyFont="1" applyAlignment="1">
53             <alignment horizontal="center"/>
54         </xf>
55     </cellXfs>
56     <cellStyles count="1">
57         <cellStyle name="常規" xfId="0" builtinId="0"/>
58     </cellStyles>
59     <dxfs count="2">
60         <dxf>
61             <font>
62                 <b/>
63                 <i val="0"/>
64             </font>
65             <fill>
66                 <patternFill>
67                     <bgColor rgb="FFD7D7D7"/>
68                 </patternFill>
69             </fill>
70         </dxf>
71         <dxf>
72             <font>
73                 <b val="0"/>
74                 <i val="0"/>
75             </font>
76             <fill>
77                 <patternFill patternType="none">
78                     <bgColor indexed="65"/>
79                 </patternFill>
80             </fill>
81         </dxf>
82     </dxfs>
83     <tableStyles count="1" defaultTableStyle="TableStyleMedium2" defaultPivotStyle="PivotStyleLight16">
84         <tableStyle name="MySqlDefault" pivot="0" table="0" count="2">
85             <tableStyleElement type="wholeTable" dxfId="1"/>
86             <tableStyleElement type="headerRow" dxfId="0"/>
87         </tableStyle>
88     </tableStyles>
89     <extLst>
90         <ext uri="{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}"
91             xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main">
92             <x14:slicerStyles defaultSlicerStyle="SlicerStyleLight1"/>
93         </ext>
94         <ext uri="{9260A510-F301-46a8-8635-F512D64BE5F5}"
95             xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main">
96             <x15:timelineStyles defaultTimelineStyle="TimeSlicerStyleLight1"/>
97         </ext>
98     </extLst>
99 </styleSheet>

 

 --》小結

  本節大概說明了下經常使用類型和Excel文檔包中關聯的XML的對應關係,大概總結爲以下對應圖:

  

  下一節,開始經過代碼來實現一些功能。

相關文章
相關標籤/搜索