word文檔(docx)的讀取和寫入:docx模塊
來自專欄 Python程序員20 人贊了文章
介紹採用python_docx模塊處理word文檔的基本技巧,特別是圖片如何提取和寫入。
python已有幾個模塊可處理word文檔、excel表格、以及ppt演示文稿。首先,匯總列出各模塊對不同版本文件的處理能力:
docx模塊:可讀取、寫入.docx文檔(不支持.doc文檔!!!)
xlrd模塊:可讀取.xls、.xlsx表格
xlwt模塊:可寫入.xls表格(不可寫入.xlsx文件!!!)
pptx模塊:可讀取、寫入.ppt、.pptx(.ppt演示文稿,只能讀取pptx模塊自身輸出的,對其他方式生成的不支持!!!)
首先介紹docx模塊中如何描述一篇word文檔。
word文檔的結構描述不如excel表格那麼直觀。word文檔整體上有幾類對象組成:
(1)節Section:表示word文檔中頁面布局一樣的部分內容。
(2)段落Paragraph:word文檔的基本組成單元就是段落。文字、圖形都位於段落之中。
(3)塊Run:每個段落之中的內容可以具有不同的樣式,這些具有相同樣式的基本單元可稱之為塊。一個段落可由多個塊組成(各塊之間允許設置不同的樣式,但也可保持相同的樣式)。
(4)內聯圖形Inline_shape:以嵌入方式置入word文檔中的圖形稱之為內聯圖形。除此之外,還有其他布局方式的圖形,可在塊中找到,但其並不在內聯圖形集合中。
(5)表格Table:嵌入word文檔的表格。表格由行、列、單元格組成。單元格中的內容可以包含段落、圖形、表格等。注意,表格不在段落之中。
(6)樣式Style:用來確定word文檔內置對象格式的各種樣式,包括段落樣式、表格樣式、字元樣式、列表樣式(包括有序列表和無序列表)。
以上1~3項、6項是一個word文檔必備的元素。
下面介紹docx模塊具體如何操作一個word文檔。
打開或新建文檔:
doc = docx.Document(1.docx) #打開word文檔1.docx,如果不指定文件路徑,則新建文檔
節操作:
新建的文檔已包含一個節對象。節對象本質上是一個分節符(除第一節外),分節符本身構成一個獨立段落,包括在doc.paragraphs中。
doc.sections #返迴文檔中節集合,其組成元素為節對象,可以通過索引獲取
doc.add_section(start_type=2) #增加一個新節,start_type為分節符的類型
doc.sections[n] #返回索引為n的節對象。可以通過節對象的屬性訪問或設置節的格式,其主要屬性包括:
- 分節符類型:start_type,0表示連續分節符,1表示節的結尾符號,2表示下一頁分節符,3表示偶數頁分節符,4表示奇數頁分節符
- 頁面方向: orientation,1表示橫向,0表示縱向
- 頁面尺寸:page_height(頁高), page_width(葉寬)。距離屬性都可通過尺寸對象docx.shared.xx()進行設置(詳見下文公用對象)
- 邊距:bottom_margin(底部頁邊距), footer_distance(頁腳到底部間距), gutter(裝訂線到葉邊距離), header_distance(頂部頁邊距), left_margin(左側頁邊距), right_margin(右側頁邊距), top_margin(頂部頁邊距)。距離屬性都可通過尺寸對象docx.shared.xx()進行設置(詳見下文公用對象)
段落操作:
doc.paragraphs #返迴文檔中段落集合,其組成元素為段落對象,可以通過索引獲取
doc.paragraphs[n] #返回索引為n的段落對象
doc.add_paragraph(text=, stylex=None) #在文檔末尾增加一個新的段落,text為段落文本,style為段落樣式(如預設為None,則繼承文檔默認段落樣式)
doc.add_heading(text=, level=1) #在文檔末尾增加標題段落。level表示標題級別
doc.add_page_break() #在文檔末尾增加新段落,該段落僅包含分頁符
doc.paragraphs[n].insert_paragraph_before(text=None, stylex=None) #在索引為n的段落前增加一個段落
doc.paragraphs[n].text #返回或設置段落的文本內容
doc.paragraphs[n].paragraph_format #返回索引為n的段落的段落格式。可以通過段落格式(而不是段落對象本身,與節對象不同)的屬性訪問或設置段落的格式,其主要屬性包括:
- 段落對齊方式:alignment,0為左對齊,1為居中,2為右對齊,3為兩端對齊,4為分散對齊,5為垂直居中對齊,7為垂直頂端對齊,8為垂直底端對齊,9為泰文對齊(5~9還有待確認)
- 縮進:first_line_indent(首行縮進,如為負值則是懸掛縮進), left_indent(段落左側縮進), right_indent(段落右側縮進)。距離屬性都可通過尺寸對象docx.shared.xx()進行設置(詳見下文公用對象)
- 間距:line_spacing(行距), line_spacing_rule(行距預設值,0表示單倍行距,1表示1.5倍行距,2表示2倍行距,3表示最小行距,4表示固定行距,5表示多倍行距), space_after(段後間距), space_before(段前間距)。除行距預設值外,其他都是距離屬性,都可通過尺寸對象docx.shared.xx()進行設置(詳見下文公用對象)
- 換行和分頁:keep_together(段中不分頁), keep_with_next(與下段同頁), page_break_before(段前分頁), widow_control(孤行控制),均為邏輯值(True/False)
- 製表位:tab_stops,返回該段落採用的製表位集合。所謂製表位,就是在標尺上出現的標記,用於控制tab鍵的對齊方式。
- doc.paragraphs[n].tab_stops.add_tab_stop(position, alignment=0, leader=0) #在position(離段落左邊界的距離)位置添加一個製表位,alignment為製表位對齊方式(0為左對齊,1為居中,2為右對齊,3為小數點對齊,4為豎線對齊),leader為前導符(0為無,1為.....,2為---,3為___,4為……)
- doc.paragraphs[n].runs[m].add_tab() #在塊操作中,可增加製表符。也可直接在段落或塊的text屬性中寫入 ,也表示一個製表符
塊操作:
doc.paragraphs[n].runs #返回段落n的塊集合,其組成元素為塊對象,可以通過索引獲取
doc.paragraphs[n].add_run(text=None, stylex=None) #在段落末尾增加一個新的塊
doc.paragraphs[n].runs[m].add_break(break_type=6) #在塊末尾增加分隔符。break_type為分隔符類型(2為下一頁分節符,3為連續分節符,4為偶數頁分節符,5為奇數頁分節符,6為換行符,7為分頁符,8為分欄符,9、10、11都可認為是換行符。注意區別節對象的start_type屬性,兩者分節符的代碼並不一樣)。換行符即
,其也可通過.text屬性設置
doc.paragraphs[n].runs[m].add_text(text) #在塊末尾增加文字內容
doc.paragraphs[n].runs[m].text #返回或設置塊的文本內容
doc.paragraphs[n].runs[m].element.drawing_lst #返回塊中的圖形列表,包括內聯圖形和非內聯圖形,相比doc.inline_shapes更完整!!!
doc.paragraphs[n].runs[m] #返回段落n的塊對象m。可以通過其屬性訪問或設置塊的格式(主要是文字樣式),其主要屬性包括:
- 加粗: bold,True表示加粗
- 斜體:italic,True表示斜體
- 下劃線:underline,一共可設置18種下劃線樣式(常用的0為無下劃線,1為單下劃線,3為雙下劃線,4為點下劃線,6為加粗單下劃線,11為波浪線)
- 字體:font,返回字體對象,通過字體對象的以下屬性可以設置塊文字字體樣式:
- name:字體名稱
- size:字體大小,可通過磅數docx.shared.Pt()進行設置(詳見下文公用對象)
- bold:True表示加粗
- italic:True表示斜體
- underline:下劃線,同上可設置18種下劃線樣式
內聯圖形操作:
doc.inline_shapes #文檔所有內聯圖形的集合,其元素為內聯圖形對象,可索引
doc.paragraphs[n].add_picture(image_path_or_stream, width_=None, height=None) #在文檔末尾增加內聯圖形,作為一個新的段落。image_path_or_stream為圖片文件路徑或文件對象。width(圖片寬度)、height(圖片高度)可通過尺寸對象docx.shared.xx()進行設置(詳見下文公用對象),指定其中之一即可,另一將按比例縮放
doc.paragraphs[n].runs[m].add_picture(image_path_or_stream, width_=None, height=None) #在塊末尾增加內聯圖形。image_path_or_stream為圖片文件路徑或文件對象。width(圖片寬度)、height(圖片高度)可通過尺寸對象docx.shared.xx()進行設置(詳見下文公用對象),指定其中之一即可,另一將按比例縮放
doc.inline_shapes[n] #索引為n的內聯圖形對象。通過其屬性可訪問或設置對應內聯圖形的格式,主要屬性包括:
- 圖片尺寸:height, width,可通過尺寸對象docx.shared.xx()進行設置(詳見下文公用對象)
- 圖片類型:type(3表示圖片,4表示鏈接圖片,12表示圖表,15表示smart-art圖形)
表格操作:
doc.tables #文檔中的表格對象集合,可索引
doc.tables[n].add_row() #在表格底部增加一行
doc.tables[n].add_column(width) #在表格右側增加一列,列寬為width,可通過尺寸對象docx.shared.xx()進行設置(詳見下文公用對象)
doc.tables[n].rows #返回表格行對象集合
doc.tables[n].columns #返回表格列對象集合
doc.tables[n].row_cells(rowx) #返回表格行索引為rowx的單元格對象集合
doc.tables[n].column_cells(colx) #返回表格列索引為colx的單元格對象集合
doc.tables[n].cell(rowx, colx) #返回表格行、列索引分別為rowx、colx的單元格對象。單元格具有屬性:add_paragraph, add_table, merge, paragraphs, tables, text, width等
doc.tables[n] #索引為n的表格,通過其屬性可訪問或設置表格格式,主要屬性包括:
- 對齊方式:alignment,預設0表示左對齊,1表示居中,2表示右對齊。
- 自動調整:autofit,如為True,表示根據內容自動調整列寬。False表示固定列寬。如果表格寬度超過頁面寬度,則無論True還是False,表格列寬都將自動調整
- 表格方向:table_direction,True表示從右向左排列,False(默認)表示從左向右排列
樣式操作:
doc.styles #返迴文檔樣式集合,其元素包括段落樣式、表格樣式、字元樣式、列表樣式,只可通過鍵訪問(鍵為樣式名稱)(區別於文檔其他對象集合通過索引訪問)
doc.styles.add_style(name, style_type, builtin=False) #新增一個樣式。name為樣式名稱,style_type為樣式類型(1代表段落;2代表字元;3代表表格;4表示列表),builtin(bool)表示是否為內建樣式
公用對象:
docx.shared.xx() #尺寸對象,可用於各類尺寸相關設置,包括多種單位制(厘米Cm、毫米Mm、英寸Inches、磅數Pt、Emu、緹Twips)
docx.enum.shape.WD_INLINE_SHAPE #表示內聯圖形類型的常量類
docx.enum.text.WD_ALIGN_PARAGRAPH #表示段落對齊方式的常量類
docx.enum.text.WD_PARAGRAPH_ALIGNMENT #同docx.enum.text.WD_ALIGN_PARAGRAPH
docx.enum.text.WD_BREAK #表示分隔符類型的常量類
docx.enum.text.WD_BREAK_TYPE #同docx.enum.text.WD_BREAK
docx.enum.text.WD_COLOR #表示顏色的常量類
docx.enum.text.WD_COLOR_INDEX #同docx.enum.text.WD_COLOR
docx.enum.text.WD_LINE_SPACING #表示行距的常量類
docx.enum.text.WD_TAB_ALIGNMENT #表示製表位對齊方式的常量類
docx.enum.text.WD_TAB_LEADER #表示製表位前導符的常量類
docx.enum.text.WD_UNDERLINE #表示下劃線類型的常量類
推薦閱讀:
※怎樣在word或者PDF裡面的小正方形里打鉤(圖一)?如何實現在某一個詞上劃橫線(圖二)?
※為何現在用word2003人還這麼多?
※Android 上最好的 Word 和 PDF 閱讀器是什麼?
※如何高效地使用PPT的母版功能?
TAG:MicrosoftWord | Python | DOC文件格式 |