Python第三⽅库之docx
⼀、安装
pip install python-docx
⼆、写⼊word
word 中主要有两种⽤⽂本格式等级:块等级(block-level)和内联等级(inline-level)word 中⼤部分内容都是由这两种等级的对象组成的(其他的诸如眉页、引脚等,docx 库的作者还在开发中)
块等级(block-level):也就是段落
块对象⼀般包括:段落(paragraph)、图⽚(inline picture)、表(table)、标题(heading)、有序列表(numbered lists)、⽆序列表(bullets lists)
段落是 word ⽂件中的主要块对象(block-level object),块等级项(block-level item)主要任务是将⽂本格式从左边界向右边界展⽰(flows);对于段落⽽⾔,边界就是分段标识,或者是⽂本的列边界,列表(table)也是块对象(block-level object)
内联等级(inline-level):也就是字体
内联对象(inline-level object)是块对象(block-level object)的组成部分,块对象的所有内容都包含在内联对象中,⼀个块对象由⼀个或多个内联对象组成,run 是常⽤的内联对象,例如:
p = document.add_paragraph('This is paragraph')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True
这个例⼦中⼀个段落(块对象)包含三个 run(内联对象),每⼀个 run 都设置有不同属性
写word⽰例:
# coding:utf-8
import sys
from docx import Document
from docx.shared import Inches
def main():
reload(sys)
sys.setdefaultencoding('utf-8')
# 创建⽂档对象
document = Document()
# 新增样式(第⼀个参数是样式名称,第⼆个参数是样式类型:1代表段落;2代表字符;3代表表格)
style = doc.styles.add_style('style name 1', 2)
# 从样式库中选取 'Normal' 样式,并设置 'Normal' 样式的字符属性(font)
style = document.styles['Normal']
style.font.name = "Microsoft YaHei UI"
style.font.size = Pt(50)
# 将设置好字符属性的样式运⽤到段落中
# p = document.add_paragraph("change font attribution", style = 'Normal')
# 从样式库中选取 'Heading 2'' 样式,并设置段落格式(paragraph format)
style = document.styles['Heading 2']
style.paragraph_format.left_indent = Pt(20)
style.paragraph_format.widow_control = True
# 将设置好段落格式的 style 运⽤到段落中
# p = document.add_paragraph('This is Heading, level 1', style = style)
# 设置⽂档标题,中⽂要⽤unicode字符串
document.add_heading(u'我的⼀个新⽂档',0)
from docx.shared import RGBColor,Inches,Pt
um.text import WD_ALIGN_PARAGRAPH
# 往⽂档中添加段落
p = document.add_paragraph('This is a paragraph having some ')
p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER # WD_ALIGN_PARAGRAPH.LEFT,左对齐;WD_ALIGN_PARAGRAPH.RIGHT,右对齐 p.paragraph_format.left_indent = Inches(0.5) # 设置段落从左开始缩进,使⽤Inches来衡量
p.paragraph_format.right_indent = Pt(20) # 设置段落从右开始缩进,使⽤Pt来衡量
p.paragraph_format.first_line_indent = Inches(0.5) # 设置段落第⼀⾏缩进,可以与上两个缩进叠加
p.paragraph_format.space_after = Pt(5) # 设置与上⼀段间隔 Pt(5)
p.paragraph_format.space_before = Pt(10) # 设置与下⼀段间隔 Pt(10)
p.paragraph_format.line_spacing = Pt(18) # ⾏距
p_run = p.add_run('xxx')
p_run.font.italic = True # 设置为斜体
p_run.font.size = Pt(12) # 设置字体⼤⼩
p_b = RGBColor(0, 0, 0) # 设置字体颜⾊
p_run.font.name = u"宋体" # 设置字体样式
p_run.font._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体') # 设置字体样式
p_run.font.underline = False # 不设置下划线
p_run.font.bold = None # 设置粗体为继承上⼀个字体的格式
# 这⼀类属性,每个有三种状态:True 为使⽤属性;False 为不使⽤属性;None 默认属性继承⾃上⼀个字体
# 添加⼀级标题
document.add_heading(u'⼀级标题, level = 1',level = 1)
document.add_paragraph('Intense quote',style = 'IntenseQuote')
# 添加⽆序列表
document.add_paragraph('first item in unordered list',style = 'ListBullet')
# 添加有序列表
document.add_paragraph('first item in ordered list',style = 'ListNumber')
document.add_paragraph('second item in ordered list',style = 'ListNumber')
document.add_paragraph('third item in ordered list',style = 'ListNumber')
# 添加图⽚,并指定宽度
document.add_picture('e:/docs/pic.png',width = Inches(1.25))
# 添加表格: 1⾏3列
table = document.add_table(rows = 1,cols = 3)
# 获取第⼀⾏的单元格列表对象
hdr_cells = ws[0].cells
# 为每⼀个单元格赋值,值都要为字符串类型
hdr_cells[0].text = 'Name'
hdr_cells[1].text = 'Age'
hdr_cells[2].text = 'Tel'
# 为表格添加⼀⾏
new_cells = table.add_row().cells
new_cells[0].text = 'Tom'
new_cells[1].text = '19'
new_cells[2].text = '12345678'
# 添加分页符
document.add_page_break()
# 往新的⼀页中添加段落
p = document.add_paragraph('This is a paragraph in new page.')
python官方文档中文版# 保存⽂档
document.save('e:/docs/demo1.docx')
if __name__ == '__main__':
main()
运⾏程序会得到⼀个下⾯的⽂档
三、读⽂档
对于⽂件名是中⽂的读取时会报错
doc.paragraphs # 段落集合
doc.tables # 表格集合
doc.sections # 节 集合
doc.styles # 样式集合
doc.inline_shapes # 内置图形 等等...读取已有的word⽂档⽰例
# coding:utf-8
import sys
from docx import Document
def main():
reload(sys)
sys.setdefaultencoding('utf-8')
# 创建⽂档对象,写⾃⼰的 word 路径
document = Document('e:/docs/demo2.docx')
# 读取⽂档中所有的段落列表
ps = document.paragraphs
# 每个段落有两个属性:style和text
ps_detail = [(x.text,x.style.name) for x in ps]
with open('p','w+') as fout:
fout.write('')
# 读取段落并写⼊⼀个⽂件
with open('p','a+') as fout:
for p in ps_detail:
fout.write(p[0] + '\t' + p[1] + '\n\n')
# 读取⽂档中的所有段落的列表
tables = document.tables
# 遍历table,并将所有单元格内容写⼊⽂件中
with open('p','a+') as fout:
for table in tables:
for row ws:
for cell lls:
fout. + '\t')
fout.write('\n')
if __name__ == '__main__':
main()
四、其他事项
1、如果段落中是有超链接的,那么段落对象是读取不出来超链接的⽂本的,需要把超链接先转换成普通⽂本,⽅法:全选word⽂档的所有内容,按快捷键Ctrl+Shift+F9即可。
2、读取某些⽂件时会报错,ptions.PackageNotFoundError: Package not found。原因:docx⽆法识别doc,需要先⼿动或者使⽤win32com转换
from win32com import client as wc
import docx
def doSaveAas():
word = wc.Dispatch('Word.Application')
doc = word.Documents.Open(u'E:\old.doc') # ⽬标路径下的⽂件
doc.SaveAs(u'E:\\new_path.docx', 12, False, "", True, "", False, False, False, False) # 转化后路径下的⽂件
doc.Close()
word.Quit()
doSaveAas()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论