日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python办公自动化【Word】

發布時間:2023/12/14 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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')

如果將圖片添加到表格中,將如何實現?
追加添加,代碼如下:

# 獲取表格中的單元格對象 cell = table.cell(1, 0) # 獲取單元格中的段落對象 p = cell.paragraphs[0] # 獲取追加對象 run = p.add_run() run.add_picture("1.jpg", width=Inches(1.25))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 屬性定義樣式:

from docx import * from docx.shared import Pt# 獲取python-docx支持的所有樣式 styles = doc.styles # 選取style并設置style中的段落格式 style = styles["Heading 1"] p_format = style.paragraph_format # 設置左縮進 p_format.left_indent = Pt(25) # 使用樣式 p = doc.add_paragraph("使用style設置段落樣式", style=style)doc.save("doc_style.docx")

將 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-mailmerge

docx-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 數據

學生成績數據如圖所示,數據分析報告需要給出分數排在第一位的學生姓名及分數,此外還需要通過表格與柱狀圖展示出學生分數的排列情況。

首先生成學生成績從大到小排序的柱狀圖:

import pandas as pd import matplotlib.pyplot as plt# 自動生成數據分析報告 students = pd.read_excel("student_score.xlsx") # 就地排序 students.sort_values(by='Score', inplace=True, ascending=False) # 繪制柱狀圖 plt.bar(students["Name"], students["Score"], color="orange")plt.title("Student Score", fontsize=16) plt.xlabel("Name") plt.ylabel("Score")# 重鋪x軸標簽 plt.xticks(students.Name, rotation='90') # 緊湊型布局 plt.tight_layout() # 保存圖片 plt.savefig("student_score.png")


柱狀圖繪制完成后,接著獲取分數排在第一位的學生信息。因為在繪制柱狀圖時已經通過 sort_values 方法對數據進行了排序,所以直接獲取排在第一位的學生數據即可。
需要注意的是,用 sort_values 方法進行排序后的數據的下標并沒有改變,此時直接通過下標獲取的仍是原本排在第一位的數據,但是這并不是我們需要的。此時要么通過絕對位置獲取數據,要么重新排序數據的下標,再通過下標獲取數據:

# 數據雖然被排序 但數據下標并沒有改變 直接通過下標獲取的依舊是原本的數據 print("原始下標: ", students["Name"][0])# 方法一 通過iloc方法獲取絕對的位置 print("絕對位置: ", students.iloc[0, :]["Name"]) # 方法二 對下標重新排序再取其中第一位 students.reset_index(drop=True, inplace=True) print("重新排序后的下標 ", students["Name"][0])

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】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。