利用python-docx模块,Python可以创建和修改Word文档,它带有.docx文件扩展名。运行pip install python-docx,可以安装该模块。
在导入pytho-docx模块时,需要执行import docx,而不是import python-docx。
和纯文本相比,.docx文件有很多结构。这些结构在python-docx中用3种不同的类型来表示。在最高一层,Document对象表示整个文档。Document对象包含一个Paragraph对象的列表,表示文档中的段落。每一个Paragraph对象都包含一个Run对象的列表。
Word文档中的文本不仅仅是字符串。它包含与之相关的字体、大小、颜色和其他样式信息。在Word中,样式是这些属性的集合。一个Run对象是相同样式文本的延续。当文本样式发生改变时,就需要一个新的Run对象。
1
2
3
4
5
6
7
8
9
10
<code>c:\python\Scripts>pip3.6 </code><code>install</code> <code>python-docx</code>
<code>Collecting python-docx</code>
<code> </code><code>Downloading python-docx-0.8.6.</code><code>tar</code><code>.gz (5.3MB)</code>
<code> </code><code>100% |████████████████████████████████| 5.3MB 73kB</code><code>/s</code>
<code>Collecting lxml>=2.3.2 (from python-docx)</code>
<code> </code><code>Downloading lxml-4.1.1-cp36-cp36m-win_amd64.whl (3.5MB)</code>
<code> </code><code>100% |████████████████████████████████| 3.6MB 39kB</code><code>/s</code>
<code>Installing collected packages: lxml, python-docx</code>
<code> </code><code>Running setup.py </code><code>install</code> <code>for</code> <code>python-docx ... </code><code>done</code>
<code>Successfully installed lxml-4.1.1 python-docx-0.8.6</code>
读取Word文档
使用len()得到paragraphs的个数。
每个paragraph对象都有一个text属性,包含该段中的文本的字符串(没有样式信息)。
每个paragraph对象也有一个runs属性,它是run对象的列表。
run对象也有一个text属性,包含那个延续中的文本。
run表示的是不同样式的文本。
11
12
13
14
15
16
<code>c:\python>python</code>
<code>Python </code><code>3.6</code><code>.</code><code>1</code> <code>(v3.</code><code>6.1</code><code>:</code><code>69c0db5</code><code>, Mar </code><code>21</code> <code>2017</code><code>, </code><code>18</code><code>:</code><code>41</code><code>:</code><code>36</code><code>) [MSC v.</code><code>1900</code> <code>64</code> <code>bit (AMD64)] on win32</code>
<code>Type</code> <code>"help"</code><code>, </code><code>"copyright"</code><code>, </code><code>"credits"</code> <code>or</code> <code>"license"</code> <code>for</code> <code>more information.</code>
<code>>>> </code><code>import</code> <code>docx</code>
<code>>>> doc</code><code>=</code><code>docx.Document(</code><code>'Gettysburg Address.docx'</code><code>)</code>
<code>>>> </code><code>len</code><code>(doc.paragraphs)</code>
<code>4</code>
<code>>>> doc.paragraphs[</code><code>0</code><code>].text</code>
<code>'Four score and seven years ago our fathers brought forth on this continent, a new nation, conceived in Liberty, and dedicated to the proposition that all men are created equal.'</code>
<code>>>> doc.paragraphs[</code><code>-</code><code>1</code><code>].text</code>
<code>''</code>
<code>>>> </code><code>len</code><code>(doc.paragraphs[</code><code>0</code><code>].runs)</code>
<code>1</code>
<code>>>> doc.paragraphs[</code><code>0</code><code>].runs[</code><code>0</code><code>].text</code>
<code>>>></code>
从文件中取得完整的文本
如果只关心word文档中的文本,不关心样式信息,就可以利用getText()函数。
它接受一个.docx文件名,返回其中文本的字符串。
可以通过在append()方法中增加空格,形成段落缩进。
<code>>>> fullText</code><code>=</code><code>[]</code>
<code>>>> </code><code>for</code> <code>para </code><code>in</code> <code>doc.paragraphs:</code>
<code>... fullText.append(para.text)</code>
<code>...</code>
<code>>>> </code><code>print</code><code>(fullText)</code>
<code>[</code><code>'Four score and seven years ago our fathers brought forth on this continent, ......hall not perish from the earth.'</code><code>, '']</code>
设置Paragraph和Run对象的样式
对于word文档,有3种类型的样式:段落样式可以应用于paragraph对象,字符样式可以应用于run对象,链接的样式可以应用于这两种对象。
在设置style属性时,不要在样式名称中使用空格。
如果对run对象应用链接的样式,需要在样式名称末尾加上‘char’。
在当前版本的python-docx(0.7.4)中,只能使用默认的word样式,以及打开的文件中已有的样式,不能创建新的样式。
写入Word文档
在添加完文本后,向Document对象的save()方法传入一个文件名字符串,将Document对象保存到文件。
可以用新的段落文本,再次调用add_paragraph()方法添加段落。
<code>>>> doc.add_paragraph(</code><code>'Hello world!'</code><code>)</code>
<code><docx.text.paragraph.Paragraph </code><code>object</code> <code>at </code><code>0x0000019B5DD45B70</code><code>></code>
<code>>>> doc.save(</code><code>'newdoc.docx'</code><code>)</code>
效果:
如果要在已有段落的末尾添加文本,可以调用paragraph对象的add_run方法,向它传入一个字符串。
add_paragraph()和add_run()都接受可选的第二个参数,它是表示Paragraph或Run对象样式的字符串。
<code><docx.text.paragraph.Paragraph </code><code>object</code> <code>at </code><code>0x0000019B5D57ABE0</code><code>></code>
<code>>>> paraObj1</code><code>=</code><code>doc.add_paragraph(</code><code>'This is a second paragraph.'</code><code>)</code>
<code>>>> paraObj2</code><code>=</code><code>doc.add_paragraph(</code><code>'This is a yet another paragraph.'</code><code>)</code>
<code>>>> paraObj1.add_run(</code><code>'This text is being added to the second paragraph.'</code><code>)</code>
<code><docx.text.run.Run </code><code>object</code> <code>at </code><code>0x0000019B5DD5B940</code><code>></code>
<code>>>> doc.save(</code><code>'newdoc2.docx'</code><code>)</code>
添加标题
调用add_heading()将添加一个段落,并使用一种标题样式。
add_heading()的参数,是一个标题文本的字符串,以及一个从0-4的整数。
整数0表示标题是Title样式,这用于文档的顶部。
整数1-4是不同的标题层次,1是主要的标题,4是最低层的子标题。
add_heading()返回一个Paragraph对象。
<code>>>> doc</code><code>=</code><code>docx.Document()</code>
<code>>>> doc.add_heading(</code><code>'Header 0'</code><code>,</code><code>0</code><code>)</code>
<code><docx.text.paragraph.Paragraph </code><code>object</code> <code>at </code><code>0x0000019B5E1740F0</code><code>></code>
<code>>>> doc.add_heading(</code><code>'Header 1'</code><code>,</code><code>1</code><code>)</code>
<code><docx.text.paragraph.Paragraph </code><code>object</code> <code>at </code><code>0x0000019B5E1740B8</code><code>></code>
<code>>>> doc.add_heading(</code><code>'Header 2'</code><code>,</code><code>2</code><code>)</code>
<code><docx.text.paragraph.Paragraph </code><code>object</code> <code>at </code><code>0x0000019B5E174978</code><code>></code>
<code>>>> doc.add_heading(</code><code>'Header 3'</code><code>,</code><code>3</code><code>)</code>
<code><docx.text.paragraph.Paragraph </code><code>object</code> <code>at </code><code>0x0000019B5E174198</code><code>></code>
<code>>>> doc.add_heading(</code><code>'Header 4'</code><code>,</code><code>4</code><code>)</code>
<code>>>> doc.save(</code><code>'headings.docx'</code><code>)</code>
添加换行符和换页符
要添加换行符,可以在run对象上调用add_break()方法。
要添加换页符,可以将docx.text.WD_BREAK.PAGE作为唯一的参数,传递给add_break()。
<code>>>> doc.add_paragraph(</code><code>'This is on the first page!'</code><code>)</code>
<code><docx.text.paragraph.Paragraph </code><code>object</code> <code>at </code><code>0x0000019B5DD5B400</code><code>></code>
<code>>>> doc.paragraphs[</code><code>0</code><code>].runs[</code><code>0</code><code>].add_break()</code>
<code>>>> doc.add_paragraph(</code><code>'This is the new text!'</code><code>)</code>
<code>>>> doc.save(</code><code>'break.docx'</code><code>)</code>
添加图像
Document对象有一个add_picture()方法,在文档末尾添加图像。
<code><docx.text.paragraph.Paragraph </code><code>object</code> <code>at </code><code>0x0000019B5E189080</code><code>></code>
<code>>>> doc.add_picture(</code><code>'123.jpg'</code><code>,width</code><code>=</code><code>docx.shared.Inches(</code><code>1</code><code>),height</code><code>=</code><code>docx.shared.Cm(</code><code>4</code><code>))</code>
<code><docx.shape.InlineShape </code><code>object</code> <code>at </code><code>0x0000019B5E1899E8</code><code>></code>
<code>>>> doc.save(</code><code>'picture.docx'</code><code>)</code>
本文转自Grodd51CTO博客,原文链接:http://blog.51cto.com/juispan/2053946,如需转载请自行联系原作者