Python黑科技!三步实现Excel自动化处理,效率提升10倍!

360影视 欧美动漫 2025-03-21 23:14 3

摘要:# 纯向量化操作(单一条件)# df['计算结果'] = df[df['部门'] == '市场部']['销售额'] * 0.1 * df['工龄']# 使用np.select处理多条件conditions = [df['部门'] == '市场部',df['部门

喜欢的条友记得关注、点赞、转发、收藏,你们的支持就是我最大的动力源泉。

场景:销售部门需要计算员工奖金,但部门不同、规则不同,手动计算易出错?

代码核心:

# 纯向量化操作(单一条件)# df['计算结果'] = df[df['部门'] == '市场部']['销售额'] * 0.1 * df['工龄']# 使用np.select处理多条件conditions = [df['部门'] == '市场部',df['部门'] == '技术部']results = [df['销售额'] * 0.1 * df['工龄'],df['销售额'] * 0.05 * df['工龄']]# df['奖金'] = np.select(conditions, results, default=np.nan)# 使用apply处理复杂计算def complex_calculation(row):if row['部门'] == '市场部':return row['销售额'] * 0.1 * row['工龄']elif row['部门'] == '技术部':return row['销售额'] * 0.05 * row['工龄']else:return Nonedf['计算结果'] = df.apply(complex_calculation, axis=1)

关键点解析:

向量化操作:直接对整列数据运算,比逐行计算快100倍!适合简单条件。np.select的多条件黑科技:同时处理多个条件分支,代码简洁优雅。apply的"瑞士军刀"功能:当规则复杂到无法用公式表达时,用函数封装实现计算。

代码核心:

# 设置标题样式header_style = {'font': Font(name='微软雅黑', bold=True, color='FFFFFF'),'fill': PatternFill(fill_type='solid', start_color='4F81BD'),'alignment': Alignment(horizontal='center', vertical='center')}# 设置数据区域格式thin_border = Border(left=Side(style='thin', color='000000'),right=Side(style='thin', color='000000'),top=Side(style='thin', color='000000'),bottom=Side(style='thin', color='000000'))# 特殊高亮(市场部用黄色背景+红色字体,技术部用红色背景+黄色字体)for row in range(2, ws.max_row + 1):if ws[f'B{row}'].value == '市场部' and ws[f'E{row}'].value is not None:cell = ws[f'E{row}']cell.font = Font(color='FF0000', bold=True)cell.fill = PatternFill(fill_type='solid', start_color='FFFF00')elif ... # 技术部的高亮规则

关键点解析:

视觉心理学:蓝色标题+白色字体,让表格瞬间专业;边框线让数据"井井有条"。色彩心理学:市场部用黄底红字(活力感),技术部用红底黄字(科技感),用颜色区分部门。动态高亮:自动识别有效数据,让关键信息"跳出来",领导一眼就能看到重点!

全流程亮点:

数据安全:用pd.ExcelWriter确保写入不报错,index=False避免生成多余索引列。格式保真:通过openpyxl实现Excel的"像素级"控制。可扩展性:只需修改conditions和results,就能应对各种部门规则变更!

(sales_data.xlsx) 文件数据

姓名 部门 销售额 工龄张三 市场部 6000 2李四 技术部 4500 3王五 市场部 8000 4张三 市场部 6000 1李四 技术部 4500 2王五 市场部 8000 3张三 市场部 6000 3李四 技术部 4500 4王五 市场部 8000 5张三 市场部 6000 5李四 技术部 4500 6王五 市场部 8000 7张三 市场部 6000 8李四 技术部 4500 9王五 市场部 8000 10张三 市场部 6000 3李四 技术部 4500 2王五 市场部 8000 5张三 市场部 6000 3李四 技术部 4500 2王五 市场部 8000 5张三 市场部 6000 3李四 技术部 4500 2王五 市场部 8000 5

“操作excel表.py”文件完整代码:

import pandas as pdimport numpy as npfrom openpyxl import load_workbookfrom openpyxl.styles import Font, PatternFill, Alignment, Border, Side# # 第一步:使用pandas进行数据读取和批量计算# # 读取原始Excel文件input_file = 'sales_data.xlsx'df = pd.read_excel(input_file)# ------开始# 纯向量化操作(单一条件)# df['计算结果'] = df[df['部门'] == '市场部']['销售额'] * 0.1 * df['工龄']# ------结束# ------开始# 使用np.select处理多条件conditions = [df['部门'] == '市场部',df['部门'] == '技术部']results = [df['销售额'] * 0.1 * df['工龄'],df['销售额'] * 0.05 * df['工龄']]# df['奖金'] = np.select(conditions, results, default=np.nan)# ------结束# ------开始# 使用apply处理复杂计算def complex_calculation(row):if row['部门'] == '市场部':return row['销售额'] * 0.1 * row['工龄']elif row['部门'] == '技术部':return row['销售额'] * 0.05 * row['工龄']else:return Nonedf['计算结果'] = df.apply(complex_calculation, axis=1)# ------结束# # 第二步:将计算结果整体写入新Excel文件# output_file = 'processed_data.xlsx'with pd.ExcelWriter(output_file, engine='openpyxl') as writer:df.to_excel(writer, index=False, sheet_name='Sheet1')# # 第三步:使用openpyxl进行批量格式设置# # 加载工作簿wb = load_workbook(output_file)ws = wb.active# 设置标题样式header_style = {'font': Font(name='微软雅黑', bold=True, color='FFFFFF'),'fill': PatternFill(fill_type='solid', start_color='4F81BD'),'alignment': Alignment(horizontal='center', vertical='center')}for col in range(1, 6): # A-E列cell = ws.cell(row=1, column=col)cell.font = header_style['font']cell.fill = header_style['fill']cell.alignment = header_style['alignment']# 设置数据区域格式data_style = {'font': Font(name='宋体', size=11),'alignment': Alignment(vertical='center')}thin_border = Border(left=Side(style='thin', color='000000'), # 左边框right=Side(style='thin', color='000000'), # 右边框top=Side(style='thin', color='000000'), # 顶部边框bottom=Side(style='thin', color='000000') # 底部边框)for row in ws.iter_rows(min_row=2, max_row=ws.max_row, min_col=1, max_col=5):for cell in row:cell.border = thin_bordercell.font = data_style['font']cell.alignment = data_style['alignment']# 设置特殊列样式(E列)highlight_style = {'font': Font(color='FF0000', bold=True),'fill': PatternFill(fill_type='solid', start_color='FFFF00'),'font1' : Font(color='FFFF00', bold=True),'fill1' : PatternFill(fill_type='solid', start_color='FF0000')}for row in range(2, ws.max_row + 1):if ws[f'B{row}'].value == '市场部' and ws[f'E{row}'].value is not None:cell = ws[f'E{row}']cell.font = highlight_style['font']cell.fill = highlight_style['fill']elif ws[f'B{row}'].value == '技术部' and ws[f'E{row}'].value is not None:cell = ws[f'E{row}']cell.font = highlight_style['font1']cell.fill = highlight_style['fill1']# 调整列宽和行高dimensions = {'A': 12, # 姓名列'B': 10, # 部门列'C': 12, # 销售额'D': 8, # 工龄'E': 15 # 计算结果}for col, width in dimensions.items:ws.column_dimensions[col].width = widthws.row_dimensions[1].height = 25 # 标题行高度# 保存最终结果wb.save(output_file)

运行结果(新生成的processed_data.xlsx文件内容):

来源:心静佛现一点号

相关推荐