用python解析word文件(一):paragraph

太长了,我决定仍是拆开三篇写。
 
(一)段落篇(paragraph)(本篇)

(二)表格篇(table)html

(三)样式篇(style)前端

选你所需便可。下面开始正文。python

 


 

最近公司的项目,须要在页面上显示word文件的内容。我找了几个前端写法,都没用明白(由于我前端太渣),用起来简单的要么收费,要么加了水印。那怎么办捏?数组

唉,仍是按毛主席说的,本身动手,丰衣足食吧!

 

感谢徒弟给打下的基础,我不用挨个碰壁,直接就选择了python-docx这个库。 固然,它也只能解析docx文件,解析不了doc文件。安装方式直接pip就能够。下面咱们就正式开始解析的过程。
 
在word中的一个天然段,就是一个paragraph,用最简单的方式
docx.paragraphs

就能够得到所有的段落。这是一个可迭代的类型,相似于数组若是咱们用app

p=docx.paragraphs[0]

就能够直接得到文章中的第一段,而接下来框架

p.text

就是第一段的所有文字内容。若是咱们连贯起来写,代码应该是酱婶滴:spa

for p in docx.paragraphs:
    print(p.text)

怎么样,是否是很方便?设计

不过,这样仅仅是得到了文字内容,而把格式全丢了。我说的格式,是加粗,颜色,居中等等这些排版设计的东西。在paragraph中,这些东西叫作run。一个段落是由许多run组成的,就像这样:
 
而得到run其实也是很是简单的:
p.runs

便可。这一样是个可迭代的类型,能够循环得到每个run相关的内容,好比alignment(对齐方式),bold(加粗),italic(斜体),text(具体文本内容)等等。code

 
能够用dir或help来查看具体的方法使用,内容有点多,我就不挨个介绍了。我只想吐槽一点,我也不知道word中这一堆run是如何来区分的。好比上面的截图,中英文分开不一样的run我能够理解,可是前面那些run彷佛没有什么道理。也许跟word的中文分词方式有关?
 
可是,若是设置了不一样的样式,那么确定会分红不一样的run的。
 
经过查方法不难看出,python-docx这个包,不只能够读出paragraph的内容,还能够往里面写。可使用add_paragraph()方法来添加内容。大概这样:
doc.add_paragraph(u'第一段',style=None) 
doc.add_paragraph(u'第二段',style='Heading 2')
p = doc.add_paragraph('')
p.add_run('第三段', style=None)
p.add_run('123', style="Heading 1 Char")
p.add_run('456')
p.add_run('789', style="Heading 2 Char")

而对于每个属性,均可以查看它的类型,这个类型通常在docx中是个枚举类型的常量,放在docx.enum.text这个头文件中。使用方法能够这样:orm

if p.alignment == WD_PARAGRAPH_ALIGNMENT.CENTER:
    # todo

固然,我所作的这堆工做,目的其实不只仅是为了得到文件内容,还要放在页面上展现。有了上面的属性,作起来就简单多了。

html = "<p"
 
if title in self.paragraph.text and len(self.paragraph.text) < 15:
    html += " style=\"text-align: center; font-size: 30px\">"
elif self.paragraph.alignment == WD_PARAGRAPH_ALIGNMENT.CENTER:
    html += " style=\"text-align: center; font-size: 15px\">"
elif self.paragraph.alignment == WD_PARAGRAPH_ALIGNMENT.RIGHT:
    html += " style=\"text-align: right; font-size: 15px\">"
else:
    html += " style=\"font-size: 15px\">"
 
html += "%s</p>" % p

这样实际上是用代码活生生地生成了一段html。若是是用jinja模板的框架,能够吧这段html直接经过view传到页面上,而后在页面上使用

{{ paragraph|safe }}

来展现。

注意这里的safe过滤器,这个是必须的,不然会尴尬地发现,html代码不会转义,会原样输出出来。
 
固然,还有更尴尬的。有一个问题我尚未解决,那就是列表,我找了很久都没有找到自动编号的位置,甚至去读了word生成的xml文档——word能够另存为xml格式,也能够在python-docx中经过
p.paragraph_format.element.xml
 
方法得到段落的xml——可是分析了半天,我都没弄清楚段落的自动编号是如何生成的,留下了一个巨大的遗憾。
 
写一篇就介绍到这里吧,内容仍是相对简单一些,由于paragraph仍是相对比较好取的。下一篇我将介绍一下table的解析。
相关文章
相关标签/搜索