使用樣式—— 使用Python讀寫Office文檔之四

本篇文章討論如何設置樣式,以及如何利用Word的樣式管理器。

=========================================================================================================================================================================================================

通常,在排版管理中,與字元內容無關的所有可視要素都可稱之為『樣式』,具體說來,包括字體、顏色、對齊、行間距等等。

在Word(以及帶有文本編輯功能的Office軟體)中,從樣式應用的對象分,常用的樣式類型有字元樣式、段落樣式、表格樣式、枚舉樣式等。python-docx目前主要支持前三類,已經基本滿足日常使用。

每種樣式包含的內容主要有字體(包括字體名稱、顏色、傾斜、加粗)和段落格式(縮進、分頁模式)等。根據樣式應用對象的不同,每類樣式不一定包含所有的內容。例如,字元樣式就沒有段落格式這個內容。

Word有樣式管理器,負責管理內建樣式和用戶自定義樣式。python-docx可以操作這個管理器,把自定義的樣式添加到管理器里,或者從管理器選取一個樣式加以應用。

由於python-docx的樣式設置並不能包含Word的所有樣式設置。因此個人的建議是:

  1. 當你的操作只是涉及Word本身(例如批量整理文件格式),可以利用Word的圖形界面設置好自定義樣式,然後利用python-docx操作樣式管理器,給特定的對象特定的樣式。
  2. 當你的操作涉及Word之外的東西,而且對樣式設置的要求不高(例如,HTML轉Word,或者格式比較簡單的文檔,例如公文),可以使用python-docx直接設置樣式。
  3. 如果你既不能用Word設置自定義樣式(例如需要幾百種樣式類型),又對樣式類型的設置要求很高,則不要用python-docx,考慮VBScript/VBA,或者win32com等功能完備的工具。

1. 創建樣式和設置字體

遊程對象、段落對象和表格對象都有一個成員Style,而這個Style有一個成員Font,包含了字體的所有設置。

如果憑空的創建一個Style,要使用Document對象的Styles集合的add_style方法。下面的例子里添加了10個段落,為每個段落創建一個新的Style。這些Style的區別是字型大小依次增加。

# -*- coding: utf-8 -*-nfrom docx import Documentnfrom docx.shared import Ptnfrom docx.enum.style import WD_STYLE_TYPEnndoc = Document()nfor i in range(10):n p = doc.add_paragraph(u段落 %d % i)n style = doc.styles.add_style(UserStyle%d %i,WD_STYLE_TYPE.PARAGRAPH)n style.font.size = Pt(i+20)n p.style = stylen ndoc.save(4-1.docx)n

注意到python-docx提供了docx.shared模塊,供以Pt(磅)為單位設置字體。類似的單位有Mm、Cm、Inches、Emu(物理尺寸)以及Twips(緹,微軟喜好的一種蜜汁尺寸)

對於遊程對象,其字體操作可以直接使用Run.font成員。下面給一個字體變化的一句話:

# -*- coding: utf-8 -*-nfrom docx import Documentnfrom docx.shared import RGBColornfrom docx.oxml.ns import qnnndoc = Document()np = doc.add_paragraph()ntext_str = u一個人的命運啊,當然要靠自我奮鬥,但是也要考慮到歷史的進程。nfor i,ch in enumerate(text_str):n run = p.add_run(ch)n font = run.fontn font.name = u微軟雅黑n # bug of python-docxn run._element.rPr.rFonts.set(qn(w:eastAsia), u微軟雅黑) n font.bold = (i % 2 == 0)n font.italic = (i % 3 == 0)n color = font.colorn color.rgb = RGBColor(i*10 % 200 + 55,i*20 % 200 + 55,i*30 % 200 + 55)n ndoc.save(4-2.docx)n

這裡使用了docx.shared模塊提供的RGBColor類。

2. 段落格式

對於段落樣式和表格樣式,有一個段落格式的成員paragraph_format。它相當於Word的這個選項:

相應的,段落格式對象的各種成員,相當於對話框里的這些設置要素:

  1. ParagraphFormat.alignment (選擇一個WD_PARAGRAPH_ALIGNMENT)

  2. ParagraphFormat.left_indent(長度)
  3. ParagraphFormat.right_indent(長度)
  4. ParagraphFormat.first_line_indent(長度)
  5. ParagraphFormat.space_before(長度)
  6. ParagraphFormat.space_after(長度)
  7. ParagraphFormat.line_spacing_rule(選擇一個WD_LINE_SPACING)
  8. ParagraphFormat.line_spacing(長度)
  9. ParagraphFormat.widow_control(True:設置,None:繼承Style設置)

  10. ParagraphFormat.keep_with_next(True:設置,None:繼承Style設置)
  11. ParagraphFormat.keep_together(True:設置,None:繼承Style設置)
  12. ParagraphFormat.page_break_before(True:設置,None:繼承Style設置)

比如可以這樣設置遞進的左對齊:

# -*- coding: utf-8 -*-nfrom docx import Documentnfrom docx.shared import Cmnfrom docx.enum.style import WD_STYLE_TYPEnndoc = Document()nfor i in range(10):n p = doc.add_paragraph(u段落 %d % i)n style = doc.styles.add_style(UserStyle%d %i,WD_STYLE_TYPE.PARAGRAPH)n style.paragraph_format.left_indent = Cm(i)n p.style = stylen ndoc.save(4-3.docx)n

3. 樣式管理器

Word自帶很多樣式。可以利用Document.styles集合來進行訪問builtin屬性為True的自帶樣式。當然,你自己通過add_style增加的樣式,也會放在styles集合里。

對於你自己創建的樣式,若將其hidden和quick_style屬性分別設置為False和True,則可將這個自創建樣式添加到Word的快速樣式管理器里。

下面舉一個綜合的例子。

# -*- coding: utf-8 -*-nfrom docx import Documentnfrom docx.shared import Cmnfrom docx.enum.style import WD_STYLE_TYPEnndoc = Document()nfor i in range(10):n p = doc.add_paragraph(u段落 %d % i)n style = doc.styles.add_style(UserStyle%d %i,WD_STYLE_TYPE.PARAGRAPH)n style.paragraph_format.left_indent = Cm(i)n p.style = stylen if i == 7:n style.hidden = Falsen style.quick_style = Truennfor style in doc.styles:n print style.name,style.builtinn ndoc.paragraphs[3].style = doc.styles[Subtitle]nndoc.save(4-4.docx)n

注意樣式面板的第二個快速樣式就是我們剛剛添加的『UserStyle7』

=======================

到此,這一系列的Word部分就告一段落了。接下來,本系列文章將聊一聊用python操作PowerPoint。

參考:

python-docx.readthedocs.io


推薦閱讀:

隨機數生成
[新聞] CPython / 微軟 Pyjion / IBM Python+OMR
國內最火的11個Python開源項目
Python 中 「is」 和 「==」 的問題?
量化策略系列教程:12Boll指標策略

TAG:Python | MicrosoftOffice |