docx创建(或打开)后的文档的主要结构单位是『段落』(Paragraph)。标题也好,目录也好,正文也好,都是段落。通过赋予段落不同的样式,形成不同功能的文档结构。创建结构文档,就是创建具有不同样式的段落。
比段落更小的单位是『游程』(Run)。比方说,你想在一个段落里加重某几个字,那么加重的字就形成一个游程。一个段落至少包含一个游程。
python-docx通过文档对象的paragraphs获得『段落』和『游程』。
from docx import Document
doc=Document('test.docx')
for p in doc.paragraphs: #列出所有段落对象
print(p)
for p in doc.paragraphs: #显示出所有段落内容文本
print(p.text)
for p in doc.paragraphs:
for r in p.runs: #每个段落都有一个『游程』列表
print(r.text) #列出所有『游程』内容文本
对docx文档内容的访问,通过以下方式实现。(结果都一样,暂时还不明白其中的区别)
>>> doc.paragraphs[0].text
'我改改你看看'
>>> doc.paragraphs[0].runs[0].text
'我改改你看看'
和段落对象并列级别的就是表格对象(Table),同理可通过doc.tables获得文档中所有表格的集合列表。表格对象下面有行(Row)列(Column)和格(Cell) 对象,Table对象有两个属性rows和columns,分别是行列集合列表。表格中的格(Cell)对象可以使用以下五种方法获取:
- 使用Table对象的cell(row,col)方法。左上角的坐标为0,0;
- 使用Table对象的row_cells(row_index)方法得到一个list,它包含了某一行的按列排序的所有Cell
- 得到一个Row对象后,使用Row.cells属性得到该Row的按列排序的所有Cell
- 使用Table对象的column_cells(column_index)方法得到一个list,它包含了某一列的按行排序的所有Cell
- 得到一个Column对象后,使用Column.cells属性得到该Column的按行排序的所有Cell
如果想遍历所有Cell,可以先遍历所有行(table.rows),再遍历每一行所有的Cell; 也可以先遍历所有列(table.columns),再遍历每一列所有的Cell。一个Cell对象最常用的属性是text。设置这个属性可以设定单元格的内容,读取这个属性可以获取单元格的内容。可以利用Cell对象的merge(other_cell)方法合并单元格。合并的方式为,以当前Cell为左上角,other_cell为右下角进行合并。
(本文知识摘自知乎博主:Jerry Jho,致谢!)