首先下载 openpyxl
pip3 install xlsxwriter
1. 读取excel文件
# 打开ecel文件
excel = openpyxl.load_workbook('question.xlsx')
# 寻找页签
book = excel['题库']
# 遍历
for row in book.iter_rows():
for cell in row :
print(cell.value,end=' ')
2.创建excel文件并写入
import xlsxwriter
import openpyxl
# 创建一个Excel文件
excel = xlsxwriter.Workbook('study.xlsx')
# 创建一个页签
book = excel.add_worksheet('考试成绩')
title = ['姓名','性别','年龄','成绩','等级']
_data = [
['张三','男',18,85,'优秀'],
['李四','女',19,75,'良好'],
['王五','男',20,65,'及格'],
['赵六','女',21,55,'不及格']
]
# 写入表头
for index,data in enumerate(title):
# 像表格写入内容,参数1 行索引 参数2 列索引 参数3 内容
book.write(0,index,data)
# 写入数据
for row,data in enumerate(_data):
for col,item in enumerate(data):
book.write(row+1,col,item)
excel.close()
3.读取数据并写入文件
import openpyxl
def read_data():
# 打开文件
wb = openpyxl.load_workbook('good.xlsx')
# 获得活动的页签
sheet = wb.active
# 定义存放每一行数据的列表
row_data = []
# 遍历行
for r in sheet.iter_rows():
# 获取每一行单元格的值
row_values = [cell.value for cell in r]
row_data.append(row_values)
# 返回数据
return row_data
def save_data(_data):
# 创建一个文件
wb = openpyxl.Workbook()
# 使用 wb 保存文件
wb.save('test.xlsx')
# 获得第一个页签
sheet = wb.active
# 添加数据
for i, row in enumerate(_data, start=1):
for j, value in enumerate(row, start=1):
# b使用 sheet.cell 写入数据
sheet.cell(row=i, column=j, value=value)
# 再次保存文件以确保数据写入
wb.save('test.xlsx')
if __name__ == "__main__":
data = read_data()
save_data(data)
4.拆分excel文件(根据特殊的列拆分表格信息放入不同的工作表中)
import openpyxl
def get_data():
# 读取文件 使用load_workbook()
wb = openpyxl.load_workbook('goods.xlsx')
# 获得活动的页签
sh = wb.active # 也可以使用 sh = wb[''] 或者 wb[wb.sheetnames[0]]
# 定义保存所有拆分数据的字典
all_data = {}
# 遍历
for row in sh.iter_rows():
# 获得每一行数据
d = {'type':row[1].value ... 这块根据你的数据表来}
# 定义字典的key值
key = row[0].value
# 如果字典存在这个字段就 追加值 不存在就创建
if all_data.get(key):
all_data[key].append(d)
else:
all_data[key] = [d]
# 返回数据
return all_data
# 保存数据倒每一个以key分的工作表中
def save_data(data):
# 读取文件
wb = openpyxl.load_workbook('goods.xlsx')
# 遍历字典的所有值
for key in data.keys():
# 创建工作表
temp_sheet = wb.create_sheet(key)
# 遍历对应key值里面得所有数据
for i,d in enumerate(data[key],start=1):
temp_sheet.cell(i,1,d['type'])
... 这块也是根据你的表结构
# 保存
wb.save('表格的拆分.xlsx')
if __name__ == '__main__':
data = get_data()
save(data)
5.工作表合并
from openpyxl import load_workbook,Workbook
import os
def copy_data():
# 获得Excel对象
wb = Workbook()
# 获得焦点sheet
sh = wb.active
# 存放处理好的数据
all_data = []
# 遍历要合并的工作簿
for name in os.listdir(./销售表)
# 拼接路径
path = f'./销售表/{name}'
# 打开文件
temp_wb = load_workbook(path)
temp_sh = temp_wb.active
# 遍历工作表
for row in range(1,temp_sh.max_row+1): # 每一行
# 获得一行数据
row_data = []
for col in range(1,tempsh.max_column+1): # 每一列
value = temp_sh.cell(row,col).value # 获得单元格数据
# 追加到行的数据列表中
row_data.append(value)
# 将获取的行数局添加到全局数据中
if row_data not in all_data:
all_data.append(row_data)
# 将数据追加到新的excel中
for data in all_data:
sh.append(data)
# 保存
wb.save('合并后的表格.xlsx')
if __name__ == '__main__':
copy_data()
7.生成工资条案例
from openpyxl import load_workbook,Workbook
def create_excel():
wb = load_workbook('工资数据.xlsx')
sh = wb.active
# 定义表头
title = ["工号","姓名","部门","基本工资","提成","加班工资","社保扣除","考勤扣除","应付工资","邮箱"]
# 遍历每一行
for i,row in enumerate(sh.rows):
# 跳过表头
if i == 0:
continue
else:
# 创建工作簿
temp_book = Workbook()
temp_sh = temp_book.active
temp_sh.append(title) # 添加表头
# 获得当前行数据
row_data = [cell.value for cell in row]
temp_sh.append(row_data) # 将当前数据追加至sheet页中
# 保存数据
temp_wbook.save(f'./工资条/{row_data[1]}.xlsx')
if __name__ == '__main__':
create_excel()
8.查重
from openpyxl import load_workbook,Workbook
from openpyxl.styles import PatternFill # 高亮显示重复数据
def dum():
# 打开文件
wb = load_workbook('打卡时间.xlsx')
sh = wb.active
index = [] 存放重复数据的索引值
tmp = []
# 遍历 B列
for i,c in enumerate(sh['B'])
# 检查是否重复 如果不在tmp 就追加 如果在 就把索引index中
flag = c.value not in tmp
if flag:
tmp.append(c.value)
else:
index.append(i)
# 为重复数据填充颜色
fill = PatternFill('solid',fgColor ='AEEEEE')
for i,r in enumerate(sh.rows):
# 如果是重复的
if i in index:
for c in r: c.fill = fill
print(f'第{i}行数据重复')
# 保存数据
wb.save('查重复数据.xlsx')
if __name__ == '__main__':
dum()
9.提取身份证信息
from openpyxl import load_workbook
from datetime import datetime
def get_code():
# 获取当前年份
now_year = datetime.now().year
wb = load_workbook('身份证信息.xlsx')
sh = wb.active
max_column = sh.max_column # 获得最大列数
for i,cell in enumerate(sh['B']):
pno = cell.value # 获得身份证号
# 6位行政区号 4 位出生年份 2位月份 2位日 4位个人识别码
year = pno[6:10] # 年
month = pno[10:12] # 月
day = pno[12:14] # 日
print(year, month, day,end='\n')
age = now_year - int(year) # 计算年龄
sh.cell(i + 1, max_column + 1).value = f'{year}-{month}-{day}' # 写入出生日期
sh.cell(i+1,max_column+2).value = age # 写入年龄
print(f'第{i+1}行写入完成')
wb.save('提取身份证号信息.xlsx')
if __name__ == '__main__':
get_code()
10 .合并工资条并 添加柱状图
from openpyxl import load_workbook,Workbook
from openpyxl.chart import BarChart, Reference
import os
def merge_salary_sheet():
# 循环遍历工资条文件夹下的所有文件
# 定义存放所有工资条数据的列表
salary_data = []
for file in os.listdir('工资条'):
wb1 = load_workbook(f'工资条/{file}')
sh1 = wb1.active
# 循环遍历工资条表格中的所有行
for row in sh1.rows:
# if row[0].value == '工号':
# # 跳过表头
# continue
# 定义存放一行工资条数据的列表
row_data = []
# 循环遍历工资条表格中的所有单元格
for cell in row:
# 将单元格中的值添加到一行工资条数据的列表中
row_data.append(cell.value)
# 将一行工资条数据的列表添加到所有工资条数据的列表中 并确保没有重复数据
if row_data not in salary_data:
print(row_data)
salary_data.append(row_data)
# 创建一个新的工作簿
wb = Workbook()
# 创建一个新的工作表
sh = wb.active
# 将所有数据写入到新的工作表中
for row in salary_data:
sh.append(row)
# 添加一个新的sheet页
sh1 = wb.create_sheet('工资条柱状图')
# 创建一个柱状图对象
chart = BarChart()
# 设置图表的标题和坐标轴标签
chart.title = '工资条统计'
chart.x_axis.title = '姓名'
chart.y_axis.title = '工资'
# 定义数据范围,使用字符串表示
data = Reference(sh, range_string=f'{sh.title}!I2:I7')
cats = Reference(sh, range_string=f'{sh.title}!B2:B7')
chart.add_data(data, titles_from_data=False)
# 修改:使用 set_categories 方法设置分类
chart.set_categories(cats)
# 将图表添加到工作表中
sh1.add_chart(chart, 'D2')
# 保存工作簿
wb.save('合并工资条.xlsx')
if __name__ == '__main__':
merge_salary_sheet()