task3- python与word
學習內容:
python自動化之word操作
文章目錄
- 學習內容:
- python自動化之word操作
- 一、課前準備
- 二、知識要點
- 1.預熱:初步認識docx
- (1)新建空白word并插入文字
- 2. 正式:python自動化之word操作
- (1)整體頁面結構介紹
- (2)字體設置
- (3) 插入圖片與表格
- (4)設置頁眉頁腳
- (5)代碼延伸
- 三、項目實踐
- 一、需求
- 二、需求分析
- 三、代碼
- 四、總結
一、課前準備
python 處理 Word 需要用到 python-docx 庫,終端執行如下安裝命令:
pip3 install python-docx或在pycharm的setting操作安裝(示意如下):
二、知識要點
說明:
1.預熱:初步認識docx
相信同學們都進行過word的操作。話不多說,直接上python對word簡單操作的代碼,先有個直觀的感覺,然后再系統學習!
(1)新建空白word并插入文字
# 導入庫 from docx import Document# 新建空白文檔 doc_1 = Document()# 添加標題(0相當于文章的題目,默認級別是1,級別范圍為0-9) doc_1.add_heading('新建空白文檔標題,級別為0',level = 0) doc_1.add_heading('新建空白文檔標題,級別為1',level = 1) doc_1.add_heading('新建空白文檔標題,級別為2',level = 2)# 新增段落 paragraph_1 = doc_1.add_paragraph('這是第一段文字的開始\n請多多關照!') # 加粗 paragraph_1.add_run('加粗字體').bold = True paragraph_1.add_run('普通字體') # 斜體 paragraph_1.add_run('斜體字體').italic =True# 新段落(當前段落的下方) paragraph_2 = doc_1.add_paragraph('新起的第二段文字。')# 新段落(指定端的上方) prior_paragraph = paragraph_1.insert_paragraph_before('在第一段文字前插入的段落')# 添加分頁符(可以進行靈活的排版) doc_1.add_page_break() # 新段落(指定端的上方) paragraph_3 = doc_1.add_paragraph('這是第二頁第一段文字!')# 保存文件(當前目錄下) doc_1.save('doc_1.docx')2. 正式:python自動化之word操作
上節只是小試牛刀一下,接下來我們系統地學習python自動化之word操作。
在操作之前,我們需要了解 Word 文檔的頁面結構 :
- 文檔 - Document
- 段落 - Paragraph
- 文字塊 - Run
**python-docx將整個文章看做是一個Document**對象 ,其基本結構如下:
- 每個**Document包含許多個代表“段落”的Paragraph對象,存放在document.paragraphs**中。
- 每個**Paragraph都有許多個代表"行內元素"的Run對象,存放在paragraph.runs**中。
在**python-docx中,run是最基本的單位,每個run對象內的文本樣式都是一致的,也就是說,在從docx文件生成文檔對象時,python-docx**會根據樣式的變化來將文本切分為一個個的Run對象。
(1)整體頁面結構介紹
我們以一個小案例為主線把文檔,段落和文字塊串一下:
# 導入庫 from docx import Document from docx.shared import RGBColor, Pt,Inches,Cm from docx.enum.text import WD_PARAGRAPH_ALIGNMENT from docx.oxml.ns import qn# 新建文檔(Datawhale) doc_1 = Document()# 字體設置(全局) '''只更改font.name是不夠的,還需要調用._element.rPr.rFonts的set()方法。'''doc_1.styles['Normal'].font.name = u'宋體' doc_1.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋體')# 添加標題(0相當于文章的題目,默認級別是1,級別范圍為0-9,0時候自動帶下劃線) heading_1 = doc_1.add_heading('周杰倫',level = 0) heading_1.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中對齊,默認居左對齊# 新增段落 paragraph_1 = doc_1.add_paragraph() ''' 設置段落格式:首行縮進0.75cm,居左,段后距離1.0英寸,1.5倍行距。 ''' paragraph_1.paragraph_format.first_line_indent = Cm(0.75) paragraph_1.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT paragraph_1.paragraph_format.space_after = Inches(1.0) paragraph_1.paragraph_format.line_spacing = 1.5text = '中國臺灣華語流行歌手、' \'音樂創作家、作曲家、作詞人、' \'制作人、杰威爾音樂公司老板之一、導演。' \'近年涉足電影行業。周杰倫是2000年后亞洲流行樂壇最具革命性與指標' \'性的創作歌手,有“亞洲流行天王”之稱。他突破原有亞洲音樂的主題、形' \'式,融合多元的音樂素材,創造出多變的歌曲風格,尤以融合中西式曲風的嘻哈' \'或節奏藍調最為著名,可說是開創華語流行音樂“中國風”的先聲。周杰倫的' \'出現打破了亞洲流行樂壇長年停滯不前的局面,為亞洲流行樂壇翻開了新的一頁!'r_1 = paragraph_1.add_run(text) r_1.font.size =Pt(10) #字號 r_1.font.bold =True #加粗 r_1.font.color.rgb =RGBColor(255,0,0) #顏色# 保存文件(當前目錄下) doc_1.save('周杰倫.docx')通過上例我們可以看到,最小的操作對象為文字塊,通過run的指定進行操作。比如字號,顏色等;而再上一個層級–段落是的格式是通過paragraph_format進行設置;
(2)字體設置
通過(1),同學們已經注意到,字體的設置是全局變量。如果我想在不同的部分進行不同字體的設置,那該怎么辦呢?這就需要在應用前操作設置一下。
'''字體設置1.py''' #導入庫 from docx import Document from docx.oxml.ns import qn from docx.enum.style import WD_STYLE_TYPEdocument = Document() # 新建docx文檔# 設置宋體字樣式 style_font = document.styles.add_style('宋體', WD_STYLE_TYPE.CHARACTER) style_font.font.name = '宋體' document.styles['宋體']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋體')# 設置楷體字樣式 style_font = document.styles.add_style('楷體', WD_STYLE_TYPE.CHARACTER) style_font.font.name = '楷體' document.styles['楷體']._element.rPr.rFonts.set(qn('w:eastAsia'), u'楷體') # 將段落中的所有字體# 設置華文中宋字樣式 style_font = document.styles.add_style('華文中宋', WD_STYLE_TYPE.CHARACTER) style_font.font.name = '華文中宋' document.styles['華文中宋']._element.rPr.rFonts.set(qn('w:eastAsia'), u'華文中宋')paragraph1 = document.add_paragraph() # 添加段落 run = paragraph1.add_run(u'aBCDefg這是中文', style='宋體') # 設置宋體樣式font = run.font #設置字體 font.name = 'Cambira' # 設置西文字體 paragraph1.add_run(u'aBCDefg這是中文', style='楷體').font.name = 'Cambira' paragraph1.add_run(u'aBCDefg這是中文', style='華文中宋').font.name = 'Cambira'document.save('字體設置1.docx') '''字體設置2.py''' #導入庫 from docx import Document from docx.oxml.ns import qn from docx.enum.style import WD_STYLE_TYPE#定義字體設置函數 def font_setting(doc,text,font_cn):style_add = doc.styles.add_style(font_cn, WD_STYLE_TYPE.CHARACTER)style_add.font.name = font_cndoc.styles[font_cn]._element.rPr.rFonts.set(qn('w:eastAsia'), font_cn)par = doc.add_paragraph()text = par.add_run(text, style=font_cn)doc = Document() a = '小朋友 你是否有很多問號' b = '為什么 別人在那看漫畫' c = '我卻在學畫畫 對著鋼琴說話'font_setting(doc,a,'宋體') font_setting(doc,b,'華文中宋') font_setting(doc,c,'黑體')doc.save('字體設置2.docx')我們很容易地看出來,字體設置1.py與字體設置2.py的區別在于是否為同一段落,同時字體設置2.py中自定義了一個函數。同學們可以在實際工作中看具體場景進行選擇。
(3) 插入圖片與表格
#導入庫 from docx import Document from docx.shared import Inches#打開文檔 doc_1 = Document('周杰倫.docx') #上面腳本存儲的文檔 #新增圖片 doc_1.add_picture('周杰倫.jpg',width=Inches(1.0), height=Inches(1.0))# 創建3行1列表格 table1 = doc_1.add_table(rows=2, cols=1) table1.style='Medium Grid 1 Accent 1' #表格樣式很多種,如,Light Shading Accent 1等# 修改第2行第3列單元格的內容為營口 table1.cell(0, 0).text = '營口' # 修改第3行第4列單元格的內容為人民 table1.rows[1].cells[0].text = '人民'# 在表格底部新增一行 row_cells = table1.add_row().cells # 新增行的第一列添加內容 row_cells[0].text = '加油'doc_1.save('周杰倫為營口加油.docx')(4)設置頁眉頁腳
在python-docx包中則要使用節(section)中的頁眉(header)和頁腳(footer)對象來具體設置。
from docx import Document from docx.enum.text import WD_PARAGRAPH_ALIGNMENTdocument = Document() # 新建文檔header = document.sections[0].header # 獲取第一個節的頁眉 print('頁眉中默認段落數:', len(header.paragraphs)) paragraph = header.paragraphs[0] # 獲取頁眉的第一個段落 paragraph.add_run('這是第一節的頁眉') # 添加頁面內容 footer = document.sections[0].footer # 獲取第一個節的頁腳 paragraph = footer.paragraphs[0] # 獲取頁腳的第一個段落 paragraph.add_run('這是第一節的頁腳') # 添加頁腳內容'''在docx文檔中又添加了2個節,共計3個節,頁面和頁腳會顯示了“與上一節相同”。 如果不使用上一節的內容和樣式要將header.is_linked_to_previous的屬性或footer.is_linked_to_previous的屬性設置為False, 用于解除“鏈接上一節頁眉”或者“鏈接上一節頁腳”。''' document.add_section() # 添加一個新的節 document.add_section() # 添加第3個節 header = document.sections[1].header # 獲取第2個節的頁眉 header.is_linked_to_previous = False # 不使用上節內容和樣式#對齊設置 header = document.sections[1].header # 獲取第2個節的頁眉 header.is_linked_to_previous = False # 不使用上節內容和樣式 paragraph = header.paragraphs[0] paragraph.add_run('這是第二節的頁眉') paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 設置頁眉居中對齊 document.sections[1].footer.is_linked_to_previous = False footer.paragraphs[0].add_run('這是第二節的頁腳') # 添加第2節頁腳內容 footer.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 設置第2節頁腳居中對齊 header = document.sections[2].header # 獲取第3個節的頁眉 header.is_linked_to_previous = False # 不使用上節的內容和樣式 paragraph = header.paragraphs[0] # 獲取頁眉中的段落 paragraph.add_run('這是第三節的頁眉') paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT # 設置頁眉右對齊 document.sections[2].footer.is_linked_to_previous = False footer.paragraphs[0].add_run('這是第三節的頁腳') # 添加第3節頁腳內容 footer.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT # 設置第3節頁腳右對齊 document.save('頁眉頁腳1.docx') # 保存文檔(5)代碼延伸
'''對齊設置''' from docx.enum.text import WD_ALIGN_PARAGRAPH #LEFT: 左對齊 #CENTER: 文字居中 #RIGHT: 右對齊 #JUSTIFY: 文本兩端對齊'''設置段落行距''' from docx.shared import Length # SINGLE :單倍行距(默認) #ONE_POINT_FIVE : 1.5倍行距 # DOUBLE2 : 倍行距 #AT_LEAST : 最小值 #EXACTLY:固定值 # MULTIPLE : 多倍行距paragraph.line_spacing_rule = WD_LINE_SPACING.EXACTLY #固定值 paragraph_format.line_spacing = Pt(18) # 固定值18磅 paragraph.line_spacing_rule = WD_LINE_SPACING.MULTIPLE #多倍行距 paragraph_format.line_spacing = 1.75 # 1.75倍行間距'''設置字體屬性''' from docx.shared import RGBColor,Pt #all_caps:全部大寫字母 #bold:加粗 #color:字體顏色#double_strike:雙刪除線 #hidden : 隱藏 #imprint : 印記 #italic : 斜體 #name :字體 #shadow :陰影 #strike : 刪除線 #subscript :下標 #superscript :上標 #underline :下劃線三、項目實踐
一、需求
你是公司的行政人員,對合作伙伴進行邀請,參加公司的會議;
根據參會人名單,利用python批量生成邀請函。
二、需求分析
邏輯相對簡單:
- 獲取 Excel 文件中每一行的信息,提取 參數;結合獲取的參數設計邀請函樣式并輸出
- 設計word段落及字體等樣式。
三、代碼
# 導入庫 from openpyxl import load_workbook from docx import Document from docx.enum.text import WD_PARAGRAPH_ALIGNMENT from docx.shared import RGBColor, Pt,Inches,Cm from docx.oxml.ns import qnpath = r'D:\idea\cloud_analyse_game_sentiment\word自動化' # 路徑為Excel 文件所在的位置,可按實際情況更改workbook = load_workbook(path + r'\excel到word.xlsx') sheet = workbook.active #默認的WorkSheetn = 0 #為了不遍歷標題(excel的第一行) for row in sheet.rows:if n:company = row[0].valueoffice = row[1].valuename = row[2].valuedate = str(row[3].value).split()[0]print(company, office, name, date)doc = Document()heading_1 = '邀 請 函'paragraph_1 = doc.add_heading(heading_1, level=1)# 居中對齊paragraph_1.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER# 單獨修改較大字號for run in paragraph_1.runs:run.font.size = Pt(17)greeting_word_1 = '尊敬的'greeting_word_2 = '公司'greeting_word_3 = ',您好:'paragraph_2 = doc.add_paragraph()paragraph_2.add_run(greeting_word_1)r_1 = paragraph_2.add_run(company)r_1.font.bold = True # 加粗r_1.font.underline = True #下劃線paragraph_2.add_run(greeting_word_2)r_2 = paragraph_2.add_run(office)r_2.font.bold = True # 加粗r_2.font.underline = True #下劃線r_3 = paragraph_2.add_run(name)r_3.font.bold = True # 加粗r_3.font.underline = True #下劃線paragraph_2.add_run(greeting_word_3)paragraph_3 = doc.add_paragraph()paragraph_3.add_run('現誠摯的邀請您于2021年10月27日參加DataWhale主辦的享受開源2050活動,地點在北京鳥巢,希望您屆時蒞臨參加。')paragraph_3.paragraph_format.first_line_indent = Cm(0.75)paragraph_3.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFTparagraph_3.paragraph_format.space_after = Inches(1.0)paragraph_3.paragraph_format.line_spacing = 1.5paragraph_4 = doc.add_paragraph()date_word_1 = '邀請時間:'paragraph_4.add_run(date_word_1)paragraph_4.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHTsign_date = "{}年{}月{}日".format(date.split('-')[0], date.split('-')[1], date.split('-')[2])paragraph_4.add_run(sign_date).underline = Trueparagraph_4.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT#設置全文字體for paragraph in doc.paragraphs:for run in paragraph.runs:run.font.color.rgb = RGBColor(0, 0, 0)run.font.name = '楷體'r = run._element.rPr.rFontsr.set(qn('w:eastAsia'), '楷體')doc.save(path + "\{}-邀請函.docx".format(name))n = n + 1四、總結
本案例也可適用于批量生產固定格式的word,如工資條,通知單等
總結
以上是生活随笔為你收集整理的task3- python与word的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android相片拼板源码,实现仿微信拍
- 下一篇: 审视AI界的“SOTA成瘾”丨AI学者万