python实例学习之openpyxl库


找了点例题学了学

1 openpyxl库

基本操作

网上已经很详细了,学一学 /呲牙笑
Openpyxl超详细笔记
Openpyxl 教程

2 实例一

2.1 问题详述

批量修改excel中多个工作表的内容
针对类似财务报表之类的,如果都为同一格式的工作表,要修改的位置和内容都一样,便可使用python简单操作。
如一个excel中有很多的工作表,每个工作表为每日的出库单或者入库单,需要改变的是表头或者标题或者一些固定单元格,就用标题来做例题吧。

2.2 实现过程

1)load_workbook方法
openpyxl库中我们需要用到load_workbook方法
from openpyxl import load_workbook
该方法使用:load_workbook(filename, read_only=False,keep_vba=KEEP_VBA, data_only=False, keep_links=True)

参数含义:
filename 文件名:打开的路径或一个类文件对象
read_only:优化阅读,内容不能编辑
keep_vba:保存vba内容
data_only:控制带有公式的单元格是否具有公式(默认值)或上次Excel读取工作表时存储的值
keep_links:是否应保留对外部工作簿的链接。默认为True

作用:打开给定的文件名并返回工作簿

2)加载工作簿
wb = load_workbook("领料单(每日).xlsx")
openpyxl处理xlsx后缀的文件

3)获取工作簿的所有工作表名
sheet_names=wb.get_sheet_names()

4)改变目标单元格的值
需要先指定工作表:
ws=wb[sheet_name]
然后改变指定单元格的值(如A4单元格)
ws['A4'].value="改变后的值"

5)遍历工作表,改变单元格的值

for sheet_name in sheet_names: 
    ws=wb[sheet_name]
    ws['A4'].value="改变后的值"

6)保存
wb.save(“领料单(每日)-更改后.xlsx”)
代码示例:

from openpyxl import load_workbook
wb = load_workbook("领料单(每日).xlsx")
sheet_names=wb.get_sheet_names()
for sheet_name in sheet_names: 
    ws=wb[sheet_name]
    ws['A4'].value="改变后的值"
wb.save("领料单(每日)-更改后.xlsx")

2.3 遍历多个工作簿

如果这些表格不是以工作表的形式同意存在于一个工作簿中,而是以一个一个xlsx文件存于文件夹中,那么遍历的就不是工作表而是文件了。这次需要引进os库
import os
1)先得到文件夹内所有的文件名

import os
path ='D:\\pyfile\\xlfile'  # 文件夹路径
files = os.listdir(path)

2)然后类似上边遍历工作表一样遍历文件即可。

3 实例二

3.1 问题叙述

在excel业务表格中查找及替换数据
其中我们有包含替换内容的表格,用来查找替换内容
还有如图右侧的表格,需要查找和替换操作的表格
在这里插入图片描述

3.2 操作过程

1)将左侧表格的内容转换为字典
键为‘查找内容’,值为‘替换内容’

from openpyxl import load_workbook
# 读取工作薄
wb1 = load_workbook('查找替换.xlsx')
ws1 = wb1.active

data = {}
for row in range(2,ws.max_row+1):
    search = str(ws['A'+str(row)].value)
    displace = str(ws['B'+str(row)].value)
    data[search] = displace

2)将右侧表格需要查找修改的内容存入列表中
注:打开表格发现,有些单元格的值为None,在后续处理中需要注意这点

wb2 = load_workbook('原表.xlsx')
ws2 = wb2.active
id_list = []
for row in range(2,ws2.max_row+1):
    id = ws2['D'+str(row)].value
    id_list.append(id)

3)单元格内容查找对比并替换
我们采用的方法为——in,遍历列表值
而表格单元值中还有‘说明码:’的字样,需要用split函数来分割,这时候就需要注意上一步骤提到的,‘None’值,需要加入一个if函数来区分

code = []
for i in id_list:
    if i == None:
        code.append(None)
    else:
        code.append(i.split(':')[-1])
for i in range(len(code)):
    if code[i] in data:
        ws2.cell(row=i+2, column=4).value = id_list[i].split(':')[0]+':'+data[code[i]]

4)保存更改后的文件

wb2.save('替换后.xlsx')

版权声明:本文为kexiiii原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。