用python解析word文件(一):paragraph

太長了,我決定仍是拆開三篇寫。
 
(一)段落篇(paragraph)(本篇)

(二)表格篇(table)html

(三)樣式篇(style)前端

選你所需便可。下面開始正文。python

 


 

最近公司的項目,須要在頁面上顯示word文件的內容。我找了幾個前端寫法,都沒用明白(由於我前端太渣),用起來簡單的要麼收費,要麼加了水印。那怎麼辦捏?數組

唉,仍是按毛主席說的,本身動手,豐衣足食吧!

 

感謝徒弟給打下的基礎,我不用挨個碰壁,直接就選擇了python-docx這個庫。 固然,它也只能解析docx文件,解析不了doc文件。安裝方式直接pip就能夠。下面咱們就正式開始解析的過程。
 
在word中的一個天然段,就是一個paragraph,用最簡單的方式
docx.paragraphs

就能夠得到所有的段落。這是一個可迭代的類型,相似於數組若是咱們用app

p=docx.paragraphs[0]

就能夠直接得到文章中的第一段,而接下來框架

p.text

就是第一段的所有文字內容。若是咱們連貫起來寫,代碼應該是醬嬸滴:spa

for p in docx.paragraphs:
    print(p.text)

怎麼樣,是否是很方便?設計

不過,這樣僅僅是得到了文字內容,而把格式全丟了。我說的格式,是加粗,顏色,居中等等這些排版設計的東西。在paragraph中,這些東西叫作run。一個段落是由許多run組成的,就像這樣:
 
而得到run其實也是很是簡單的:
p.runs

便可。這一樣是個可迭代的類型,能夠循環得到每個run相關的內容,好比alignment(對齊方式),bold(加粗),italic(斜體),text(具體文本內容)等等。code

 
能夠用dir或help來查看具體的方法使用,內容有點多,我就不挨個介紹了。我只想吐槽一點,我也不知道word中這一堆run是如何來區分的。好比上面的截圖,中英文分開不一樣的run我能夠理解,可是前面那些run彷佛沒有什麼道理。也許跟word的中文分詞方式有關?
 
可是,若是設置了不一樣的樣式,那麼確定會分紅不一樣的run的。
 
經過查方法不難看出,python-docx這個包,不只能夠讀出paragraph的內容,還能夠往裏面寫。可使用add_paragraph()方法來添加內容。大概這樣:
doc.add_paragraph(u'第一段',style=None) 
doc.add_paragraph(u'第二段',style='Heading 2')
p = doc.add_paragraph('')
p.add_run('第三段', style=None)
p.add_run('123', style="Heading 1 Char")
p.add_run('456')
p.add_run('789', style="Heading 2 Char")

而對於每個屬性,均可以查看它的類型,這個類型通常在docx中是個枚舉類型的常量,放在docx.enum.text這個頭文件中。使用方法能夠這樣:orm

if p.alignment == WD_PARAGRAPH_ALIGNMENT.CENTER:
    # todo

固然,我所作的這堆工做,目的其實不只僅是爲了得到文件內容,還要放在頁面上展現。有了上面的屬性,作起來就簡單多了。

html = "<p"
 
if title in self.paragraph.text and len(self.paragraph.text) < 15:
    html += " style=\"text-align: center; font-size: 30px\">"
elif self.paragraph.alignment == WD_PARAGRAPH_ALIGNMENT.CENTER:
    html += " style=\"text-align: center; font-size: 15px\">"
elif self.paragraph.alignment == WD_PARAGRAPH_ALIGNMENT.RIGHT:
    html += " style=\"text-align: right; font-size: 15px\">"
else:
    html += " style=\"font-size: 15px\">"
 
html += "%s</p>" % p

這樣實際上是用代碼活生生地生成了一段html。若是是用jinja模板的框架,能夠吧這段html直接經過view傳到頁面上,而後在頁面上使用

{{ paragraph|safe }}

來展現。

注意這裏的safe過濾器,這個是必須的,不然會尷尬地發現,html代碼不會轉義,會原樣輸出出來。
 
固然,還有更尷尬的。有一個問題我尚未解決,那就是列表,我找了很久都沒有找到自動編號的位置,甚至去讀了word生成的xml文檔——word能夠另存爲xml格式,也能夠在python-docx中經過
p.paragraph_format.element.xml
 
方法得到段落的xml——可是分析了半天,我都沒弄清楚段落的自動編號是如何生成的,留下了一個巨大的遺憾。
 
寫一篇就介紹到這裏吧,內容仍是相對簡單一些,由於paragraph仍是相對比較好取的。下一篇我將介紹一下table的解析。
相關文章
相關標籤/搜索