word文檔(docx)的讀取和寫入:docx模塊

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文件格式 |