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

(二)表格篇(table)

(三)样式篇(style)

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


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

唉,还是按毛主席说的,自己动手,丰衣足食吧!
感谢徒弟给打下的基础,我不用挨个碰壁,直接就选择了python-docx这个库。当然,它也只能解析docx文件,解析不了doc文件。安装方式直接pip就可以。下面我们就正式开始解析的过程。
 
在word中的一个自然段,就是一个paragraph,用最简单的方式
docx.paragraphs

就可以获得全部的段落。这是一个可迭代的类型,类似于数组如果我们用

p=docx.paragraphs[0]

就可以直接获得文章中的第一段,而接下来

p.text

就是第一段的全部文字内容。如果我们连贯起来写,代码应该是酱婶滴:

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

怎么样,是不是很方便?

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

即可。这同样是个可迭代的类型,可以循环获得每一个run相关的内容,比如alignment(对齐方式),bold(加粗),italic(斜体),text(具体文本内容)等等。

 
可以用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('', style="Heading 1 Char")
p.add_run('')
p.add_run('', style="Heading 2 Char")

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

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的解析。
 

用python解析word文件(一):paragraph的更多相关文章

  1. 用python解析word文件(二):table

    太长了,我决定还是拆开三篇写.   (一)段落篇(paragraph) (二)表格篇(table)(本篇) (三)样式篇(style) 选你所需即可.下面开始正文. 上一篇我们讲了用python-do ...

  2. 用python解析word文件(三):style

    太长了,我决定还是拆开三篇写.   (一)段落篇(paragraph) (二)表格篇(table) (三)样式篇(style)(本篇) 选你所需即可.下面开始正文. 在前两篇中,我们已经解析出了par ...

  3. 用python解析word文件(段落篇(paragraph) 表格篇(table) 样式篇(style))

    首先需要安装相应的支持库: 直接在命令行执行pip install python-docx 示例代码如下: import docxfrom docx import Document #导入库 path ...

  4. 用python读取word文件里的表格信息【华为云技术分享】

    在企查查查询企业信息的时候,得到了一些word文件,里面有些控股企业的数据放在表格里,需要我们将其提取出来. word文件看起来很复杂,不方便进行结构化.实际上,一个word文档中大概有这么几种类型的 ...

  5. C#仪器数据文件解析-Word文件(doc、docx)

    不少仪器数据报告输出为Word格式文件,同Excel文件,Word文件doc和docx的存储格式是不同的,相应的解析Word文件的方式也类似,主要有以下方式: 1.通过MS Word应用程序的DCOM ...

  6. Python处理word文件

    python对word文件进行读写和复制 import win32conimport win32com.clientimport os #读取word文件def readWoldFile(path): ...

  7. Python解析Wav文件并绘制波形的方法

    资源下载 #本文PDF版下载 Python解析Wav文件并绘制波形的方法 #本文代码下载 Wav波形绘图代码 #本文实例音频文件night.wav下载 音频文件下载 (石进-夜的钢琴曲) 前言 在现在 ...

  8. 用Python将word文件转换成html(转)

    用Python将word文件转换成html   序 最近公司一个客户大大购买了一堆医疗健康方面的科普文章,希望能放到我们正在开发的健康档案管理软件上.客户大大说,要智能推送!要掌握节奏!要深度学习!要 ...

  9. Python解析excel文件并存入sqlite数据库

    最近由于工作上的需求 需要使用Python解析excel文件并存入sqlite 就此做个总结 功能:1.数据库设计 建立数据库2.Python解析excel文件3.Python读取文件名并解析4.将解 ...

随机推荐

  1. .net core 2.2 部署CentOS7(4)CentOS7下载并安装.NET SDK(软件开发工具包)

    目录: .net core 2.2 部署CentOS7(1)安装虚拟机 .net core 2.2 部署CentOS7(2)给虚拟机安装CentOS7 .net core 2.2 部署CentOS7( ...

  2. 深入理解JVM之JVM内存区域与内存分配

    深入理解JVM之JVM内存区域与内存分配 在学习jvm的内存分配的时候,看到的这篇博客,该博客对jvm的内存分配总结的很好,同时也利用jvm的内存模型解释了java程序中有关参数传递的问题. 博客出处 ...

  3. vue 实现父组件和子组件之间的数据双向绑定

    前言:vue 实现父组件给子组件传值,然后子组件可以修改回父组件的值.vue 的 prop 默认是单向数据绑定,但是偶尔需要双向绑定,这时就需要知道如何才能让子组件的数据修改时影响到父组件的数据.转载 ...

  4. 设计模式学习——工厂模式(Factory Pattern)

    1.有一个工厂,专门生产不同品牌的汽车.当有人需要从此工厂提货的时候,只需要告诉他,要什么品牌的,就可以了,并不关心这些车是怎么生产出来的. 2.以上方式,如果增加品牌的时候,也要修改工厂,有点麻烦. ...

  5. python Django html 模板循环条件

    views里返回数据为例: renturn render(request,'xxx.html',{'obj':123,'k1':[1,2,3,4],'k2':{'name':'yooma','age' ...

  6. Code Signal_练习题_Array Replace

    Given an array of integers, replace all the occurrences of elemToReplace with substitutionElem. Exam ...

  7. BZOJ3524: [Poi2014]Couriers(主席树)

    题意 题目链接 Sol 严格众数只会出现一次,那么建出主席树,维护子树siz,直接在树上二分即可 #include<bits/stdc++.h> #define LL long long ...

  8. 用jquery实现带左右按键的轮播图

    成品如下: 简单来说就是点击“右”按钮时,转换到右边的下一幅图片,同时上面的小方块颜色也跟着改变,如果已经是最后一幅图片,再点击“右”,则转换到第一幅图片,是直接向左移找到第一幅图的,明天再做一下无缝 ...

  9. 卷积神经网络(CNN)在语音识别中的应用

    前言 总结目前语音识别的发展现状,dnn.rnn/lstm和cnn算是语音识别中几个比较主流的方向.2012年,微软邓力和俞栋老师将前馈神经网络FFDNN(Feed Forward Deep Neur ...

  10. How To Improve Deep Learning Performance

    如何提高深度学习性能 20 Tips, Tricks and Techniques That You Can Use ToFight Overfitting and Get Better Genera ...