Python办公自动化【Word】
在Python中,可以使用 python-docx 庫來自動化操作 Word文檔,首先需要通過 pip3 安裝該庫:
pip3 install python-docx為了避免歧義,接下來文章中Word 表示Word軟件本身,Word文檔表示Word 軟件中的文檔。
1.1 讀寫 Word 文檔
與 Excel 工作簿類似,Word 文檔也有兩種不同的文件格式,分別是2003版或更早之前的版本使用的 *.doc 文件格式,以及 2007 版及之后的版本使用的 *.docx文件格式。*.docx文件格式基于XML (可擴展標記語言),在相同數量下,占用空間更小,兼容性更高。
python-docx 只支持操作 *.docx 文件格式的Word文檔,雖然Word 有 *.doc與 *.docx兩種文件格式,但目前使用的 Word 文檔絕大多數是 *.docx 文件格式的。
如果遇到 *.doc 文件格式的Word文檔,可以將其中的內容復制,粘貼到 *.docx文件格式的新文件中,再進行處理。
首先介紹如何通過 python-docx 創建一個新的空白的 Word文檔:
from docx import Document# 創建文檔對象 document = Document() # 保存文檔對象 擴展名只可以使用*.docx document.save("new.docx")用 Document 方法創建文檔對象,該文檔對象對應著一個Word 文檔;最后調用 save 方法傳入具體的路徑,將文檔對象保存到本地。需要注意的是,在保存 Word 文檔時,其擴展名必須使用 *.docx.
1.2 *.doc 文件格式轉換為 *.docx 文件格式
如果希望將大量的 *.doc 文件格式的Word 文檔轉換為 *.docx文件格式,可以使用 pypiwin32 第三方庫,該庫可以調用 Windows 操作系統中的方法實現 對 Word 文檔的操作,但該庫只可在 Windows 操作系統中安裝與使用。
首先通過 pip3 安裝 pypiwin32:
pip3 install pypiwin32安裝完成后,通過 win32com 使用 pypiwin32 第三方庫,實現將 Word文檔的文件格式由 *.doc 轉換為 *.docx。
from win32com import client# *.doc 文件格式的Word文檔的路徑 doc_path = 'exist.doc' docx_path = 'new_exist.docx'# 獲取Word 應用程序對象 Word = client.Dispatch('Word.Application') # 打開對應的 Word文檔 doc = Word.Documents.Open(doc_path) # 另存為 *.docx 文件格式,參數 12 表示 *.docx 文件格式 doc.SaveAs(docx_path, 12) # 關閉原來的 Word文檔 doc.Close() # 退出Word 軟件 Word.Quit()上述代碼只演示了如何將一個Word 文檔的 *.doc文件格式轉為 *.docx 文件格式,如果需要將大量的 *.doc文件格式的Word 文檔進行格式轉換,使用 Python中的循環(while語句或者 for語句)即可。
1.3 讀取Word 文檔中的段落
Word 文檔中存在段落、圖片、表格等多種不同類型的數據,本節介紹如何讀取 Word 文檔中的段落數據。
from docx import Document# 獲取文檔 doc = Document("exist.docx") # 遍歷Word文檔中的段落 for p in doc.paragraphs:# 輸出word文檔中的段落內容print(p.text)簡單而言,我們只需要明確如下概念即可:
- 利用 Document 方法獲取 Word 文檔對象。
- Paragraph 對象表示 Word 文檔中的段落對象。
- Paragraph 對象中的 text 對象表示段落中具體的文本內容。
1.4 讀取 Word 文檔中的表格
讀取 Word 中的表格數據,可以通過 python-docx 提供的 tables 屬性讀取,代碼如下:
rom docx import Document# 獲取文檔 doc = Document("table.docx") # 獲取 Word 文檔中的所有表格 tables = doc.tables # 選擇第一個表格 table = tables[0] values = []# 遍歷表格的每一行 for row in table.rows:# 遍歷每一行中的單元格for cell in row.cells:# 將單元格中的數據添加到list中values.append(cell.text)value = ' '.join(values)print(value)values = []有時需要對比兩個非常相似的表格以找到不同之處,此時怎么做呢?要解決這個問題,可以先將兩個 Word 文檔中的表格內容讀入二維列表中,然后對列表中的內容進行比對,最終找到兩個表格不同之處所對應的行號和列號。
使用 deepdiff第三方庫,該庫可以高效地比較不同對象的內容,并返回差異的內容,以及差異的位置。首先通過 pip安裝 deepdiff 第三方庫:
pip install deepdiff安裝完成之后,編寫比較兩個表格分的代碼:
from docx import Document from deepdiff import DeepDiffdef get_doc_values(path):# 獲取表格中的內容 返回二維數組doc = Document(path)tables = doc.tablestable = tables[0]all_values = []for row in table.rows:values = []for cell in row.cells:# 將表格中單元格的值添加到values列表中values.append(cell.text)all_values.append(values)return all_valuestable1 = get_doc_values("table.docx") table2 = get_doc_values("table_modify.docx")# 比較列表差異 ddiff = DeepDiff(table1, table2) print(ddiff)# 輸出 ''' {'values_changed': {'root[2][1]': {'new_value': '1973', 'old_value': '1972'}, 'root[3][0]': {'new_value': 'JVAA', 'old_value': 'JAVA'}, 'root[3][1]': {'new_value': '1996', 'old_value': '1995'}}} '''1.5 將文字寫入Word文檔
寫入文字類型數據開始,python-docx 提供了 add_paragrraph 方法將文字類型數據以段落形式添加到 Word 文檔中,代碼如下:
from docx import Document# 寫入文檔 doc = Document() # 添加標題 doc.add_heading("一級標題", level=1) # 添加段落 p2 = doc.add_paragraph("第二個段落") # 將新段落添加到已經有的段落之前 p1 = p2.insert_paragraph_before("第一個段落")p3 = doc.add_paragraph("新段落") # 追加內容 p3.add_run("加粗").bold = True p3.add_run("以及") p3.add_run("斜體").italic = Truedoc.save("new_doc.docx")1.6 將圖片寫入 Word文檔
python-dock 提供了 add_picture 方法將圖片添加到Word文檔中:
from docx import Document from docx.shared import Inchesdoc = Document() # 添加圖片 doc.add_picture("1.jpg", width=Inches(1.25)) doc.save("new_pic.docx")通過 width 或 height 參數設置插入Word文檔中的圖片大小,并通過 Inches 類來指定具體的大小,該類的度量單位是英寸。
1.7 將表格寫入Word中
首先,python-docx 提供了 add_table 方法來創建空表格,此外,通過 style 屬性還可以設置表格樣式:
from docx import Documentdoc = Document() # 創建table table = doc.add_table(rows=3, cols=4) # 設置table樣式 table.style = "Table Grid"# 第一種方法 先獲取行 再獲取該行中對應的單元格 row = table.rows[0] row.cells[0].text = "第一行第一列"# 第二種方法 直接指行號和列號 cell = table.cell(0, 1) cell.text = "第一行第一列"doc.save('new3.docx')如果將圖片添加到表格中,將如何實現?
追加添加,代碼如下:
1.8 插入有序列表與無序列表
有序列表與無序列表都可以通過 add_paragraph 方法插入Word文檔中,它們需要通過 style 參數設置其樣式:
from docx import Documentdoc = Document() # 有序列表 style = "List Number" doc.add_paragraph("有序列表1", style=style) doc.add_paragraph("有序列表2", style=style) doc.add_paragraph("有序列表3", style=style)# 無序列表 style = "List Bullet" doc.add_paragraph("無序列表1", style=style) doc.add_paragraph("無序列表2", style=style) doc.add_paragraph("無序列表3", style=style)doc.save("doc_list.docx")修改Word 文檔樣式
2.1 文本格式
想要通過python-docx 控制Word文檔樣式,首先需要理解文本格式與樣式的概念,這里先討論文本格式:
python-docx 將文本格式分為塊對象與內聯對象兩種。
1 塊對象
塊對象一般包括標題、段落、圖片、表格、有序列表與無序列表。塊對象的屬性指定了塊對象所在的位置,如縮進、段落之間的段間距等,常用的屬性有 alignment(對齊方式)、index(縮進)、pace(行間距)等:
from docx import Document from docx.enum.text import WD_ALIGN_PARAGRAPH# 修改word文檔樣式 doc = Document()p1 = doc.add_paragraph("水平居中對齊") # 設置段落水平居中對齊 p1.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTERp2 = doc.add_paragraph("左對齊") # 設置段落左對齊 p2.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFTp3 = doc.add_paragraph("右對齊") # 設置段落右對齊 p3.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.RIGHTdoc.save('new.docx')2 內聯對象
塊對象的所有內容都包括在內聯對象中,一個塊對象由一個或多個內聯對象組成。內聯對象一般包括文字、句子、段落等,通常通過內聯對象的相關屬相來指定字體的樣式,如粗體、斜體、大小等:
from docx import Document from docx.shared import Ptp4 = doc.add_paragraph() run = p4.add_run("內聯對象") font = run.font # 設置字體大小 font.size = Pt(35) # 設置字體為斜體 font.italic = Truedoc.save('new.docx')2.2 Word 文檔樣式
Word 文檔中常見的樣式有段落樣式、字符樣式、表格樣式等,python-docx 庫樣式定義在 styles 屬性中,但它并不包含 Word 中所有的樣式。
下面簡單使用 python-docx 的styles 屬性定義樣式:
將 python-docx 庫中支持的所有表格樣式輸出:
from docx import Document from docx.enum.style import *# 輸出所有表格的樣式 doc = Document() styles = doc.styles for style in styles:# 過濾表格樣式if style.type == WD_STYLE_TYPE.TABLE:# 輸出當前樣式的樣式名doc.add_paragraph(f"表格樣式名稱: {style.name}")# 創建表格并指定為當前樣式table = doc.add_table(3, 3, style=style)# 將內容添加到第一行cells = table.rows[0].cellscells[0].text = "第一列內容"cells[1].text = "第二列內容"cells[2].text = "第三列內容"doc.add_paragraph("\n")doc.save("doc_all_style_list.docx")使用 Word 模板
Word 模板指包括固定格式設置和版式設置的 Word文件,通過模板文件,可以快速生成美觀的Word 文檔,而不再需要重新設置各種樣式的參數。
3.1 創建 Word 模板文件
對于不同的使用情景,Word 默認提供的各種模板文件并不能滿足所有要求,此時可以自行創建一個符合自身需求的模板文件
下面創建一個入職證明Word模板,它用于證明新員工成功入職,其創建過程主要分為如下幾步:
(1)創建一個普通的空白 Word 文檔,在 Word 文檔中輸入相應的內容:
(2)選中 Word文檔中的部分內容,如圖,選中“同志”一詞前的下劃線“_”,然后在“插入” 選項卡中創建一個域,WPS與Word都具有該功能。
(3)在“域”對話框的 “域名”列表框中選擇“MergeField”,然后在“域名”文本框中輸入對應的名稱,最后單擊“確定”
(4)至此,帶有“《》”符號的域在Word模板中創建成功
3.2 使用Word 模板文件
使用域創建自定義 Word 模板的目的就是讓程序來填充內容,通過 docx-mailmerge 第三方庫將數據填充到 Word 模板文件中,不過在使用前,需要先安裝 docx-mailmerge 庫:
pip3 install docx-mailmergedocx-mailmerge 庫在安裝完成后即可使用:
from mailmerge import MailMergetemplate = "doc_templates.docx"doc = MailMerge(template)# 將內容添加到Word模板文件中 參數名與Word模板中的域名相同 doc.merge(name="二兩",id="111222333",year="2021",month="8",day="30" )doc.write("doc_templates_new.docx")3.3 快速生成千份勞動合同
有一個Excel 表格,其中記錄了1000 位求職者的姓名,現在需要為每位求職者生成相應的合同,并將合同中乙方的名字填寫為求職者的姓名,該工作如何完成呢?
回顧前面的知識,不難想到,第一步當然是將合同文件轉為Word模板文件,將要填寫的信息的位置轉為域。注意域只能使用英文名。用戶可以根據自身的需求為不同的域設置不同的樣式:
import pandas as pd from mailmerge import MailMerge# 讀取求職者基本信息Excel表 job_seekers = pd.read_excel('求職者.xlsx') template = '合同.docx' doc = MailMerge(template)# 將數據填寫到Word中 def merge(name):doc.merge(owner = '二兩', # 甲方party_b = name, # 乙方,求職者姓名# 合同年月日year = '2022',month = '7',day = '29')doc.write(f'合同/{name}_合同.dock')# 循環遍歷求職者姓名 for i, name in job_seekers['name'].items():merge(name) print('done!')自動生成數據分析報告
4.1 處理Excel 數據
學生成績數據如圖所示,數據分析報告需要給出分數排在第一位的學生姓名及分數,此外還需要通過表格與柱狀圖展示出學生分數的排列情況。
首先生成學生成績從大到小排序的柱狀圖:
柱狀圖繪制完成后,接著獲取分數排在第一位的學生信息。因為在繪制柱狀圖時已經通過 sort_values 方法對數據進行了排序,所以直接獲取排在第一位的學生數據即可。
需要注意的是,用 sort_values 方法進行排序后的數據的下標并沒有改變,此時直接通過下標獲取的仍是原本排在第一位的數據,但是這并不是我們需要的。此時要么通過絕對位置獲取數據,要么重新排序數據的下標,再通過下標獲取數據:
4.2 生成美觀的數據分析報告
使用 python-docx 庫來生成數據分析報告:
# 生成word文檔 doc = Document() doc.add_heading("數據分析報告", level=0) # 絕對定位 獲取分數排在第一位的學生信息 first_student = students.iloc[0, :]["Name"] first_score = students.iloc[0, :]["Score"]p = doc.add_paragraph("分數排在第一位的學生是: ") # 設置為粗體 p.add_run(str(first_student)).bold = True p.add_run(', 分數為 ') p.add_run(str(first_score)).bold = Truep1 = doc.add_paragraph(f"總共有 {len(students['Name'])} 名學生參加了考試 學生考試總體情況為 ")# 添加表格 table = doc.add_table(rows=len(students["Name"]) + 1, cols=2)# 設置表格樣式 table.style = "LightShading-Accent1" table.cell(0, 0).text = "學生姓名" table.cell(0, 1).text = "學生分數"# 添加數據到表中 for i, (index, row) in enumerate(students.iterrows()):table.cell(i + 1, 0).text = str(row["Name"])table.cell(i + 1, 1).text = str(row["Score"])# 添加圖片 doc.add_picture("student_score.png") doc.save("student_score_analyze.docx") print("Done!")總結
以上是生活随笔為你收集整理的Python办公自动化【Word】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用证业务总结
- 下一篇: vs 2005 sp1 安装失败的解决方