有兩種方式:
- 使用win32com
- 使用docx
1.使用win32com擴充套件包
只對windows平臺有效
# coding=utf-8 import win32com from win32com.client import Dispatch, DispatchEx word = Dispatch('Word.Application') # 開啟word應用程式 # word = DispatchEx('Word.Application') #啟動獨立的程式 word.Visible = 0 # 後臺執行,不顯示 word.DisplayAlerts = 0 # 不警告 path = 'G:/WorkSpace/Python/tmp/test.docx' # word檔案路徑 doc = word.Documents.Open(FileName=path, Encoding='gbk') # content = doc.Range(doc.Content.Start, doc.Content.End) # content = doc.Range() print '----------------' print '段落數: ', doc.Paragraphs.count # 利用下標遍歷段落 for i in range(len(doc.Paragraphs)): para = doc.Paragraphs[i] print para.Range.text print '-------------------------' # 直接遍歷段落 for para in doc.paragraphs: print para.Range.text # print para #只能用於文件內容全英文的情況 doc.Close() # 關閉word文件 # word.Quit #關閉word程式
2.使用docx擴充套件包
優點:不依賴作業系統,跨平臺
安裝:
pip install python-docx
參考文件: https://python-docx.readthedocs.io/en/latest/index.html
程式碼:
import docx def read_docx(file_name): doc = docx.Document(file_name) content = '\n'.join([para.text for para in doc.paragraphs]) return content
建立表格
# coding=utf-8 import docx doc = docx.Document() table = doc.add_table(rows=1, cols=3, style='Table Grid') #建立帶邊框的表格 hdr_cells = table.rows[0].cells # 獲取第0行所有所有單元格 hdr_cells[0].text = 'Name' hdr_cells[1].text = 'Id' hdr_cells[2].text = 'Desc' # 新增三行資料 data_lines = 3 for i in range(data_lines): cells = table.add_row().cells cells[0].text = 'Name%s' % i cells[1].text = 'Id%s' % i cells[2].text = 'Desc%s' % i rows = 2 cols = 4 table = doc.add_table(rows=rows, cols=cols) val = 1 for i in range(rows): cells = table.rows[i].cells for j in range(cols): cells[j].text = str(val * 10) val += 1 doc.save('tmp.docx')
讀取表格
# coding=utf-8 import docx doc = docx.Document('tmp.docx') for table in doc.tables: # 遍歷所有表格 print '----table------' for row in table.rows: # 遍歷表格的所有行 # row_str = '\t'.join([cell.text for cell in row.cells]) # 一行資料 # print row_str for cell in row.cells: print cell.text, '\t', print
相關樣式參考: https://python-docx.readthedocs.io/en/latest/user/styles-understanding.html
使用PYTHON編輯和讀取WORD文件
python呼叫word介面主要用到的模板為python-docx,基本操作官方文件有說明。
使用python新建一個word文件,操作就像文件裡介紹的那樣:
from docx import Document from docx.shared import Inches document = Document() document.add_heading('Document Title', 0) #插入標題 p = document.add_paragraph('A plain paragraph having some ') #插入段落 p.add_run('bold').bold = True p.add_run(' and some ') p.add_run('italic.').italic = True document.add_heading('Heading, level 1', level=1) document.add_paragraph('Intense quote', style='IntenseQuote') document.add_paragraph( 'first item in unordered list', style='ListBullet' ) document.add_paragraph( 'first item in ordered list', style='ListNumber' ) 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') #儲存文件
讀取和編輯一個已有的word文件,只需在一開始新增上檔案路徑就行了,如下:
from docx import Document from docx.shared import Inches document = Document('demo.docx') #開啟檔案demo.docx for paragraph in document.paragraphs: print(paragraph.text) #列印各段落內容文字 document.add_paragraph( 'Add new paragraph', style='ListNumber' ) #新增新段落 document.save('demo.docx') #儲存文件
如果是想讀取其中的圖片或是更復雜地編輯,首先我們需要先來認識下docx文件的格式組成:
docx是Microsoft Office2007之後版本使用的,用新的基於XML的壓縮檔案格式取代了其目前專有的預設檔案格式,在傳統的檔名副檔名後面新增了字母“x”(即“.docx”取代“.doc”、“.xlsx”取代“.xls”、“.pptx”取代“.ppt”)。
docx格式的檔案本質上是一個ZIP檔案。將一個docx檔案的字尾改為ZIP後是可以用解壓工具開啟或是解壓的。事實上,Word2007的基本檔案就是ZIP格式的,他可以算作是docx檔案的容器。
docx 格式檔案的主要內容是儲存為XML格式的,但檔案並非直接儲存於磁碟。它是儲存在一個ZIP檔案中,然後取副檔名為docx。將.docx 格式的檔案字尾改為ZIP後解壓, 可以看到解壓出來的資料夾中有word這樣一個資料夾,它包含了Word文件的大部分內容。而其中的document.xml檔案則包含了文件的主要文字內容。
word目錄下:
document.xml檔案內容:
media目錄下存放word文件中插入的圖片:
所以,我們可以使用手工的方法編輯檔案document.xml來對該word文件內容進行編輯,或是提取文件media中圖片檔案的方式來提取該word文件中所插入的所有圖片。
import zipfile f=zipfile.ZipFile('demo.docx','r') for filename in f.namelist(): f.extract(filename)