Word 神器 python-docx

2021-02-20 Python技術

前兩天有個朋友向我求助,她在寫畢業論文時,不小心將論文裡的中文雙引號替換為英文的了,各種原因導致無法回退,8萬多字的論文,眼看就要交了,該怎麼辦?

首先想到 word 自身的替換功能,倒是能查到,但是沒法動態替換,即只替換兩邊引號,而不換中間內容;

另外一種方案是,即用 VBA,通過編程來替換,雖說做過幾個項目,可好久不用,拾起費勁,再加上 VBA 中各種概念和用法,學習成本太高,放棄;

還有一種方案,即用 Python 操作 word,首先對 Python 更熟悉,另外一定有別人造好的輪子。果然,沒用多久找到了 python-docx Python 庫,文檔齊全,功能強大,用來解決替換問題不在話下。

開始之前,先簡單了解下 python-docx

python-docx 介紹

python-docx 是用於創建可修改 微軟 Word 的一個 python 庫,提供全套的 Word 操作,是最常用的 Word 工具

概念

使用前,先了解幾個概念:

Document:是一個 Word 文檔 對象,不同於 VBA 中 Worksheet 的概念,Document 是獨立的,打開不同的 Word 文檔,就會有不同的 Document 對象,相互之間沒有影響Paragraph:是段落,一個 Word 文檔由多個段落組成,當在文檔中輸入一個回車鍵,就會成為新的段落,輸入 shift + 回車,不會分段Run 表示一個節段,每個段落由多個 節段 組成,一個段落中具有相同樣式的連續文本,組成一個節段,所以一個 段落 對象有個 Run 列表

例如有一個 Word,內容是:

word 文檔內容

則 結構這樣劃分:

第二個 段落(paragraph),沒有內容,所以 節段(run)為空

安裝

可以用 pip 來安裝:

命令行中運行下面語句,如果沒有報錯,則說明安裝成功

$ python -c 'import docx'

小試牛刀

python-docx 安裝後,測試一下:

from docx import Document
document = Document()paragraph = document.add_paragraph('Lorem ipsum dolor sit amet.')prior_paragraph = paragraph.insert_paragraph_before('Lorem ipsum')
document.save(r"D:\test.docx")

再在這個段落(paragraph)前插入另一個段落最後調用文檔對象 document 的 save 保存文檔

用 Word 打開保存的 test.docx 就可以看到:

問題分析與解決

了解了 python-docx 的基本概念,開始著手解決問題,大體思路是:

將找到的內容的 英文引號 換成 中文引號,並將內容替換回去查找目標

首先要解決的是如何找到 英文引號之間的內容?

例如文檔內容有這麼一段:

...對"基於需求的教育資源配置系統觀"的研究,尤其是對"以學習者為中心"和從"個性化學習"、"精準教學"視角出發的教育資源配置問題提供了理論"支持\\以及"方向指導...

對於英文引號來說不區分前引號和後引號,怎麼能保證配置到的不會是 "和從"、"、" 以及 "以學習者為中心"和從"個性化學習"、"精準教學" 或者 不會忽略兩個引號出現在上下行的情況?

重溫正則表達式,終於得到如下表達式:

