数据分析课程笔记 - 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_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)添加列数据

现在,我们有一个销售表数据:

数据分析课程笔记 - 06 - Python 基础知识(六):操作 excel 和 word_第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')

结果如下:

数据分析课程笔记 - 06 - Python 基础知识(六):操作 excel 和 word_第2张图片
image.png

(2)绘制图形

根据各个省的订单量绘制出柱状图,例如:

数据分析课程笔记 - 06 - Python 基础知识(六):操作 excel 和 word_第3张图片
image.png
from 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模板如下:

数据分析课程笔记 - 06 - Python 基础知识(六):操作 excel 和 word_第4张图片
image.png

需要填写的内容如下:

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')

循环读取每一行内容, 将 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))

你可能感兴趣的:(数据分析课程笔记 - 06 - Python 基础知识(六):操作 excel 和 word)