# python office 自动化办公脚本学习笔记

# 一、下载安装

  1. 下载 python3 (opens new window),然后安装,注意 windows 系统下要勾选添加 PATH 环境变量,不然需要手动配置。
# mac 直接通过 brew 安装。
# 安装 python3 之后,如果 python3 -V 命令不存在,
# 或者 python -V 不是 Python 3.x.x 版本,则重启电脑解决。
brew install python3
1
2
3
4
  1. 下载 pip (opens new window),然后解压文件 pip-21.1.tar.gz 后,使用终端进入文件夹内,执行安装命令。
# python 3.4.x 以后的版本,默认自带 pip3 工具,就不用再安装一次
python3 setup.py install
1
2
  1. 安装 xlrd 模块,用来读取 excel 工作簿。
pip3 install xlrd
1
  1. 安装 xlwt 模块,用来写入 excel 工作簿。
# 注意此模块只支持 excel03 版到 excel2013 版,保存的格式只支持 xls 格式;
# 07 以后的版本 xlsx 不支持。
pip3 install xlwt
1
2
3
  1. 安装 xlsxwriter 模块,处理速度更快、大文件写入和支持 xlsx 格式。
pip3 install xlsxwriter
1
  1. 安装 python-docx 模块,用来自动化生成和修改 word 文档。
pip3 install python-docx
1
  1. 安装 python-pptx 模块,用来自动化生成和修改 PowerPoint 文稿。
pip3 install python-pptx
1
  1. 安装 pywin32 模块,用来把 Word 文档转换成 PDF 文件。
# mac 无法使用此模块,仅限 windows 系统专用
pip3 install pywin32
1
2
  1. 其他教程文章
# https://www.cnblogs.com/zhuwjwh/p/12325688.html
# https://www.cnblogs.com/yanhuidj/p/9011870.html
# https://blog.csdn.net/weixin_44065501/article/details/88899257
# https://blog.csdn.net/AuserBB/article/details/79259328
1
2
3
4

# 二、基础入门

  1. 基本常用函数
# 引入模块
import xlrd
# 读取 excel 文件
data = xlrd.open_workbook('data.xlsx')
# 判断工作表是否已加载状态,入参为下标或工作表名称
print(data.sheet_loaded(0))
# 卸载工作表,入参为下标或工作表名称
print(data.unload_sheet(0))
# 获取全部工作表
print(data.sheets())
# 根据下标索引,获取单个工作表
print(data.sheets()[0])
print(data.sheets_by_index(0))
# 根据工作表名称进行获取
print(data.sheets_by_name('sheet'))
# 获取所有工作表的名称
print(data.sheet_names())
# 返回工作表的数量
print(data.nsheets())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  1. 操作 excel
# 引入模块
import xlrd
# 读取 excel 文件
data = xlrd.open_workbook('data.xlsx')
# 获取第一个工作表
sheet = data.sheet_by_index(0)
# 获取工作表下的有效行数
print(sheet.nrows)
# 获取工作表该行单元格对象组成的列表
print(sheet.row(1))
# 获取单元格的数据类型:1 字符串, 2 数字, 3 时间, 4 布尔值, 5 错误
print(sheet.row_types(2))
# 得到单元格的其中一个value
print(sheet.row(1)[2])
# 得到单元格的指定行value数组
print(sheet.row_values(1))
# 单元格指定行的有效列、长度
print(sheet.row_len(1))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  1. 操作 excel
# 引入模块
import xlrd
# 读取 excel 文件
data = xlrd.open_workbook('data.xlsx')
# 获取第一个工作表
sheet = data.sheet_by_index(0)
# 获取有效列数
print(sheet.ncols)
# 获取第二列,该列单元格对象组成的列表 [empty: '',text: '货号', text: 'X0001', text: 'X0002']
print(sheet.col(1))
# 获取第二列的值
print(sheet.col(1)[2].value)
# 该列所有单元格的value值列表
print(sheet.col_values(1))
# 获取该列所有单元格的数据类型
print(sheet.col_types(1))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  1. 操作 excel 单元格
# 引入模块
import xlrd
# 读取 excel 文件
data = xlrd.open_workbook('data.xlsx')
# 获取第一个工作表
sheet = data.sheet_by_index(0)
# 获取第二行第三列的数据对象
print(sheet.cell(1, 2))
# 获取第二行第三列的数据类型
print(sheet.cell_type(1, 2))
print(sheet.cell(1, 2).ctype)
# 获取数据对象值
print(sheet.cell(1, 2).value)
print(sheet.cell_value(1, 2))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  1. 写入 excel 工作簿,写入样式配置
# 引入模块
import xlwt
# 创建工作簿
wb = xlwt.Workbook()
# 创建工作表,单元格行列允许覆盖重写
ws = wb.add_sheet('CNY', cell_overwrite_ok=True)
# 初始化样式
style = xlwt.XFStyle()
# 为样式创建字体
font = xlwt.Font()
# 指定字体名字
font.name = 'Times New Roman'
# 字体加粗
font.bold = True
# 字体大小,11 字号, 20 衡量单位
font.height = 10*20
# 字体颜色
font.colour_index = 0x08
# 将该font设定为style的字体
style.font = font
# 填充数据
ws.write_merge(0, 1, 0, 5, '2021年货币兑换表', style)
# 写入数据
data = (
  (1,2,3,4,5,6),
  (7,8,9,10,11,12)
)
for i, item in enumerate(data):
  for j, val in enumerate(item):
    ws.write(i + 2, j, val)
