2021/10/29

透過.NET c#產生 odt 格式文件OpenDocument 文字 (.odt)

現在政府機關都會要求資訊人員要能產出可編輯的ODT文件,供下屬單位填報資料時運用,而不能使用原來的 Word Docx等格式。

如果把一個odt檔案的副檔名改為.zip,再用解壓縮檔解開,可以看到當中有content.xml這個檔案,他其實就是我們在LibreOffice內所編輯的文件內容(context)。所以準備好一個乾淨的範本文件,將content.xml置換為我們需要的內容,再重新壓縮該檔案、更改檔名,就能產出我們要的odt檔案。

一個基本的content.xml背後基礎是XML文件跟樣式檔,框架會包含字形、樣式以及文字。

<office:document-content office:version="1.2">

<office:font-face-decls>

</office:font-face-decls>

<office:automatic-styles>

</office:automatic-styles>

<office:body>

<office:text text:use-soft-page-breaks="true">

<text:p text:style-name="P1">Hello World</text:p>

</office:text>

</office:body>

</office:document-content>

該檔案遵循XML架構,但對不熟悉tag樣式標註方法的人,要手動拼湊出所有的樣式非常困難,必須靠不斷的預覽來比較跟Word文件裡所見到的內容,這也是早期OpenOffice常常被說做出來的元件不像Word,無法真正所見即所得的原因。所以,透過Word轉出包含大部分文件格式的框架,存成範本文件,再由C#讀出文字並替換需要的內容或表格,會是較簡便的方法。

以第一個區段而言,我們可以看到檔案中所用到的字形

以第二個區段而言,我們可以看到他用類似CSS標註方式的格式,將文字區段內用到的每個樣式都列出。以最佳化的角度而言,很多樣式應該是重複的,可以不用列出這麼多筆。但Word產出的東西就是這樣,有時一個反覆編輯的檔案,樣式設定的內容可能還比內文長。
要產出範本文件時,建議可以整理一下文件的格式,使其檔案大小不要太龐大。

上傳進度:已上傳 98530 個位元組 (共 98530 個位元組)。

內文的部分,則與一般HTML文件類似,主要有文字段落的<text:p>,以及較複雜的<table:table>等。如前文的建議,面對有複雜要求的表頭,先完成繪製與轉換成ods,再用字串取代置換content.xml,即可得到需要的內容。