word_1">word文档案例
需求:
- 读取所有的段落文本,并使用字典表示每一个段落;
- 段落字典格式如下:
python">{"type": "text","content": "2. Python的程序结构","runs": [{}, {}], # 每个run字典放入列表"page_num": 1 # 页码
}
- 所有的段落放入一个列表中;
pythondocx_20">基于python-docx读取段落
- 未读取章节的编号;
python">
# 遍历所有的段落
paragraphs_list = []
word">for paragraph word">in docx.paragraphs:temp = {}temp["type"] = "text"temp["content"] = paragraph.text # 未读出章节编号 paragraph.style 获取temp["runs"] = []word">for run word">in paragraph.runs:run_dict = {}run_dict["content"] = run.textrun_dict["family"] = run.font.namerun_dict["bold"] = run.font.boldrun_dict["italic"] = run.font.italicrun_dict["size"] = run.font.sizerun_dict["color"] = run.font.color.rgb # ColorFormat.rgbrun_dict["underline"] = run.font.underlinetemp["runs"].append(run_dict)# 统计页面idtemp["page_num"] = 1 # ?paragraphs_list.append(temp)word">print("all:", paragraphs_list)
深入理解docx处理的段落:
word docx文件本质是一个压缩文件,修改后缀名为.zip,即可解压得到对应的xml文件;
基于底层的 lxml 对象:
- CT_R, Run 文本对象,对应lxml标签 <w:r>,内部包含:
- <w:rPr> run属性
- <w:t> 文本标签
- obj.text
- CT_RPr,Run对象的属性; 对应lxml标签 <w:rPr>
- CT_P,段落对象,对应lxml标签 <w:p>,内部包含:
- <w:pPr>
- <w:pStyle>
- <w:numPr>
- <w:rPr>
- <w:r> 可有多个run标签属性;
- <w:pPr>
- CT_PPr, 段落的属性
- CT_Tbl,表格对象
- CT_NumPr 对应lxml标签<w:numPr>, 最终对象(不再迭代)
- obj.ilvl,
- obj.numId,
- obj.tag
- CT_String 对应lxml标签<w:pStyle>, 最终对象(不再迭代)
- obj.tag, {http://schemas.openxmlformats.org/wordprocessingml/2006/main}pStyle
- obj.val, “a7” 与.values()函数类似;
- obj.text 获取为None;
- CT_SectPr,图片
python">word">from docx word">import Documentdocx = Document("xxx.docx")
word">for i word">in docx.element.body: # lxml元素word">print(i)
基于pywin32读取段落
python">在这里插入代码片
基于pywin32读取表格
python"># pip install pywin32
word">from win32com.client word">import Dispatch# 打开 word应用程序
word = Dispatch("Word.Application")
# word界面不可见
word.Visible = 0
word.DisplayAlerts = 0# 打开word文档,必须是一个绝对路径
docx = word.Documents.Open("C:/Users/lenovo/Desktop/cc/lauf_chapter.docx", ReadOnly=True)table_data = []
# 遍历文档中的表格
word">for table word">in docx.Tables:# 获取行数、列数row_num = table.Rows.Countcol_num = table.Columns.Count# 初始化表格数据cur_table = [["" word">for j word">in range(col_num)] word">for i word">in range(row_num)]# 遍历单元格word">for cell word">in table.Range.Cells: # 无内容的cell会被自动删除# cell.RowIndex, cell.ColumnIndex 均从1开始row_idx = cell.RowIndex - 1col_idx = cell.ColumnIndex - 1# 获取cell内容cur_table[row_idx][col_idx] = cell.Range.Text.strip().replace("\r", "").replace("\x07", "") # \x07 水平制表符号table_data.append(cur_table)word">print("一个表格的数据:", table_data[0])
# 关闭word文档
docx.Close(False)
# 退出word应用程序
word.Quit()
结果:
注意:
word中的 \x07 表示水平制表符;
table.Rows 所有的单独行,迭代时不能有合并的行,否则报错;
table.Columns 所有单独列;
table.Cell 根据rid,cid 获取单元格对象;
table.Range 表格的范围对象
table.Range.Start 开始
table.Range.End 结束
table.Range.Cells 所有单元格,内容为空的单元格会被自动删除;