我的理解
為什么會用到python-docx,因為近段時間下載了大量網文,但格式都是html的,我個人習慣使用word處理文字,於是就想法設法把html文檔轉換為word,首先要考慮的問題就是從html中提取的文字怎么存word里呢,之前用了pandoc直接轉換,帶轉換后的效果太不理想,沒什么格式,不符合我這種對word格式有嚴格要求強迫症人的需要,於是就到處搜尋其他方法,終於功夫不負有心人,通過幾天研究python-docx,感覺很適合我,就一邊分析html文檔,一邊思考怎么用python-docx存想要的格式word,因為我的word排版,一般習慣 頁面要設置成5678頁邊距的,大小A4的,正文主標題 方正小標宋,其他標題要么黑體,要么加粗,正文要首行縮進2字符 仿宋_GB2312,頁腳要加頁碼顯示,大概這些樣式。
python-docx 創建一篇文檔也差不多是這么個思路,一篇文檔也就是Document()對象 首先要分成不同的節,也就是由sections對象控制,然后每節中又分成不同的段落paragraphs對象,每段又由不同的塊run對象組成,針對不同的節(section)可以設置頁面的一些屬性,針對不同的段落(paragraph),可以設置間距和縮進、換行和分頁等,針對不同塊(run)可以設置字體的字型、顏色、大小等。可以先設置好整篇文章的大致段落、字體等格式,然后針對不同段落和塊可以單獨再進行設置。
我主要講講自己用到的幾個內容是怎么設置的。
安裝庫:
pip install python-docx
用到的庫
from docx import Document(文檔讀寫) from docx.shared import Pt,Cm,Inches (字體大小,不一定全用到) from docx.oxml.ns import qn(設置字體格式,分欄等用到) from docx.shared import RGBColor (設置字體顏色) from docx.enum.text import WD_ALIGN_PARAGRAPH (設置對其方式) from docx.enum.section import WD_ORIENTATION (紙張方向用到)
設置大致格式
這樣設置完了之后有一個好處就是,后往里面寫入文檔的時候回自動按這個格式,如果有需要改動的再單獨寫入時改。
docment = docx.Document(docx_tamplate) # 讀取模板文檔,這里可以不用模板文檔,因為python-docx沒法設置頁碼,所以我先建了一個有頁碼的空白文檔作為模板文檔 # 設置正文默認格式 # 字體大小三號字(16) docment.styles['Normal'].font.size = Pt(16) # 字體仿宋_GB2312 docment.styles['Normal'].font.name = u'仿宋_GB2312' docment.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'仿宋_GB2312') # 行間距 28磅 段前、段后不留空 docment.styles['Normal'].paragraph_format.line_spacing = Pt(29) docment.styles['Normal'].paragraph_format.space_before = Pt(0) docment.styles['Normal'].paragraph_format.space_after = Pt(0) # 首行縮進2字符 docment.styles['Normal'].paragraph_format.first_line_indent = 406400 # 關閉孤行控制 docment.styles['Normal'].paragraph_format.widow_control = False # 設置頁面大小 docment.sections[0].page_height = Cm(29.7) # 設置A4紙的高度 docment.sections[0].page_width = Cm(21) # 設置A4紙的寬 # 設置頁邊距 docment.sections[0].top_margin = Cm(3.7) docment.sections[0].bottom_margin = Cm(3.4) docment.sections[0].left_margin = Cm(2.8) docment.sections[0].right_margin = Cm(2.6)
單獨設置段格式
doc=Document() #創建一個空白文檔 p1=doc.add_paragraph() #初始化建立一個自然段 p1.alignment=WD_ALIGN_PARAGRAPH.CENTER #對齊方式為居中,沒有這句話默認左對齊。另外右對齊:RIGHT,兩端對齊:JUSTIFY,分散對齊:DISTRIBUTE p1.paragraph_format.line_spacing=1.5 #設置該段落,行間距為1.5倍,也可以像上面設默認值那樣用Pt單位來設置 p1.paragraph_format.first_line_indent=Inches(0.5) #段落縮進0.5英寸,我還是習慣設置2字符 值為:406400 p1.paragraph_format.left_line_indent=Inches(0.5) #設置左縮進0.5英寸。一般用不到 p1.paragraph_format.right_line_indent=Inches(0.5) #設置右縮進0.5英寸,一般用不到 p1.paragraph_format.keep_together = False # 段前分頁 p1.paragraph_format.keep_with_next = False # 與下段同頁 p1.paragraph_format.page_break_before = True # 段中不分頁 p1.paragraph_format.widow_control = False # 孤行控制 p1.space_after=Pt(5) #設置段后距離為5磅 p1.space_before=Pt(5) #設置段前距離為5磅 run1=p1.add_run('你好') #寫入段落的中的文本“你好” run1.font.size=Pt(12) #單獨設置字體大小為24 run1.font.bold=True #樣式設置加粗 run1.italic=True #字形設置斜體 run1.font.underline = True # 下划線 run1.font.color.rgb = RGBColor(255, 0, 0) # 顏色
插入圖片
#添加圖片,設置圖片大小 doc.add_picture(r"圖片路徑", width=Cm(10))
插入表格
tab = doc.add_table(rows=5, cols=8, style='Table Grid') # 創建一個5行8列的表格,樣式為Table Grid tab.cell(0, 0).text = '表角' # 0行0列的內容為表角 cell=tab.cell(0, 1).merge(tab.cell(0, 3)) # 合並0行1列到0行3列 p = cell.paragraphs[0] run = p.add_run(‘合並’) #在單元格內容創建一個段落,並寫入‘合並’文本 run.font.size = Pt(10.5) # 字體大小設置,和word里面的字號相對應5號字 run.bold = True p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 設置為加粗 居中顯示
順帶說下,如果文檔是doc格式的需要轉換成docx,可以用pywin32 模塊轉換
模塊安裝
pip install pypiwin32
下面是寫好的一個簡單轉換函數
from win32com import client import pythoncom def doc_docx(old_path): """單個.doc文件轉換為.docx文件""" # 我們首先調用win32com模塊並打開word應用軟件,執行程序: pythoncom.CoInitialize() # 初始化線程 word = client.Dispatch("Word.Application") # vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv doc = word.Documents.Open(old_path) new_path = old_path.split('.', 1)[0] + '.docx' doc.SaveAs(new_path, 16) # 數字16表示將.doc文件另存為.docx格式文件 doc.Save() # 一定注意 另存后這里要再保存下 防止報錯 # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # 釋放資源 doc.Close() word.Quit() pythoncom.CoUnInitialize() # 初始化線程 return new_path
如果一次轉換的比較多,因為多進程基本都會報錯 , 那么可以構造類或函數進行操作 ,主要是我框起來的那4行代碼,前面初始化操作先執行,然后循環中間段代碼,最后等全部轉換完成后再釋放資源