本文目录导读:

我来为您详细介绍Python批量操作Excel表格的常用方法和案例。
环境准备
首先安装必要的库:
pip install openpyxl pandas xlsxwriter
批量读取Excel文件
案例1:批量读取多个Excel文件并合并
import pandas as pd
import os
from glob import glob
# 方法1:读取指定文件夹下所有Excel文件
def batch_read_excel(folder_path):
# 获取文件夹下所有xlsx文件
excel_files = glob(os.path.join(folder_path, "*.xlsx"))
all_data = []
for file in excel_files:
# 读取每个Excel文件
df = pd.read_excel(file)
# 添加文件名作为来源标识
df['来源文件'] = os.path.basename(file)
all_data.append(df)
# 合并所有数据
combined_df = pd.concat(all_data, ignore_index=True)
return combined_df
# 使用示例
folder_path = "./excel_files/"
combined_data = batch_read_excel(folder_path)
print(f"合并后的数据形状: {combined_data.shape}")
print(combined_data.head())
批量处理单个Excel文件中的多个工作表
案例2:批量处理一个Excel文件中的所有sheet
import pandas as pd
def process_all_sheets(file_path):
# 读取所有sheet
excel_file = pd.ExcelFile(file_path)
sheet_names = excel_file.sheet_names
processed_data = {}
for sheet_name in sheet_names:
# 读取每个sheet
df = pd.read_excel(file_path, sheet_name=sheet_name)
# 进行数据处理(示例:计算数值列的平均值)
numeric_cols = df.select_dtypes(include=['float64', 'int64']).columns
if len(numeric_cols) > 0:
df[f'{numeric_cols[0]}_平均值'] = df[numeric_cols[0]].mean()
processed_data[sheet_name] = df
return processed_data
# 使用示例
result = process_all_sheets("销售数据.xlsx")
for sheet, data in result.items():
print(f"Sheet: {sheet}, 形状: {data.shape}")
批量写入Excel文件
案例3:批量创建多个Excel文件
import pandas as pd
import numpy as np
from openpyxl import Workbook
import os
def batch_create_excel(output_folder, num_files=5):
# 确保输出文件夹存在
os.makedirs(output_folder, exist_ok=True)
for i in range(1, num_files + 1):
# 生成示例数据
data = {
'姓名': [f'员工{j}' for j in range(1, 11)],
'部门': np.random.choice(['销售', '技术', '财务', '人事'], 10),
'销售额': np.random.randint(10000, 50000, 10),
'提成': np.random.randint(1000, 5000, 10)
}
df = pd.DataFrame(data)
# 保存为Excel文件
file_name = f"报表_{i}.xlsx"
file_path = os.path.join(output_folder, file_name)
df.to_excel(file_path, index=False, sheet_name=f'Sheet{i}')
print(f"已创建: {file_name}")
# 使用示例
batch_create_excel("./output_reports/", 10)
批量数据清洗和处理
案例4:批量清洗多个Excel文件
import pandas as pd
import os
from glob import glob
def batch_clean_excel(input_folder, output_folder):
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 获取所有Excel文件
excel_files = glob(os.path.join(input_folder, "*.xlsx"))
for file_path in excel_files:
try:
# 读取数据
df = pd.read_excel(file_path)
# 数据清洗操作
# 1. 删除空行
df = df.dropna(how='all')
# 2. 填充数值列的缺失值
numeric_cols = df.select_dtypes(include=['float64', 'int64']).columns
df[numeric_cols] = df[numeric_cols].fillna(0)
# 3. 删除重复行
df = df.drop_duplicates()
# 4. 去除字符串前后的空格
string_cols = df.select_dtypes(include=['object']).columns
for col in string_cols:
df[col] = df[col].str.strip()
# 保存清洗后的数据
output_path = os.path.join(output_folder, os.path.basename(file_path))
df.to_excel(output_path, index=False)
print(f"已清洗: {os.path.basename(file_path)}")
except Exception as e:
print(f"处理 {file_path} 时出错: {e}")
# 使用示例
batch_clean_excel("./raw_data/", "./cleaned_data/")
高级批量操作
案例5:批量修改Excel格式和样式
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
import os
from glob import glob
def batch_format_excel(folder_path):
# 定义样式
header_font = Font(bold=True, color="FFFFFF", size=12)
header_fill = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid")
data_font = Font(size=11)
center_align = Alignment(horizontal='center', vertical='center')
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
# 获取所有Excel文件
excel_files = glob(os.path.join(folder_path, "*.xlsx"))
for file_path in excel_files:
try:
# 加载工作簿
wb = load_workbook(file_path)
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
# 格式化表头
for cell in ws[1]:
cell.font = header_font
cell.fill = header_fill
cell.alignment = center_align
cell.border = thin_border
# 格式化数据区域
for row in ws.iter_rows(min_row=2, max_row=ws.max_row, max_col=ws.max_column):
for cell in row:
cell.font = data_font
cell.alignment = center_align
cell.border = thin_border
# 自动调整列宽
for col in ws.columns:
max_length = 0
column = col[0].column_letter
for cell in col:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = min(max_length + 2, 50)
ws.column_dimensions[column].width = adjusted_width
# 保存修改
wb.save(file_path)
print(f"已格式化: {os.path.basename(file_path)}")
except Exception as e:
print(f"格式化 {file_path} 时出错: {e}")
# 使用示例
batch_format_excel("./formatted_excel/")
实用综合案例
案例6:批量报表生成系统
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import os
class BatchReportGenerator:
def __init__(self, output_folder):
self.output_folder = output_folder
os.makedirs(output_folder, exist_ok=True)
def generate_sales_report(self, months_data):
"""生成销售报表"""
for month, num_records in months_data.items():
# 生成模拟销售数据
data = {
'日期': [datetime(2024, month, day) for day in range(1, num_records + 1)],
'产品': np.random.choice(['产品A', '产品B', '产品C', '产品D'], num_records),
'销售员': np.random.choice(['张三', '李四', '王五', '赵六'], num_records),
'数量': np.random.randint(10, 100, num_records),
'单价': np.random.randint(50, 200, num_records),
'金额': [0] * num_records
}
df = pd.DataFrame(data)
df['金额'] = df['数量'] * df['单价']
# 生成统计信息
summary = {
'总销售额': df['金额'].sum(),
'平均销售额': df['金额'].mean(),
'最高销售额': df['金额'].max(),
'销售记录数': len(df)
}
# 保存到Excel
file_name = f"2024年{month}月销售报表.xlsx"
file_path = os.path.join(self.output_folder, file_name)
with pd.ExcelWriter(file_path, engine='openpyxl') as writer:
df.to_excel(writer, sheet_name='销售明细', index=False)
pd.DataFrame([summary]).to_excel(writer, sheet_name='统计摘要', index=False)
print(f"已生成: {file_name}")
def merge_reports(self):
"""合并所有报表"""
excel_files = glob(os.path.join(self.output_folder, "*.xlsx"))
all_data = []
for file_path in excel_files:
df = pd.read_excel(file_path, sheet_name='销售明细')
file_name = os.path.basename(file_path)
df['来源月份'] = file_name.replace('.xlsx', '')
all_data.append(df)
if all_data:
merged_df = pd.concat(all_data, ignore_index=True)
merged_path = os.path.join(self.output_folder, "年度销售汇总.xlsx")
merged_df.to_excel(merged_path, index=False)
print(f"已生成年度汇总: {merged_path}")
# 使用示例
generator = BatchReportGenerator("./sales_reports/")
months_data = {i: 30 for i in range(1, 7)} # 1-6月,每月30条记录
generator.generate_sales_report(months_data)
generator.merge_reports()
性能优化建议
import pandas as pd
from concurrent.futures import ThreadPoolExecutor
import os
def parallel_process_excel(files, process_func, max_workers=4):
"""并行处理多个Excel文件"""
with ThreadPoolExecutor(max_workers=max_workers) as executor:
results = list(executor.map(process_func, files))
return results
def process_single_file(file_path):
"""处理单个文件的函数"""
df = pd.read_excel(file_path)
# 处理逻辑
return df
# 批量处理示例
folder_path = "./data/"
excel_files = glob(os.path.join(folder_path, "*.xlsx"))
results = parallel_process_excel(excel_files, process_single_file)
这些示例涵盖了Python批量操作Excel的常见场景,您可以根据实际需求进行调整和组合使用。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播