用python操作docx

用python的docx包可以对word文档进行操作,从而帮助实现办公自动化。

1. 常用基本操作

from docx import Document  # 引入包
document = Document()  # 形成一个Document对象
paragraph = document.add_paragraph('我是一个段落')  # 为
prior_paragraph = paragraph.insert_paragraph_before('另一个段落')  # 在最后一个段落之前加一个段落
document.add_heading('一个一级标题',level=1)  # document的一级标题,level默认为1
document.add_heading('一个二级标题',level=2)
document.add_heading('一个大标题',level=0)  # 添加了一个标题页
document.add_page_break()  # 加入分页符
table = document.add_table(rows=2, cols=2) # 加入一个2行2列的表格
cell = table.cell(0, 1)  # 表格的第一行第二列的单元格
cell.text = '单元格的文字'
row = table.rows[1]  # 取表中的第二行
row.cells[0].text = '流浪地球'  # 对行的第一个单元格添加文本
row.cells[1].text = '流浪地球2'  # 对行的第二个单元格添加文本
for row in table.rows:  # table.row或者.columns都是可以迭代的
    for cell in row.cells:
        print(cell.text)
row_count = len(table.rows)
row_count = len(table.columns)  # 计算表格的行数和列数
row = table.add_row()  # 为表格添加空行
row = table.add_row()  # 为表格添加空列

下面是一个例子,用来说明如何将既有的数据加入表格中。

# 构建表格需要的数据
items = (
    (7, '1024', 'Plush kittens'),
    (3, '2042', 'Furbees'),
    (1, '1288', 'French Poodle Collars, Deluxe'),
)

# 添加表格到document
table = document.add_table(1, 3)

# 添加表格的标题行
heading_cells = table.rows[0].cells  # 构建一个标题行的对象
heading_cells[0].text = 'Qty'
heading_cells[1].text = 'SKU'
heading_cells[2].text = 'Description'

# 逐行添加数据
for item in items:
    cells = table.add_row().cells
    cells[0].text = str(item.qty)
    cells[1].text = item.sku
    cells[2].text = item.desc

# 为表格选择一种预制的风格
table.style = 'LightShading-Accent1'  # 更多的风格可以参照table style gallery,
# 或者把word中的表格样式名的中间空格删掉就是名字

和word中一样,可以向document文件中添加图片文件。

document.add_picture('image-filename.png')

# 调节图片大小,设置图片在文件中的宽度(英寸或者厘米)
from docx.shared import Inches
document.add_picture('image-filename.png', width=Inches(1.0)) # 也可以把Inches换成Cm

可以对段落设置风格。

document.add_paragraph('这是添加了格式的一个段落', style='ListBullet')
# 与上方等价的
paragraph = document.add_paragraph('这是一个段落')
paragraph.style = 'List Bullet'

段落中的文本可以设置字体加粗和斜体,但是格式不同的同一段中的文本,就是一个run对象。如果要在一个段落中间设置加粗的文本,则至少要三个run对象,即加粗的文本是一个,加粗字体前后的两节文本各是一个。

# 在段落中继续加入内容
paragraph = document.add_paragraph('这是一个段落。')
paragraph.add_run('在段落里加一句话。')

# 对run对象进行加粗或者斜体,使段落中间的部分加粗
paragraph = document.add_paragraph('这是一个段落。')
run = paragraph.add_run('在段落里加一句话。')
run.bold = True  # 或者 run.italic
paragraph.add_run(' sit amet.')
# paragraph.add_run('dolor').bold = True 可直接添加字体各是

2. 对docx进行的操作

可以使用Document类生成一个新的docx文档,或者打开一个已有文档,或者另存为一个新文档。

from docx import Document

document = Document()  # 创建一个新的文件对象
document.save('test.docx')  # 用这个文件对象创建一个新的docx文件

document = Document('existing-document-file.docx')  # 打开一个已有文档
document.save('new-file-name.docx')  # 将这个文档另存为

可以通过上面的方式打开任何Word2007及之后的版本产生的文档,不支持打开doc文件。也可以像打开一个文本文件一样打开docx文件。

f = open('foobar.docx', 'rb')
document = Document(f)
f.close()

# 或者
with open('foobar.docx', 'rb') as f:
    source_stream = StringIO(f.read())
document = Document(source_stream)
source_stream.close()
# target_stream = StringIO()
# document.save(target_stream)

3. 对文本进行操作

通过构建一个 段落格式 来对全文的各个段落进行统一的设置。

可以通过WD_PARAGRAPH_ALIGNMENT枚举类型对设置文本对齐的方式,包括左对齐、右对齐、居中对齐和两端对齐。

from docx.enum.text import WD_ALIGN_PARAGRAPH
document = Document()
paragraph = document.add_paragraph()
paragraph_format = paragraph.paragraph_format  # 建一个段落格式的对象
paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 居中对齐
paragraph_format.alignment = WD_ALIGN_PARAGRAPH.DISTRIBUTE  # 两端对齐

可以设置段落的缩进,包括首行缩进和悬挂缩进。

from docx.shared import Inches
paragraph = document.add_paragraph()
paragraph_format = paragraph.paragraph_format
paragraph_format.left_indent = Inches(0.5)  # 左悬挂缩进0.5
paragraph_format.left_indent.inches  # 查看缩进属性
paragraph_format.right_indent = Pt(24)  # 右悬挂缩进,用的磅值

# 首行缩进
paragraph_format.first_line_indent
paragraph_format.first_line_indent = Inches(-0.25)  # 首行左缩进

可以设置段间距和行间距。

from docx.shared import Length  # 调出长度设置的对象
paragraph_format.line_spacing = Pt(18)  # 18磅的行间距
paragraph_format.line_spacing = 1.5  # 1.5倍行间距

可以设置分页属性。

paragraph_format.keep_together  # 使整个段落在一页上
paragraph_format.keep_with_next = True

可以设置字符格式。

from docx import Document
document = Document()
run = document.add_paragraph().add_run()  # 设置一个可以调整字体属性的对象
font = run.font
from docx.shared import Pt
font.name = 'Calibri'  # 设置字体风格
font.size = Pt(12)  # 设置字体为12磅
font.italic = True  # 设置为斜体
from docx.shared import RGBColor
font.color.rgb = RGBColor(0x42, 0x24, 0xE9)  # 通过RGB设置字体颜色

在使用过程中,我发现使用Python对docx文档中的字体进行设置会比较琐碎,推荐在一个新建的docx文件中设置好各种标题和正文的格式,通过python-docx读取该文件后,将标题和段落加入到文档中去。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容