?::為了取消圓括號模式配置過程的緩存,即不需要遇到一個符合的就結束匹配[^"]:表示匹配的內容不能是 ",以避免貪婪匹配,即避免匹配成 從第一個 " 開始一直到最後一個 "結束整體的意思是 配置兩個 " 之間的內容,且內容中不包括 "

後來整理過程中,還發現另一種寫法:

不過 . 不能匹配換行符\n,堅持要用,需要使用 可選修飾符 re.S:

import repattern = re.compile('".*?"', re.S)
re.findAll(pattern, text) # text 為待查找字符串

re.S 為可選標識修飾符,使 . 匹配包括換行在內的所有字符

關於 Python 正在表達式的更多用法參考文後參考連結

實現

查找問題解決了,做替換就方便多了:

from docx import Documentimport re
doc = Document(r"D:\論文.docx")restr = '"(?:[^"])*"'
for p in doc.paragraphs: matchRet = re.findall(restr, p.text) for r in matchRet: p.text = p.text.replace(r, '「' + r[1:-1] + '」')doc.save(r'D:\論文_修正.docx')

打開目標文檔,字符串前的 r 表示取消字符串轉義,即按原始字符產來解釋循環文檔的 段落(paragraph),對每個段落,用正則表達式進行匹配循環對於匹配到的結果,將前後引號,換成中文引號,並替換 段落(paragraph)的 text;其中 r[1:-1] 表示截取從第二個位置(第一個位置是 0)到倒數第二個位置截取字符串,剛好去掉前後引號

注意:python-docx 保存文檔時不會給出任何提示,會瞬間完成,所以另存是個穩妥的做法

完工,趕緊將替換好的文檔發過去……

還沒來得回味,她說:「非常感謝!那個~ 能不能再幫我生成個圖表目錄,這個必須要……」

好吧,能者多勞(神器在手),幹就完了……

強大的 python-docx

在上面小試牛刀中,介紹了插入段落(paragraph)的用法,下面在介紹一些 python-docx 的其他功能

為了簡潔,下面例子中省略了 Document 類的引入和實例化代碼,document 為 Document 的實例

添加標題

默認情況下添加的標題是最高一級的,即一級標題,通過參數 level 設定,範圍是 1 ~ 9,也有 0 級別,表示的是段落標題:

# 添加一級標題document.add_heading('我是一級標題')
decument.add_heading('我是二級標題', level=2)
decument.add_heading('我是段落標題', level=0)

添加換頁

如果一個段落不滿一頁,需要分頁時,可以插入一個分頁符,直接調用會將分頁符插入到最後一個段落之後:

# 文檔最後插入分頁document.add_page_break()
# 特定段落分頁from docx.enum.text import WD_BREAKparagraph = document.add_paragraph("獨佔一頁") # 添加一個段落paragraph.runs[-1].add_break(WD_BREAK.PAGE) # 在段落的最後一個節段後添加分頁

表格操作

Word 文檔中經常會用到表格,python-docx 如何添加和操作表格呢?

# 添加一個 2×2 表格table = document.add_table(rows=2, cols=2)
# 獲取第一行第二列單元格cell = table.cell(0, 1)
# 設置單元格文本cell.text = '我是單元格文字'
# 表格的行row = table.rows[1]row.cells[0].text = 'Foo bar to you.'row.cells[1].text = 'And a hearty foo bar to you too sir!'
# 增加行row = table.add_row()

更複雜點的例子:

# 表格數據items = (    (7, '1024', '手機'),    (3, '2042', '筆記本'),    (1, '1288', '臺式機'),)
# 添加一個表格table = document.add_table(1, 3)
# 設置表格標題heading_cells = table.rows[0].cellsheading_cells[0].text = '數量'heading_cells[1].text = '編碼'heading_cells[2].text = '描述'
# 將數據填入表格for item in items: cells = table.add_row().cells cells[0].text = str(item[0]) cells[1].text = item[1] cells[2].text = item[2]

添加圖片

添加圖片,即,為 Word 裡 菜單中 插入 > 圖片 插入的功能,插入圖片為原始大小:

document.add_picture('image-filename.png')

插入時設置圖片大小:

from docx.shared import Cm# 設置圖片的跨度為 10 釐米document.add_picture('image-filename.png', width=Cm(10))

除了釐米,python-docx 還提供了 英寸(Inches),如設置 1英寸: Inches(1.0)

樣式

樣式可以針對整體文檔(document)、段落(paragraph)、節段(run),月具體,樣式優先級越高

python-docx 樣式功能配置多樣,功能豐富,這裡對段落樣式和文字樣式做簡單介紹

段落樣式

段落樣式包括:對齊、列表樣式、行間距、縮進、背景色等,可以在添加段落時設定,也可以在添加之後設置:

# 添加一個段落,設置為無序列表樣式document.add_paragraph('我是個無序列表段落', style='List Bullet')
# 添加段落後,通過 style 屬性設置樣式paragraph = document.add_paragraph('我也是個無序列表段落')paragraph.style = 'List Bullet'

文字樣式

在前面 python-docx 文檔結構圖可以看到,段落中,不同樣式的內容,被劃分成多個 節段(Run),文字樣式是通過 節段(Run)來設置的

設置加粗/斜體
paragraph = document.add_paragraph('添加一個段落')# 設置 節段文字為加粗run = paragraph.add_run('添加一個節段')run.bold = True
# 設置 節段文字為斜體run = paragraph.add_run('我是斜體的')run.italic = True

設置字體

設置字體稍微複雜些,例如設置一段文字為 宋體:

paragraph = document.add_paragraph('我的字體是 宋體')run = paragraph.runs[0]run.font.name = '宋體'run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋體')

總結

python-docx 是個功能強大的 Word 庫,能實現幾乎所有在 Word 中操作,今天通過一個實例,介紹了 python-docx 的一些基本用法,限於篇幅,沒法展開討論更多內容,如果有興趣可以深入研究,說不定可以讓 Word 像 Markdown 一樣簡單。

參考

https://python-docx.readthedocs.io/en/latest/

https://www.runoob.com/python/python-reg-expressions.html

https://www.cnblogs.com/nixindecat/p/12157623.html

相關焦點

  • 【Python基礎】python使用python-docx操作word
    1、python-docx庫介紹該模塊兒可以創建、修改Word(.docx)文件;python-docx使用官網:python-docx官網我們在安裝此模塊兒使用的是pip install python-docx,但是在導入的時候是import docx;2、Python讀取Word文檔內容注意:每進行一個操作,必須保存一下,否則等於白做;1)word文檔結構介紹在這裡插入圖片描述2)python-docx
  • Python Word處理文檔:python-docx
    關注+星標,每天學習Python新技能python-docx 是用於創建可修改微軟 Word(.docx) 的一個 Python 庫。
  • 實例15:用Python批量轉換doc文件為docx文件
    python-docx模塊雖然強大,但卻不能處理後綴為".doc"的word文件。如果強制讀取doc文件,將會報如下錯誤。
  • 第105天: Python 操作 Word
    安裝 python-docx處理 Word 需要用到 python-docx 庫,目前版本為 0.8.10 ,執行如下安裝命令:$ pip3 install python-docx################# 運行結果 ################Collecting python-docx
  • python-docx設置中文字體
    在python-docx包中對WORD文檔字體的設置要使用font類,只需要更改font.name屬性就可以了。然而,對於中文字體的設置遠不是這麼簡單。import Document # 導入docx包from docx.oxml.ns import qndocument.styles['Normal'].font.name = u'宋體'document.styles['Normal'].
  • 慢步python,教你怎麼通過python編程來修改word文檔內標題
    大家好,這裡是地鐵慢步,快慢的慢,因為筆者業餘學的python編程,學得的確也算是慢,慢不打緊,一直在進步就好。今天想教大家怎麼實現通過python編程來修改word文檔。熟悉word的人,可能會覺得多此一舉,直接用OFFICE或者WPS就可以了啊,幹嘛要用python?
  • 使用 Python 操作 word文檔
    最近手頭有一個需求是對word文檔內容進行判斷,搜索到一個包感覺不錯,簡單記錄一下關鍵操作:python-docx能做什麼
  • python辦公自動化(二) | 讀取.txt、.data、.doc和.docx文檔的部分內容
    但是,.doc格式比較老,python中沒有庫讀寫.doc,所以就需要一個系統工具的庫(這裡是win32com)來打開word應用,將.doc轉存為另存為.docx,再使用python-docx進行讀寫,以完成自動化操作。首先,導入必要的庫。
  • python批量生成合同
    自動化批量操作的這種神器. - openpyxl模塊--用於操作excel文檔 - python-docx模塊--用於操作word文檔install python-docx中設置替換關鍵字 首先得在word中指定需要替換的某些關鍵字,並加以特殊標註,如''【合同編號】'',加上括號以便程序識別和區分   2. excel中設置表頭與word中的關鍵字一一對應 excel中必須設置與合同文檔相對應的需要替換的列表名
  • python-docx無法處理 「doc格式」 文件,於是我這樣做......
    對於Word文件,出現doc和docx的混合文件,又該怎麼處理。你可能會用VBA,但是不得不說,批量操作這些文件,還是要學Python,操作真的很簡單。為了增強文章的可讀性,我們分2篇文章講述這些問題。今天,我們講述的是如何將doc文件 轉換為 docx文件。
  • python-docx段落設置
    滑鼠右鍵段落菜單段落設置界面在python-docx01段落的對齊方式在python-docx包中對WORD文檔段落對齊方式的設置主要用到了paragraph. alignmen分別對應於了python-docx包docx.text.parfmt.ParagraphFormat中的left_indent、right_indent和first_line_indent屬性。
  • Python辦公自動化 | 批量word報告生成工具
    有時候我們需要按照某種規則生成一種固定模板的word報告,python能夠很好的完成這項工作。
  • python-docx字體設置
    滑鼠右鍵菜單字體按鈕字體設置界面而在python-docxpython-docx設置中文字體。02字形在docx文檔字形可以包括常規、加粗、斜體和加粗斜體四種類型,在python-docx包中主要通過font.bold
  • 從PPT到Word,用Python輕鬆實現辦公自動化
    Excel,也講過如何將多個 Excel 表格匯總至 Word,今天繼續講解如何將文字從 PPT 中提取出來並寫入 Word,主要將涉及如何使用 python-pptx 和 python-docx 交互操作 word 和 ppt 文件!
  • 手把手教你使用python的zipfile模塊巧解word批量生成問題
    回復「書籍」即可獲贈Python從入門到進階共10本電子書大家好,我是宿者朽命,微信名是【🌑(這是月亮的背面)】,今天給大家分享使用python的zipfile模塊巧解word批量生成問題,這裡提供兩種方案給大家參考。
  • 萬字教程:Python Word 文檔自動化
    python -m pip install -U pip setuptoolspython-docx(我們大部分操作都是使用此庫)from docx import Documentfrom docx.shared import Incheshttps://python-docx.readthedocs.io/en
  • python 實用程序 | PDF 轉 Word
    於是乎我就想到了利用 python 來寫個程序,把 pdf 轉成 word 文檔。秉承著不要重複造輪子的想法,我首先在網上搜索了下。果然已經有人寫好了,我們直接拿來用就行。import PDFResourceManagerfrom pdfminer.pdfinterp import process_pdffrom pdfminer.converter import TextConverterfrom pdfminer.layout import LAParamsfrom docx
  • 用Python讀寫Word文檔入門
    寫入Word文檔這裡我們用到的是python-docx模塊,讀寫Word文檔的操作均有它完成!# 安裝該模塊,在命令行鍵入以下命令pip install python-docx在進行後續介紹前,我們先簡單了解一下Word文檔。
  • Python自動化辦公之Word,全網最全看這一篇就夠了
    環境安裝 使用Python操作word大部分情況都是寫操作,也有少許情況會用到讀操作,在本次教程中都會進行講解,本次課程主要用到以下4個庫,請大家提前安裝。 很多人學習python,不知道從何學起。
  • python自動化辦公:玩轉word之樣式秘笈
    上節對python如何定製word的頁眉頁腳做了詳細介紹,當然,要作出一篇精彩的word文檔,樣式公布可沒,本章繼續介紹python如何玩轉word的樣式。使用樣式python如何玩轉word的樣式此頁面使用前一頁中開發的概念而不作介紹。如果術語不熟悉,請參閱word的樣式參考。