数据分析课程笔记|数据分析课程笔记 - 06 - Python 基础知识(六)(操作 excel 和 word)

大家好呀,今天是数据分析课程的第 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、读取文件和表内容
可以根据 openpyxlload_workbook() 方法读取本地存在的文件。
(1)读取文件
from openpyxl import load_workbookwb = load_workbook('./work2.xlsx')

如果路径不存在,会报错:
数据分析课程笔记|数据分析课程笔记 - 06 - Python 基础知识(六)(操作 excel 和 word)
文章图片
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 = 'https://www.it610.com/article/A1'# 写入一列 for i in range(1,11): sheet['A{}'.format(i)].value = https://www.it610.com/article/i# 写入一行 for j in range(1,11): sheet.cell(row=11,column=j,value=j)wb.save('./datafile/读写.xlsx')

4、OpenPyXL案例
openpyxl 模块来绘制图形、添加图片、修改单元格样式。
(1)添加列数据 现在,我们有一个销售表数据:
数据分析课程笔记|数据分析课程笔记 - 06 - Python 基础知识(六)(操作 excel 和 word)
文章图片
image.png 在整个数据中,我们可以根据单价和数量列计算出销售额列:
# 1. 了解数据 from openpyxl import load_workbookwb = load_workbook('./datafile/案例.xlsx') sheet = wb['订单']# 获取数据的行列 print(sheet.max_row) print(sheet.max_column)

获取单价和数量这两个列的值,并添加销售额列:
sheet.cell(row=1,column=19,value='https://www.it610.com/article/销售额') # 获取列数据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).valueif one_price==None or one_num==None: sheet.cell(row=row_index,column=19).value = https://www.it610.com/article/None else: sheet.cell(row=row_index,column=19).value = one_price * one_numwb.save('./datafile/案例.xlsx')

结果如下:
数据分析课程笔记|数据分析课程笔记 - 06 - Python 基础知识(六)(操作 excel 和 word)
文章图片
image.png (2)绘制图形 根据各个省的订单量绘制出柱状图,例如:
数据分析课程笔记|数据分析课程笔记 - 06 - Python 基础知识(六)(操作 excel 和 word)
文章图片
image.png
from openpyxl import Workbook from openpyxl import load_workbook from openpyxl.chart import BarChart, Referencewb = 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 = https://www.it610.com/article/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 GradientFillwb = 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模板如下:
数据分析课程笔记|数据分析课程笔记 - 06 - Python 基础知识(六)(操作 excel 和 word)
文章图片
image.png 需要填写的内容如下:
数据分析课程笔记|数据分析课程笔记 - 06 - Python 基础知识(六)(操作 excel 和 word)
文章图片
image.png 2、引入所需文件
# 一.引入所需文件 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')

【数据分析课程笔记|数据分析课程笔记 - 06 - Python 基础知识(六)(操作 excel 和 word)】循环读取每一行内容, 将 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))

    推荐阅读