在下嘗試慢慢拆解 OpenDocument Spreadsheet 中的 XML
將一個普通的 ods 檔案解壓縮,會得到一組檔案及資料夾,格式大概如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | Thumbnails/Thumbnails/thumbnail.pngmimetypeConfigurations2/Configurations2/images/Configurations2/images/Bitmaps/Configurations2/statusbar/Configurations2/menubar/Configurations2/popupmenu/Configurations2/toolpanel/Configurations2/toolbar/Configurations2/floater/Configurations2/progressbar/Configurations2/accelerator/Configurations2/accelerator/current.xmlsettings.xmlmeta.xmlstyles.xmlcontent.xmlMETA-INF/META-INF/manifest.xml |
上次提及 META-INF/manifest.xml 是一個重要檔案
此檔案可以當作 OpenDocument Spreadsheet 中將會使用的 XML 資訊,格式如下:
1 2 3 4 5 6 7 8 9 | <?xml version="1.0" encoding="UTF-8"?><manifest:manifest xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"><!-- declare mime type application/vnd.oasis.opendocument.spreadsheet for OpenDocument Spreadsheet --> <manifest:file-entry manifest:media-type="application/vnd.oasis.opendocument.spreadsheet" manifest:full-path="/"/> <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="content.xml"/><!-- add more xml files include here <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="other.xml"/>--></manifest:manifest> |
必須載入 <manifest:file-entry manifest:media-type="application/vnd.oasis.opendocument.spreadsheet" manifest:full-path="/"/>
manifest:media-type="application/vnd.oasis.opendocument.spreadsheet" 宣告文件為 OpenDocument Spreadsheet
manifest:full-path="/" 定義由該結構的 / 位置開始,連接其他文件 (如有)
以 <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="other.xml"/> 載入其他文件
manifest:media-type="text/xml" 宣告載入的文件 mine type 為 text/xml
manifest:full-path="other.xml" 載入的文件位置,以 manifest:full-path 為基礎,可以使用絕對路徑
其實 格式化的 XML 資料不一定要指定命名為 content.xml , styles.xml 等名字
只要 格式化的 XML 文件中:
content 的 XML 以 office:document-content 格式編寫
styles 的 XML 以 office:document-styles 格式編寫
定義 XML 在 OpenDocument Spreadsheet 的用途即可,命名為相對名字只是為了方便程式員或分析員查看
OpenDocument Spreadsheet 內容是以 office:document-content 定義,格式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?xml version="1.0" encoding="UTF-8"?><office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2"> <office:scripts><!-- macro scripts here ... --> </office:scripts> <office:font-face-decls><!-- used font faces here ... --> </office:font-face-decls> <office:automatic-styles><!-- table styles here ... --> </office:automatic-styles> <office:body><!-- table contents here ... --> </office:body></office:document-content> |
office:scripts OpenDocument Spreadsheet 的 Macro 指令碼
office:font-face-decls OpenDocument Spreadsheet 所使用的字型宣告
office:automatic-styles OpenDocument Spreadsheet 所使用的樣式宣告
office:body OpenDocument Spreadsheet 的 表單內容
如果是進行匯出資料 office:scripts 通常都不會有內容,只需要寫上 <office:scripts/> 即可
office:font-face-decls 格式如下:
1 2 3 4 | <office:font-face-decls><!-- add more font face here --> <style:font-face style:name="font-face-name" svg:font-family="'font-face-name'"/></office:font-face-decls> |
需要注意 style:name 及 svg:font-family 雖然是相同,但 svg:font-family 的 字型名稱需要用 ' 包著
office:automatic-styles 格式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <office:automatic-styles><!-- style:name can be any string of name, style ta-0 is relate to table will apply this table style --><!-- style:master-page-name can be any string of name, style page-style-0 is relate to table will apply this page setup style --> <style:style style:name="ta-0" style:family="table" style:master-page-name="page-style-0"> <style:table-properties table:display="true"/> </style:style><!-- style:name can be any string of name, style ro-0 is relate to table row will apply this row style --> <style:style style:name="ro-0" style:family="table-row"><!-- fo:break-before accepts auto|page|column|before --><!-- style:row-height accepts any float value with cm|in --><!-- style:use-optimal-row-height accepts true|false --> <style:table-row-properties fo:break-before="auto" style:row-height="1in" style:use-optimal-row-height="false"/> </style:style><!-- style:name can be any string of name, style co-0 is relate to table column will apply this column style --> <style:style style:name="co-0" style:family="table-column"><!-- fo:break-before accepts auto|page|column|before --><!-- style:column-width accepts any float value with cm|in --> <style:table-column-properties fo:break-before="auto" style:column-width="1in" style:use-optimal-column-width="false"/> </style:style><!-- style:name can be any string of name, style ce-0-0 is relate to table cell will apply this cell style --> <style:style style:name="ce-0-0" style:family="table-cell" style:parent-style-name="Default"><!-- style:vertical-align accepts top|middle|bottom --><!-- fo:border-top, fo:border-left, fo:border-right, fo:border-bottom accept any float value with cm|in|px for border width, solid|dotted|dashed|double for border style, #rrggbb value for border color --><!-- if fo:border-top, fo:border-left, fo:border-right, fo:border-bottom set the same values use fo:border to reduce the code --><!-- fo:background-color accepts #rrggbb value for border --> <style:table-cell-properties style:text-align-source="fix" style:repeat-content="false" style:vertical-align="middle" fo:border-top="2px solid #000000" fo:border-left="2px dotted #ff0000" fo:border-right="2px dashed #00ff00" fo:border-bottom="2px double #0000ff" fo:background-color="#ffffff"/><!-- fo:text-align accepts left|center|right --> <style:paragraph-properties fo:text-align="center"/><!-- fo:font-size, style:font-size-asian, style:font-size-complex accept any float value with pt|px, set as the same for these 3 attributes --><!-- fo:color accepts accepts #rrggbb value for border --><!-- style:font-name accepts a font face declared in office:font-face-decls --> <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt" fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold" fo:font-italic="italic" style:font-italic-asian="italic" style:font-italic-complex="italic" fo:color="#000000" style:font-name="font-face-name"/> </style:style></office:automatic-styles> |
<style:style style:family="table"> OpenDocument Spreadsheet 單行 的樣式
<style:style style:family="table-row"> OpenDocument Spreadsheet 表單行 的樣式
<style:style style:family="table-column"> OpenDocument Spreadsheet 表單欄 的樣式
<style:style style:family="table-cell" style:parent-style-name="Default"> OpenDocument Spreadsheet 表單格 的樣式
style:family 需要宣告 style:name
通常 style:family="table" 時使用 ta- 為前綴
table 會使用 <style:table-properties> 主要使用
style:master-page-name 為使用指定頁面設定的名稱
通常 style:family="table-row" 時使用 ro- 為前綴
table-row 會使用 <style:table-row-properties> 主要使用
fo:break-before="auto" 文字跳行,可選用 auto 為自動分隔, page 以頁分隔, column 以欄分隔, before (不明)
style:row-height="1in" 設定行高,可以使用任何浮點數,而單位可選用 cm 為公分,in 為英寸
style:use-optimal-row-height="false" 使用最佳欄闊,可選用 true 為自動行高,或 false 為使用 style:row-height
通常 style:family="table-column" 時使用 co- 為前綴
table-column 會使用 <style:table-column-properties> 主要使用
fo:break-before="auto" 文字跳行,可選用 auto 為自動分隔, page 以頁分隔, column 以欄分隔, before (不明)
style:column-width="1in" 設定欄闊,可以使用任何浮點數,而單位可選用 cm 為公分,in 為英寸
style:use-optimal-column-width="false" 使用最佳欄闊,可選用 true 為自動欄闊,或 false 為使用 style:column-width
通常 style:family="table-cell" 時使用 ce- 為前綴
table-cell-column 會使用 <style:table-cell-properties> 主要使用
style:vertical-align 為文字垂直放置位置 top, middle, bottom 分別為上、中、下
fo:border-top, fo:border-left, fo:border-right, fo:border-bottom 為表單格的邊界樣式對應位置為上、左、右、下
屬性值為 數值及單位 樣式 顏色 例如 2px solid #000000
如果上、左、右、下都使用相同設定可以簡化使用 fo:border
fo:background-color 為表單格的背景顏色
style:paragraph-properties 的 fo:text-align 為文字水平放置位置 start, center, end 分別為左、中、右
style:text-properties 的
fo:font-size, style:font-size-asian, style:font-size-complex 為字元大小,單位以 pt 為標準
fo:color 為表單格文字顏色
style:font-name 為表單格所使用有字型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <office:body> <office:spreadsheet><!-- table:name accepts any string of name --> <table:table table:name="sheet-name"><!-- table:style-name retrieves the declared table:style-name and the style:family="table-column" --> <table:table-column table:style-name="co-0"<!-- table:default-cell-style-name="Default"-->/><!-- table:style-name retrieves the declared table:style-name and the style:family="table-row" --> <table:table-row table:style-name="ro-0"><!-- table:style-name retrieves the declared table:style-name and the style:family="table-cell" --><!-- office:value-type accepts boolean|currency|date|float|percentage|string|time --><!-- table:number-rows-spanned accepts an integer which > 0, if not present default 1 --><!-- table:number-columns-spanned accepts an integer which > 0, if not present default 1 --><!-- <![CDATA[some text]]> some text is any string of text, <![CDATA[]]> can escape any special characters as normal characters in XML --> <table:table-cell table:style-name="ce-0-0" office:value-type="string" table:formula="oooc:=SUM([.A1])" table:number-rows-spanned="1" table:number-columns-spanned="1"><text:p><![CDATA[some text]]></text:p></table:table-cell> </table:table-row> </table:table> </office:spreadsheet></office:body> |
office:body 包含一個 office:spreadsheet , office:spreadsheet 包含一個或多個 table:table
table:table 需要宣告 table:name 長度必須大於1 ,而且所有 table:table 的 table:name 都不能重覆
值得注意是 table:table-column 在 table:table 中是獨立的 tag
table:table-column 的 table:style-name 可接收 <style:style style:family="table-column"> 的 style:name
table:table-row 的 table:style-name 可接收 <style:style style:family="table-row"> 的 style:name
table:table-cell 的 table:style-name 可接收 <style:style style:family="table-cell"> 的 style:name
table:number-rows-spanned 為跨行數量,必須是正整數,不設定為 1 ,與 HTML td 的 rowspan 相同
table:number-columns-spanned 為跨欄數量,必須是正整數,不設定為 1 ,與 HTML td 的 colspan 相同
office:value-type 可選用 boolean, currency, date, float, percentage, string, time 幾種型態
相對使用 office:boolean-value, office:currency, office:date-value, office:value, office:value, office:string-value, office:time-value
float 及 percentage 都是使用 office:value
而作為 float 或 percentage 型態,可以使用指數寫法,例如 1E+6 代表 1000000 (一百萬)
office:boolean-value 則是 true 或 false
table:formula 是定義表單格中的運算方程式,資料必須輸入 oooc:= 為前綴
若需要存取表單格,便需要用 [.] 包著目標表單格,例如 [.A1] 以存取 A1 表單格
若需要存取表單範圍,可以於 [.] 使用 : 例如 [.A1:B2] 以存取 A1 至 B2 表單範圍
text:p 則是在 表單格中顯示的文字資料,例如 office:value 為 1 可以在 text:p 指定顯示為 1.00
<![CDATA[]]> 這種寫法可以讓 XML 的特殊符號,如 & 符號以普通文字顯示而不需要轉換成 &
OpenDocument Spreadsheet 風格是以 office:document-style 定義,格式如下:
1 2 3 4 5 6 7 8 9 10 11 12 | <?xml version="1.0" encoding="UTF-8"?><office:document-styles xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2"> <office:font-face-decls><!-- used font face here --> </office:font-face-decls> <office:automatic-styles><!-- sheet style here --> </office:automatic-styles> <office:master-styles><!-- apply the style to table here --> </office:master-styles></office:document-styles> |
office:font-face-decls OpenDocument Spreadsheet 所使用的字型宣告
office:automatic-styles OpenDocument Spreadsheet 所使用的樣式宣告
office:master-styles OpenDocument Spreadsheet 的表單所應用的樣式
office:automatic-styles 格式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <office:automatic-styles><!-- style:name can be any string of name, style page-setup-0 is relate to table will apply this page setup style --> <style:page-layout style:name="page-setup-0"><!-- fo:page-width and fo:page-height accept any float value with cm|in --><!-- style:print-orientation accepts portrait|landscape --><!-- fo:margin-top, fo:margin-left, fo:margin-right, fo:margin-bottom accept any float value with cm|in --><!-- if fo:margin-top, fo:margin-left, fo:margin-right, fo:margin-bottom set the same values use fo:margin to reduce the code --><!-- style:table-centering accepts none|horizontal|vertical|both --><!-- style:writing-mode accepts lr-tb|tb-lr --> <style:page-layout-properties fo:page-width="21cm" fo:page-height="29.7cm" style:print-orientation="portrait" fo:margin-top="2cm" fo:margin-left="2cm" fo:margin-right="2cm" fo:margin-bottom="2cm" style:table-centering="none" style:writing-mode="lr-tb"/> <style:header-style><!-- fo:min-height accepts any float value with cm|in --><!-- fo:margin-left accepts any float value with cm|in --><!-- fo:margin-right accepts any float value with cm|in --><!-- fo:margin-bottom accepts any float value with cm|in --> <style:header-footer-properties fo:min-height="0.5cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-bottom="0.25cm"/> </style:header-style> <style:footer-style><!-- fo:min-height accepts any float value with cm|in --><!-- fo:margin-left accepts any float value with cm|in --><!-- fo:margin-right accepts any float value with cm|in --><!-- fo:margin-top accepts any float value with cm|in --> <style:header-footer-properties fo:min-height="0.5cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0.25cm"/> </style:footer-style> </style:page-layout></office:automatic-styles> |
style:page-layout-properties 的
fo:page-width, fo:page-height 分別為表單的闊及高,屬性值為 數值及單位
style:print-orientation 為表單方向,portrait 為直向,landscape 為橫向
不過直向或橫向並沒有必定意思,例如設定 style:print-orientation 為 portrait 但 fo:page-width 設定值比 fo:page-height 大,表格其實是橫向
但會影響列印設定,因此設定 style:print-orientation 時,應配合 fo:page-width 及 fo:page-height
fo:margin-top, fo:margin-left, fo:margin-right, fo:margin-bottom 分別是設定上、左、右、下的頁邊距離,屬性值為 數值及單位
如果上、左、右、下都使用相同設定可以簡化使用 fo:margin
style:table-centering 為表單中心設定,none 為不設定,horizontal 為水平置中,vertical 為垂直置中,both 為水平及垂直置中
style:writing-mode 為控制列印次序 lr-tb 為先由上至下再左至右,tb-lr 為先左至右再上至下
style:header-style 為頁首設定
style:header-footer-properties 的
fo:min-height 為最少高度設定,屬性值為 數值及單位
fo:margin-left, fo:margin-right, fo:margin-top 分別是設定左、右、上的頁邊距離,屬性值為 數值及單位
style:footer-style 為頁首設定
style:header-footer-properties 的
fo:min-height 為最少高度設定,屬性值為 數值及單位
fo:margin-left, fo:margin-right, fo:margin-bottom 分別是設定左、右、下的頁邊距離,屬性值為 數值及單位
留意 header 沒有 fo:margin-bottom 及 footer 沒有 fo:margin-top
office:master-styles 格式如下:
1 2 3 | <office:master-styles> <style:master-page style:name="page-setup-0"/></office:master-styles> |
style:name 為讓表單使用的名稱
更多資料有待研究,或閣下參與
沒有留言 :
張貼留言