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