雖然Word不好用, 但還必須得用它, python-docx 是專門用于編輯Word文檔的一個工具庫, 它有兩大用途, 自動化生成word文檔 and 自動化修改文檔
1. 自定義樣式
python可以自定義三類樣式這三類樣式的創(chuàng)建方式基本一致, 只是創(chuàng)建參數(shù) 略有不同(1為段落樣式, 2為字符樣式, 3為表格樣式)
以設(shè)置段落樣式為例 # 創(chuàng)建自定義段落樣式(第一個參數(shù)為樣式名, 第二個參數(shù)為樣式類型, 1為段落樣式, 2為字符樣式, 3為表格樣式) UserStyle1 = document.styles.add_style('UserStyle1', 1) UserStyle1.font.size = Pt(40) UserStyle1.font.color.rgb = RGBColor(0xff, 0xde, 0x00) UserStyle1.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER UserStyle1.font.name = '微軟雅黑' UserStyle1._element.rPr.rFonts.set(qn('w:eastAsia'), '微軟雅黑')
2.理解結(jié)構(gòu)關(guān)系
- 往文檔中插入文本內(nèi)容, 首先要插入一個段落, 段落后面可追加字符, 但文檔不能直接插入字符
- 段落之間會自動以 回車符號 分隔
- 段落 和 字符 可 各自設(shè)置獨立的樣式
實例: 插入段落, 插入段落后追加字符 document.add_paragraph('自定義段落樣式', style = UserStyle1) document.add_paragraph('').add_run('正月里采花無喲花采,二月間采花花喲正開,二月間采花花喲正開。三月里桃花紅喲似海,四月間葡萄架喲上開,四月間葡萄架喲上開。', style = UserStyle2)
3. 插入圖片python-docx支持將圖片插入文檔, 且可以設(shè)置圖片大小
實例代碼: document.add_picture('少女17087938.jpg', width=Inches(5))
4.插入列表
插入有序列表 document.add_paragraph('把冰箱門打開', style='List Number') document.add_paragraph('把大象裝進去', style='List Number') document.add_paragraph('把冰箱門關(guān)上', style='List Number')
插入無序列表 document.add_paragraph('天地匆匆 驚鴻而過 路有千百個', style='List Bullet') document.add_paragraph('遑遑無歸 閑云逸鶴 人間紅塵過', style='List Bullet') document.add_paragraph('引勢而流 鴻門亂局 各有各選擇', style='List Bullet') document.add_paragraph('乾震坎艮 坤巽離兌 定一切生克', style='List Bullet')
5.插入表格
把表格看做二維數(shù)組, 然后往數(shù)組中填數(shù)據(jù)
table = document.add_table(rows=rows_num, cols=cols_num, style = 'Table Grid') for r in range(rows_num): for c in range(cols_num): table.cell(r, c).text = '第{r}行{c}列'.format(r = r+1, c = c+1)
完整源碼:from docx import Document from docx.shared import Inches from docx.dml.color import ColorFormat from docx.shared import Pt from docx.shared import RGBColor from docx.oxml.ns import qn from docx.enum.style import WD_STYLE_TYPE from docx.enum.text import WD_ALIGN_PARAGRAPH document.styles['Normal'].font.name = '微軟雅黑' document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '微軟雅黑') # 創(chuàng)建自定義段落樣式(第一個參數(shù)為樣式名, 第二個參數(shù)為樣式類型, 1為段落樣式, 2為字符樣式, 3為表格樣式) UserStyle1 = document.styles.add_style('UserStyle1', 1) UserStyle1.font.size = Pt(40) UserStyle1.font.color.rgb = RGBColor(0xff, 0xde, 0x00) UserStyle1.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER UserStyle1.font.name = '微軟雅黑' UserStyle1._element.rPr.rFonts.set(qn('w:eastAsia'), '微軟雅黑') # 創(chuàng)建自定義字符樣式(第一個參數(shù)為樣式名, 第二個參數(shù)為樣式類型, 1為段落樣式, 2為字符樣式, 3為表格樣式) UserStyle2 = document.styles.add_style('UserStyle2', 2) UserStyle2.font.size = Pt(15) UserStyle2.font.color.rgb = RGBColor(0x0c, 0x8a, 0xc5) UserStyle2.font.name = '宋體' UserStyle2._element.rPr.rFonts.set(qn('w:eastAsia'), '宋體') document.add_paragraph('自定義段落樣式', style = UserStyle1) document.add_paragraph('').add_run('正月里采花無喲花采,二月間采花花喲正開,二月間采花花喲正開。三月里桃花紅喲似海,四月間葡萄架喲上開,四月間葡萄架喲上開。', style = UserStyle2) document.add_paragraph('設(shè)置粗體字:').add_run('粗體字').bold = True document.add_paragraph('設(shè)置斜體字:').add_run('斜體字').italic = True document.add_paragraph('設(shè)置字號50:').add_run('50').font.size = Pt(50) document.add_paragraph('設(shè)置字體顏色:').add_run('顏色').font.color.rgb = RGBColor(0xaf, 0x26, 0x26) # 樣式疊加: 將字體改到30號并且將字體改成特定顏色; doubleStyle = document.add_paragraph('同時設(shè)置文字顏色和字號:').add_run('顏色和尺寸') doubleStyle.font.size = Pt(30) doubleStyle.font.color.rgb = RGBColor(0xaf, 0x26, 0x26) document.add_page_break() document.add_paragraph('').add_run('有序列表').font.size = Pt(30) document.add_paragraph('把冰箱門打開', style='List Number') document.add_paragraph('把大象裝進去', style='List Number') document.add_paragraph('把冰箱門關(guān)上', style='List Number') document.add_paragraph('').add_run('無序列表').font.size = Pt(30) document.add_paragraph('天地匆匆 驚鴻而過 路有千百個', style='List Bullet') document.add_paragraph('遑遑無歸 閑云逸鶴 人間紅塵過', style='List Bullet') document.add_paragraph('引勢而流 鴻門亂局 各有各選擇', style='List Bullet') document.add_paragraph('乾震坎艮 坤巽離兌 定一切生克', style='List Bullet') document.add_page_break() document.add_paragraph('').add_run('添加圖片').font.size = Pt(30) document.add_picture('少女17087938.jpg', width=Inches(5)) document.add_page_break() document.add_paragraph('').add_run('創(chuàng)建表格').font.size = Pt(30) table = document.add_table(rows=rows_num, cols=cols_num, style = 'Table Grid') for r in range(rows_num): for c in range(cols_num): table.cell(r, c).text = '第{r}行{c}列'.format(r = r+1, c = c+1) document.save('Python生成的文檔.docx') if __name__ == '__main__':
將源碼保存為單獨的python文件后,安裝python-docx, 找一張圖片,命名為少女17087938.jpg , 將圖片與python文件放到同一個目錄, 然后再python3環(huán)境下運行python文件即可! 最后附測試圖片一張: 最終效果:
自動化修改文檔
實例: 將當前目錄下, 所有docx文件內(nèi)的'海南大學', 替換為'Hainan University', 并將新文件添加前綴new 后, 保存到當前目錄下
# 傳入三個參數(shù), 舊字符串, 新字符串, 文件對象 def replace_text(old_text, new_text, file): for f in file.paragraphs: text = i.text.replace(old_text, new_text) old_file_names = os.listdir() for old_file_name in old_file_names: if re.match(r'^[^~].*\.docx', old_file_name): docx_file_names.append(old_file_name) for docx_file_name in docx_file_names: file=docx.Document(docx_file_name) # 三個參數(shù): 舊的字符串, 新的字符串, 文件對象 print('開始替換:', docx_file_name) replace_text('海南大學', 'Hainan University', file) file.save('new_'+docx_file_name) print(docx_file_name, '替換成功') print(docx_file_name, '替換失敗') if __name__ == '__main__':
關(guān)于Python操控PPT:https://www.jianshu.com/p/5b294515b480
|