python操作docx文檔
關於python操作docx格式文檔,我用到了兩個python包,一個便是python-docx包,另一個便是python-docx-template;,同時我也用到了很出名的一個工具"pandoc,下面我會對他們各自進行介紹。
- 首先便是python-docx包,這是一個很強大的包,可以用來創建docx文檔,包含段落、分頁符、表格、圖片、標題、樣式等幾乎所有的word文檔中能常用的功能都包含了,這個包的主要功能便是用來創建文檔,相對來說用來修改功能不是很強大,關於文檔請查看他的"官網;
- 再然后便是python-docx-template這個包了,他可以用來對docx文檔進行修改,諸如對文檔中的 文本、圖片、富文本、等幾乎所有存在與文檔中的他都能替換,而且他操作起來就如同很多web框架中的模板語言一樣,因為他是和jinjia2模板語言結合使用的,所以最好希望使用之前對模板語言有一定了解;
- 關於pandoc,這個包在許多需要進行文本轉換的地方用處很強大,他可以把許多如今存在的文檔格式轉換問另一種文檔格式,如html、markdown、docbook、latex、docx等轉換為xml、latex、markdown、pdf,總之很強大,這是官網,有興趣的可以去了解下。
下面便會相應介紹他們各自的大概的用法。還是按照上面的順序進行介紹,
:
-
關於python-docx這個包我覺得最好還是引用他官網的一段代碼解釋最為合適了,因為這里面基本情況都被包含了,
- from docx import Document
- from docx.shared import Inches
- document = Document() # 首先這是包的主要接口,這應該是利用的設計模式的一種,用來創建docx文檔,里面也可以包含文檔路徑(d:\\2.docx)
- document.add_heading('Document Title', 0) # 這里是給文檔添加一個標題,0表示 樣式為title,1則為忽略,其他則是Heading{level},具體可以去<a href="https://python-docx.readthedocs.io/en/latest/user/styles-understanding.html" target="_blank">官網</a>查;
- p = document.add_paragraph('A plain paragraph having some ') # 這里是添加一個段落
- p.add_run('bold').bold = True # 這里是在這個段落p里文字some后面添加bold字符
- p.add_run(' and some ')
- p.add_run('italic.').italic = True
- document.add_heading('Heading, level 1', level=1) # 這里是添加標題1
- document.add_paragraph('Intense quote', style='IntenseQuote') # 這里是添加段落,style后面則是樣式
- document.add_paragraph(
- 'first item in unordered list', style='ListBullet' # 添加段落,樣式為unordered list類型
- )
- document.add_paragraph(
- 'first item in ordered list', style='ListNumber' # 添加段落,樣式為ordered list數字類型
- )
- document.add_picture('monty-truth.png', width=Inches(1.25)) # 添加圖片
- table = document.add_table(rows=1, cols=3) # 添加一個表格,每行三列
- hdr_cells = table.rows[0].cells # 表格第一行的所含有的所有列數
- hdr_cells[0].text = 'Qty' # 第一行的第一列,給這行里面添加文字
- hdr_cells[1].text = 'Id'
- hdr_cells[2].text = 'Desc'
- for item in recordset:
- row_cells = table.add_row().cells # 這是在這個表格第一行 (稱作最后一行更好) 下面再添加新的一行
- row_cells[0].text = str(item.qty)
- row_cells[1].text = str(item.id)
- row_cells[2].text = item.desc
- document.add_page_break() # 添加分頁符
- document.save('demo.docx') # 保存這個文檔
具體樣式請看:
關於更多細節希望大家還是去他的官網python-docx;看,介紹的還是很詳細
關於python-docx-template,他的官網名稱便是“像jinjia2一樣來操作docx文檔”,因此這個包對於用來進行文檔修改時很強大的下面是一個簡單例子:
- from docxtpl import DocxTemplate
- doc = DocxTemplate("1.docx") # 對要操作的docx文檔進行初始化
- context = { 'company_name' : "World company" } # company_name 是存在於1.docx文檔里面的變量,就像這樣{{company_name}},直接放在1.docx文件的明確位置就行
- doc.render(context) # 這里是有jinjia2的模板語言進行變量的替換,然后便可以在1.docx文檔里面看到{{company_name}}變成了World company
- doc.save("generated_doc.docx") # 保存
- 當然,這個包的功能遠遠不止上面例子中的一些,可以包含圖片
- myimage = InlineImage(doc,'test_files/python_logo.png',width=Mm(20)) # tpl便是上面例子中的doc對象
- 也可以包含另一個docx文檔,
- sub = doc.new_subdoc()
- sub.subdocx = Document('d:\\2.docx')
- doc.render({'sub': sub})
關於更多的特性,可以訪問官網的example,里面涵蓋了幾乎所有的特性,地址是https://github.com/elapouya/python-docx-template/tree/master/tests
-
最后便是pandoc了,我在這次用到的功能主要是,用來把html文件直接轉換為markdow格式文件,然后再轉換為txt文件,最后將txt文件內容和格式一同插入到docx文檔中,當然,也可以直接把html文件轉換為docx文件,格式基本一致
這是用到的命令,而由於使用pandoc是在控制台下cmd或者shell使用的,因此要用到python的另一個包subprocess
- import subprocess
- subprocess.call('pandoc --latex-engine=xelatex temp.html -o temp.text', cwd='d:\\python', shell=True)
- subprocess.call('pandoc --latex-engine=xelatex temp.text -o t1.text', cwd='d:\\python', shell=True)
- <span style="background-color:rgb(153,153,255);">subprocess.call('pandoc temp.html -o temp.docx', cwd='d:\\python', shell=True)</span>