# 创建第二个工作簿
wsImage = wb.add_sheet('CNY', cell_overwrite_ok=True)
# 插入图片
wsImage.insert_bitmap('2021.bmp', 0, 0)
# 保存
ws.save('2021-CNY.xls')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  1. 写入文本、图表、图片到 excel 工作表,写入样式配置
import xlsxwriter
# 创建文件
wb = xlsxwriter.Workbook('data.xlsx')
# 初始化格式对象
cell_format = wb.add_format({ 'bold: True' })
# 直接设置格式对象
c1 = wb.add_format()
# 设置加粗
c1.set_bold()
# 设置字体颜色
c1.set_font_color('red')
# 设置字号
c1.set_font_size(14)
# 设置对齐方式
c1.set_align('center')
# 创建工作表
sheet = wb.add_worksheet('sheet')
# 写入单个数据格式
# sheet.write_string()
sheet.write(0, 0, '2021年度', cell_format)
# 合并单元格,文本数据格式化配置
sheet.merge_rang(1, 0, 2, 2, '第一季度销售统计', c1)
data = (
  ['一月份', '500', '450'],
  ['二月份', '600', '500'],
  ['三月份', '700', '550'],
)
# 写入表头
sheet.write_row(3, 0, ['月份', '预期销售额', '实际销售额'])
# 依次写入数据
for index, item in enumerate(data):
  # index + 4 是行的索引,0 是列, item 是写入的内容
  sheet.write_row(index + 4, 0, item)
# 写入 excel 公式,计算总值
sheet.write(7, 1, '=sum(B5:B7)')
sheet.write(8, 2, '=sum(C5:C7)')
# 写入超链接
sheet.write_url(9, 0, 'https://canicode.cn', string='更多数据')
# 写入图片
sheet.insert_image(10, 0, 'view.png')
# 写入图表对象
chart = wb.add_chart({ 'type': 'column' })
# 写入标题
chart.set_title({ 'name': '第一季度销售统计' })
# X、Y 坐标描述信息
chart.set_x_axis({ 'name': '月份'})
chart.set_y_axis({ 'name': '销售额'})
# 图表数据
chart.add_series({
  'name': '预期销售额',
  'categories': '=sheet!$A$5:$A$7',
  'values': ['sheet', 4, 1, 6, 1]
})
chart.add_series({
  'name': '实际销售额',
  'categories': '=sheet!$A$5:$A$7',
  'values': ['sheet', 4, 2, 6, 2],
  'data_labels': { 'value': True }
})
# 插入图表
sheet.insert_chart('A23', chart)
# 结束
wb.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  1. 写入文本、图表、表格到 word 文档,写入样式配置
from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.style import WD_STYLE_TYPE
# 创建文档对象
document = Document()
# 写入内容
document.add_heading('文档简介', level=4)
# 自定义样式
style = document.styles.add_style('textstyle', WD_STYLE_TYPE.PARAGRAPH)
print(style.style_id)
# 样式名字
print(style.name)
# 样式字号
style.font.size = Pt(5)
# 删除样式
# document.styles['textstyle'].delete()
# 写入段落
p1 = document.add_paragraph('canicode.cn 是一个技术博客,记录开发笔记和实践心得,分享一些经验和知识。', style = 'textstyle')
p1.insert_paragraph_before('在此段落之前,插入一段文本')
# 文本格式
formats = p1.paragraph_format
# 左右缩进
formats.left_indent = Pt(20)
formats.right_indent = Pt(20)
# 首行缩进
formats.first_line_indent = Pt(20)
# 行间距
formats.line_spacing = 1.5
# 文本追加写入
run = p1.add_run('追加的文本内容')
# 字号、颜色、字体
run.font.size = Pt(12)
run.font.name = '微软雅黑'
run.font.color.rgb = RGBColor(23, 11, 12)
# 插入图片
document.add_picture('2021.png', Pt(20), Pt(30))
# 插入表格,添加官方内置表格样式
table = document.add_table(rows = 1, cols = 3, style = 'Mediu List 2')
header_cells = table.rows[0].cells
header_cells[0].text = '月份'
header_cells[1].text = '预期销售额'
header_cells[2].text = '实际销售额'
# 数据
data = (
  ['一月份', '500', '450'],
  ['二月份', '600', '500'],
  ['三月份', '700', '550'],
)
# 写入表格
for item in data:
  # 表格新增一行
  rows_cells = table.add_row().cells
  rows_cells[0].text = item[0]
  rows_cells[1].text = str(item[1])
  rows_cells[2].text = str(item[2])
