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文档之“看我能做这些”: