docx操控Word文件

Python可以调用python-docx模块创建和操控扩展名为.docx的word文档,在程序中用'import docx"导入。相较于纯文本文件,.docx文件有自己的结构。

在Python-Docx里用三个数据类型来代表:最高层级就是代表整个文件的Document对象。Document对象包含一系列Paragraph对象,代表文件中的各段(文字、表格、图片都行)。每个paragraph段对象包含一个或多个Run对象,word里的内容是在纯文本之上还有字体、大小、颜色和其他格式信息,一个run对象就是相同的格式信息的连续字串,格式变了就需要用一个新的run来表达。

因为总提对象,我们就简单介绍下对象的概念,对象是类的应用实例。类是个抽象的概念,比如猫,不占用内存空间。对象则是具体的,比如加菲猫、凯蒂猫,要实实在在占用内存空间的。每个对象都具有属性和行为函数,比如加菲猫和凯蒂猫都毛茸茸,爪子底下都有肉球,两个眼睛一个鼻子...这是属性;小猫“爱吃鱼”,“爱睡觉”,“捉老鼠”,“追线球”这是行为,在程序中我们就用行为函数来表达。

python-docx把对.docx文档操控的细节都封装到对象的行为函数里了,我们要做的就是调用,无论是加文字、加表格还是加图片,多只要调用相应对象的行为函数就可以了。至于字体啊、大小啊、列表style,表格style......只需要设置对象的相应属性就行啦。

博主蛇之魅惑(https://zhuanlan.zhihu.com/python-dev?topic=Python)有两个很有意思的小程序被我发现翻了出来,一个是用程序在word里画了255个颜色渐变的圆球,另一个是程序控制一段文字每个文字的颜色都不一样,也在视频中分享出来。

看这种真正码农的程序的好处就是长见识,我第一次知道IO模块下的BytesIO可以绕过磁盘操作使用内存作为中转站,还有对颜色的调控,虽然没仔细研究,但下次遇到这方面的问题就知道到那里去找解决办法啦。不知道不可怕,可怕的是不知道自己不知道,看前辈(这个前辈跟年龄无关)的程序的一个好处是知道自己不知道,有机会把“不知道”变成“知道”啦。

这个视频没煞住车,整了快1小时40分,只能硬生生截成两个。还没学会改只声音的办法,讲解错了只能把那小段截下来重录。为了不当老古董,接下去给自己设定的任务是:学会视频剪辑,把excel尽快录完。

import docx
from docx.shared import Cm
from docx.shared import Pt
from PIL import Image, ImageDraw
from io import BytesIO
from docx.shared import RGBColor

recordset = [{'Qty':3,'Name':'Fish','Desc':'Tom'},
             {'Qty':8,'Name':'Cheese','Desc':'Jerry'},
             {'Qty':5,'Name':'Bacon','Desc':'Garfield'}]

document = docx.Document()

# title and body
document.add_heading('Document Title', 0)
p = document.add_paragraph('A plain paragraph having some')
p.add_run(' bold').bold = True
p.add_run('and some ')
p.add_run('italic.').italic = True
document.add_heading('Heading, level 1')
document.add_paragraph('Intense quote', style ='Intense Quote')

# list
document.add_paragraph('first item in unordered list', style = 'List Bullet')
document.add_paragraph('first item in ordered list', style = 'List Number')

# image
document.add_picture('classAndObject.png', width = Cm(10))
document.add_page_break()

# table
table = document.add_table(rows = 1, cols = 3, style = 'Table Grid')

hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Name'
hdr_cells[2].text = 'Desc'

for item in recordset:
	row_cells = table.add_row().cells
	row_cells[0].text = str(item['Qty'])
	row_cells[1].text = item['Name']
	row_cells[2].text = item['Desc']


document.add_page_break()

# draw circle
p = document.add_paragraph()
r = p.add_run()
img_size = 20
for x in range(255):
	im = Image.new('RGB', (img_size, img_size), 'white')
	draw_obj = ImageDraw.Draw(im)
	draw_obj.ellipse((0,0,img_size-1,img_size-1), fill=255-x)
	# save image to buffer
	fake_buf_file = BytesIO()
	im.save(fake_buf_file, "png")
	r.add_picture(fake_buf_file)
	fake_buf_file.close()

document.add_page_break()

# font with changing color
p = document.add_paragraph()
text = '一个人的命运当然要靠自我奋斗,但是也要考虑到历史的进程。'
for i, ch in enumerate(text):
	run = p.add_run(ch)
	font  = run.font
	font.name = 'Silom'
	font.size = Pt(16)
	font.color.rgb = RGBColor(i*10%200 + 55, i*20%200 + 55, i*30%200 + 55)


document.save('ICanDo.docx')



import docx
from docx.shared import Cm
from docx.enum.style import WD_STYLE_TYPE

document = docx.Document('test.docx')

table = document.tables[0]

for row, obj_row in enumerate(table.rows):
    for col, cell in enumerate(obj_row.cells):
        cell.text = '{}, {}'.format(row, col)

table.columns[4].width = docx.shared.Cm(4)

# styles = document.styles
# table_style = [s for s in styles if s.type == WD_STYLE_TYPE.TABLE]
# for style in table_style:
# 	print(style.name)
table.style = 'Table Grid'

row = table.rows[1]
row.cells[0].text = 'elephant'
row.cells[1].text = 'shark'

row_count = len(table.rows)
col_count = len(table.columns)
print('row = {}, column = {}'.format(row_count, col_count))

# row = table.add_row()
document.add_page_break()

# Adding a  picture
document.add_picture('classAndObject.png', width = Cm(5))

document.save('test.docx')


import docx
from docx.shared import Cm
from docx.enum.style import WD_STYLE_TYPE

document = docx.Document('test.docx')

table = document.tables[0]

for row, obj_row in enumerate(table.rows):
    for col, cell in enumerate(obj_row.cells):
        cell.text = '{}, {}'.format(row, col)

table.columns[4].width = docx.shared.Cm(4)

# styles = document.styles
# table_style = [s for s in styles if s.type == WD_STYLE_TYPE.TABLE]
# for style in table_style:
# 	print(style.name)
table.style = 'Table Grid'

row = table.rows[1]
row.cells[0].text = 'elephant'
row.cells[1].text = 'shark'

row_count = len(table.rows)
col_count = len(table.columns)
print('row = {}, column = {}'.format(row_count, col_count))

# row = table.add_row()
document.add_page_break()

# Adding a  picture
document.add_picture('classAndObject.png', width = Cm(5))

document.save('test.docx')



操控word文档之常用操作:
 

操控word文档之“看我能做这些”:

 

1 1 1 1 1 1 1 1 1 1 Rating 2.50 (4 Votes)