# 获取表格,打印总行数、总列数
print(len(document.tables[0].rows))
print(len(document.tables[0].columns))
# 获取指定行列的文本
print(document.tables[0].cell(0, 2).text)
# 保存文档
document.save('text.docx')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  1. Word 转换 PDF
import os
from win32com.client import constants, gencache
# 定义转换函数
def createPDF(wordPath, pdfPath):
  word = gencache.EnsureDispatch('Word.Application')
  doc = word.Documents.Open(wordPath, ReadOnly=1)
  # 转换
  doc.ExportAsFixedFormat(pdfPath, constants.wdExportFormatPDF)
  # 结束
  word.Quit()
# 单个 doc 文档转换 pdf 文件
createPDF('data.docx', 'data.pdf')
# 当前文件夹下的所有文件
all = os.listdir('.')
wordFiles = []
for file in all:
  if file.endswith(('.doc', '.docx')):
    wordFiles.append(file)
# 多个文件的转换
for file in wordFiles:
  filepath = os.path.abspath(file)
  index = filepath.rindex('.')
  pdfPath = filepath[:index] + '.pdf'
  createPDF(filepath, pdfPath)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  1. 写入文本、图形、表格到 PPT 演示文稿
import pptx
from pptx.util import Inches, Pt
from pptx.enum.shapes import MSO_SHAPE
from pptx.dml.color import RGBColor
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.enum.chart import XL_LEGEND_POSITION
# 创建文稿对象
prs = pptx.Presentation()
# 新增幻灯片的个数和格式
slide = prs.slides.add_slide(prs.slide_layouts[0])
prs.slides.add_slide(prs.slide_layouts[1])
prs.slides.add_slide(prs.slide_layouts[1])
# 删除一个幻灯片
del prs.slides._sldIdLst[1]
# 添加文本框,坐标、宽高都是5英寸
text1 = slide.shapes.add_textbox(Inches(5), Inches(5), Inches(5), Inches(5))
text1.text = '我是文本框'
# 追加文本段落
p1 = text1.text_frame.add_paragraph()
p1.text = '我是段落start'
# 追加文本内容
p1.add_run().text = '文本内容end'
# 获取幻灯片所有的图形,访问要写入的元素
title_shape = slide.shapes.title
title_shape.text = '标题1'
slide.shapes.placeholders[1].text = '标题2'
# 添加自选图形
shape = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, Inches(2), Inches(2), Inches(5), Inches(3))
# 填充、边框
fill = shape.fill
fill.solid()
fill.fore_color.rgb = RGBColor(255, 0, 0)
line = shape.line
line.color.rgb = RGBColor(55, 32, 10)
line.width = Pt(2)
# 添加表格
table = slide.shapes.add_table(3, 3, Inches(2), Inches(2), Inches(4), Inches(2)).table
# 填充内容
table.cell(1, 0).text = 'name'
table.cell(1, 1).text = 'age'
table.cell(1, 2).text = 'class'
table.cell(2, 0).text = '张三'
table.cell(2, 1).text = '10'
table.cell(2, 2).text = '一班'
# 合并单元格
cell = table.cell(0, 0)
cell1 = table.cell(0, 2)
cell.merge(cell1)
table.cell(0, 0).text = '班级学生信息'
# 单元格是否合并
print(cell.is_merge_origin)
# 如果是合并后的单元格,则可以取消合并单元格,不然会报错
cell.split()
# 写入图表对象
chart_data = CategoryChartData()
# X 轴数据
chart_data.categories = ['一月份', '二月份', '三月份']
# Y 轴数据
chart_data.add_series('Y2021', (300, 400, 500))
chart_data.add_series('Y2022', (340, 430, 600))
chart = slide.shapes.add_chart(XL_CHART_TYPE.COLUMN_CLUSTERED, Inches(2), Inches(2), Inches(6), Inches(4), chart_data).chart
# 设置图表标题
chart.has_title = True
chart.chart_title.text_frame.text = '第一季度销售额'
# 图例显示
chart.has_legend = True
chart.legend.position = XL_LEGEND_POSITION.RIGHT
# 保存
prs.save('text.pptx')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

# 三、结语

Python 操作 Office 所使用到的各个模块的 API 文档,可以查阅官方文档。通过不断练习才能掌握,熟能生巧,帮助我们解决工作中、生活中的自动化办公需求。

Last Updated: 2023/9/18 06:50:08