数据分析课程笔记 - 06 - Python 基础知识(六):操
大家好呀,今天是数据分析课程的第 6 课,用 Python 操作 excel 和 word。
在操作 excel 部分,我们会学习第三方模块 openpyxl
的基本使用,了解工作表的创建,掌握 excel 文件读取和表数据,了解绘制图形、添加图片、修改单元格样式等基本操作。
在操作 word 部分,我们会学习如何批量生成工作证明。
一、Python 操作 Excel
1、OpenPyXL 简介
openpyxl 是一个用来读/写 Excel 2010 xlsx/xlsm/xltx/xltm 类型文件的 Python 库。它是一个比较综合的工具,能够同时读取和修改 Excel 文档。其他很多与 Excel 相关的项目基本只支持读或者写 Excel 一种功能。
通过以下方式安装这个第三方库(用豆瓣的镜像源):
pip install -U openpyxl -i https://pypi.douban.com/simple
2、创建工作薄和表
openpyxl
中的 Workbook
方法可以根据路径创建一个新的 Excel文件。
(1)导入模块的两种方法:
# 模块的导入
import openpyxl
from openpyxl import Workbook
(2)根据路径创建新 Excel 文件:
# 1. 创建空白工作薄并保存
wb = openpyxl.Workbook()
# 保存文件
wb.save('./datafile/work1.xlsx')
注意:保存的路径下如果含有同名的文件会被覆盖。
(3)创建工作表并保存:
wb = Workbook()
# 创建工作表时直接指定标题,0表示放在第一个位置
ws = wb.create_sheet('ws1',0)
# 不设置位置会在追加一个表
ws2 = wb.create_sheet('ws2')
# -1表示倒数第二个
ws3 = wb.create_sheet('ws3',-1)
# 保存文件
wb.save('./datafile/work2.xlsx')
注意:无论是创建新的文件还是表,都需要保存。
3、读取文件和表内容
可以根据 openpyxl
的 load_workbook()
方法读取本地存在的文件。
(1)读取文件
from openpyxl import load_workbook
wb = load_workbook('./work2.xlsx')
如果路径不存在,会报错:
image.png文件对象常用属性和方法:
# 获取所有表的名字
print(wb.sheetnames)
# 获取默认工作表
default = wb.active
# 设置工作表的标题default.title = '默认'
print(wb.sheetnames)
# 根据表名获取表
sheet = wb['Sheet']
sheet.title = '表一'
print(wb.sheetnames)
注意:在设置属性值后要记得保存,不然Excel文件内并不会更改。
(2)读取表中数据:
wb = load_workbook('./datafile/读写.xlsx')
# 获取表
sheet = wb['读']
# 获取表数据的行列数
print('行数:',sheet.max_row)
print('列数:',sheet.max_column)
# 获取一列
one_column = sheet['A']
print('一列:',one_column)
# 获取一行
one_row = sheet['1']
print('一行:',one_row)
# 获取一个单元格
one_cell = sheet['A1']
print('一个单元格:',one_cell)
print('A1的值:',one_cell.value)
(3)向表中写入数据:
# 写入数据
wb = load_workbook('./datafile/读写.xlsx')
# 获取表
sheet = wb['写']
# 一个单元格写入内容
sheet['A1'].value = 'A1'
# 写入一列
for i in range(1,11):
sheet['A{}'.format(i)].value = i
# 写入一行
for j in range(1,11):
sheet.cell(row=11,column=j,value=j)
wb.save('./datafile/读写.xlsx')
4、OpenPyXL案例
用 openpyxl
模块来绘制图形、添加图片、修改单元格样式。
(1)添加列数据
现在,我们有一个销售表数据:
image.png在整个数据中,我们可以根据单价和数量列计算出销售额列:
# 1. 了解数据
from openpyxl import load_workbook
wb = load_workbook('./datafile/案例.xlsx')
sheet = wb['订单']
# 获取数据的行列
print(sheet.max_row)
print(sheet.max_column)
获取单价和数量这两个列的值,并添加销售额列:
sheet.cell(row=1,column=19,value='销售额') # 获取列数据
for row_index in range(2,sheet.max_row+1): # 单价数据
one_price = sheet.cell(row=row_index,column=17).value
# 获取数据
one_num = sheet.cell(row=row_index,column=18).value
if one_price==None or one_num==None:
sheet.cell(row=row_index,column=19).value = None
else:
sheet.cell(row=row_index,column=19).value = one_price * one_num
wb.save('./datafile/案例.xlsx')
结果如下:
image.png(2)绘制图形
根据各个省的订单量绘制出柱状图,例如:
image.pngfrom openpyxl import Workbook
from openpyxl import load_workbook
from openpyxl.chart import BarChart, Reference
wb = load_workbook('./datafile/案例.xlsx')
sheet = wb['各省销量']
# 创建柱状图对象
bar_chart = BarChart()
lables= Reference(sheet,min_row=2,max_row=32,min_col=1,max_col=1) data = Reference(sheet,min_row=2,max_row=32,min_col=2,max_col=2)
bar_chart.add_data(data)
bar_chart.set_categories(lables) # 设置图例sheet.add_chart(bar_chart,'D10')
wb.save('./datafile/案例.xlsx')
(3)添加图片
我们也可将专业的绘图工具绘制的图片,添加到指定的位置:
from openpyxl.drawing.image import Image
wb = load_workbook('./datafile/案例.xlsx')
sheet = wb['各省销量']
img = Image('./datafile/image.png')
sheet.add_image(img,'D27')
wb.save('./datafile/案例.xlsx')
(4)修改单元格样式
# 修改单元格样式
from openpyxl.styles import Alignment,Border,Side,Font
from openpyxl.styles.fills import GradientFill
wb = load_workbook('./datafile/案例.xlsx')
sheet = wb['各省销量']
# 设置单元格字体
sheet['A1'].font = Font(
name='黑体', # 设置单元格字体
size=36, #设置字体字号
bold=True, # 加粗
color='FFaa8844' # 单元格文本颜色
)
# 填充渐变颜色(起始颜色,结束颜色),其实颜色和结束颜色一致为固定颜色
sheet['B1'].fill = GradientFill(stop=('00ffff','00ffff'))
wb.save('./datafile/案例.xlsx')
二、Python 操作 word
0、关于 py-docx
py-docx 是用来处理 .docx 文件 (即 word 文档)的 python 第三方库。
在 docx 库中,word 文档内容有三种结构:
- Document 对象表示整个文档;
- Paragrapha 对象标识段落(在 word 文档中每一次回车产生一个新段落);
- Run 对象标识相同样式的文本。
Document 对象包含一个 Paragrapha 对象的列表,Paragraph 对象包含一个 Run 对象的列表。
此外,还有 table 对象,它又包含了 row 和 column 对象,分别代表行和列。
大家可以通过 py-docx 的官方文档了解一下这个库的用法,也可以直接通过下面的小项目直观感受一下 docx 的基本操作。
1、项目需求:批量生成工作证明
基本思路:从 excel 中获取数据,再将对应的数据填入到 word 模板中使用英文字符串占位的位置即可。word模板如下:
image.png需要填写的内容如下:
image.png2、引入所需文件
# 一.引入所需文件
import pandas as pd #pandas库,用来读取excel表格
from docx import Document # Document用来处理word文件
3、定义替换函数
替换文本, 获取 word 中的自然段, 在自然段中获取要替换的文本:
#二. 定义文本替换函数
def replace_text(old_text, new_text):
#读取所有的自然段
all_paragraphs = document.paragraphs
#读取每个自然段
for paragraph in all_paragraphs:
#循环读取所有的run(格式排版内容的东西统称)
for run in paragraph.runs:
#进行新旧文本的替换
run_text = run.text.replace(old_text, new_text)
#进行新旧文本的替换
run.text = run_text
如果word中包含相应的表格, 需要到 word 中的 tables 中进行替换:
#读取所有的表格
all_tables = document.tables print(all_tables)
#循环所有表格
for table in all_tables:
#循环表格中的每一行
for row in table.rows:
#循环读取表格中所有的单元格cells
for cell in row.cells:
#进行新旧文本的替换
cell_text = cell.text.replace(old_text, new_text)
#进行新旧文本的替换
cell.text = cell_text
4、读取 excel 内容进行替换
使用 pandas
读取 excel 文件:
#三. 读取excel内容
pd = pd.read_excel('姓名.xls','Sheet1')
循环读取每一行内容, 将 excel 中的文本批量放入到 word 模板中, 并保存该 word:
#循环读取每一行内容
for row in range(0,len(pd)):
#读取word模板内容
document = Document('模板.docx')
#获取excel中的列字段, 列字段与模板中所填内容的占位文字一致
my_col = pd.columns.tolist()
#获取excel中每一列内容
for col in range(0,pd.shape[1]):
#获取列字段,赋值给旧文本
old_text = my_col[col]
#获取每一个单元格内容,赋值给新内容
new_text = pd.iloc[row,col]
#进行文字替换
replace_text(str(old_text), str(new_text))
#定义文件名为当前excel第一列的内容
filename = str(pd.iloc[row,0])
#按定义的文件名进行保存
document.save("res/%s.docx"%(filename))