4.2python操作excel

首先下载 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()



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值