python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python操作Excel

三大Python操作Excel文件扩展库的使用指南

作者:E-iceblue

在当今数据驱动的工作环境中,Excel 文件操作已成为 Python 开发者必备的核心技能之一,本文将深入解析三个优秀的 Python Excel 库:openpyxl、pandas 和 Free Spire.XLS for Python,希望对大家有所帮助

在当今数据驱动的工作环境中,Excel 文件操作已成为 Python 开发者必备的核心技能之一。本文将深入解析三个优秀的 Python Excel 库:openpyxlpandas 和 Free Spire.XLS for Python,帮助您根据具体需求选择最佳工具,实现高效 Excel 自动化处理

一、核心工具库对比与选择指南

需求场景推荐库(&补充库)核心优势最佳适用场景
精细单元格操作openpyxl单元格级控制、公式图表支持报表模板生成、格式定制
批量数据处理pandas简洁API、高效数据清洗分析大数据分析、数据清洗转换
企业级解决方案Free Spire.XLS for Python全格式支持、 PDF 导出、跨平台企业系统集成、格式转换需求
Excel交互xlwings支持VBA交互自动化操作、数据分析和报表生成
高效生成xlsxxlsxwriter纯写入、极致格式化、轻量级生成复杂的报表和图表

注:鉴于篇幅有限,本文重点介绍前三个库

二、环境安装与配置

安装三大核心库

pip install openpyxl pandas
pip install free spire.xls

注意:Free Spire.XLS for Python 仅用于学习和测试,企业应用需购买授权

三、openpyxl:专业 Excel 精细控制

核心优势与应用场景

创建专业 Excel 报表

from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
from openpyxl.formatting.rule import ColorScaleRule

# 创建带格式的工作簿
wb = Workbook()
ws = wb.active
ws.title = "销售分析"

# 添加标题行(带样式)
header_font = Font(bold=True, color="FFFFFF")
header_fill = PatternFill(start_color="4F81BD", end_color="4F81BD", fill_type="solid")
ws.append(["产品", "季度", "销售额", "增长率"])
for cell in ws[1]:
    cell.font = header_font
    cell.fill = header_fill

# 添加示例数据
sales_data = [
    ["手机", "Q1", 1500, 0.15],
    ["手机", "Q2", 2100, 0.40],
    ["笔记本", "Q1", 800, -0.05],
    ["笔记本", "Q2", 1200, 0.50]
]
for row in sales_data:
    ws.append(row)

# 添加条件格式
color_scale = ColorScaleRule(start_type='min', start_color='FF0000',
                            end_type='max', end_color='00FF00')
ws.conditional_formatting.add("D2:D5", color_scale)

# 保存专业报表
wb.save("sales_analysis.xlsx")

图表嵌入技术要点

注:复杂图表建议结合 openpyxl 的 BarChart3D 等高级类实现

四、pandas:Excel 数据批处理专家

核心优势与应用场景

多表数据处理与图表嵌入实战

import pandas as pd
import numpy as np

# 创建示例数据集
data = {
    '产品': ['手机', '笔记本', '平板', '耳机'] * 5,
    '月份': np.repeat(['1月', '2月', '3月', '4月', '5月'], 4),
    '销售额': np.random.randint(1000, 5000, 20),
    '成本': np.random.randint(500, 3000, 20)
}
df = pd.DataFrame(data)

# 添加计算列(类似Excel公式)
df['利润率'] = (df['销售额'] - df['成本']) / df['销售额']

# 创建数据透视表
pivot = pd.pivot_table(df, 
                       values='销售额',
                       index='产品',
                       columns='月份',
                       aggfunc='sum',
                       margins=True,
                       margins_name='总计')

# 多表输出到Excel
with pd.ExcelWriter('sales_report.xlsx') as writer:
    df.to_excel(writer, sheet_name='原始数据', index=False)
    pivot.to_excel(writer, sheet_name='数据透视表')
    
with pd.ExcelWriter('sales_report.xlsx', engine='xlsxwriter') as writer:
    # 写入数据
    df.to_excel(writer, sheet_name='原始数据', index=False)
    pivot.to_excel(writer, sheet_name='数据透视表')
    
    # 获取工作簿和工作表对象
    workbook = writer.book
    worksheet = writer.sheets['数据透视表']
    
    # 创建柱状图 (需安装 xlsxwriter)
    chart = workbook.add_chart({'type': 'column'})
    
    # 动态获取数据范围 (B2:F6 为示例范围)
    chart.add_series({
        'name': '销售额',
        'categories': '=数据透视表!$B$2:$F$2',  # 月份数据
        'values': '=数据透视表!$B$3:$F$6',     # 产品销售额
        'gap': 150  # 柱间距
    })
    
    # 设置图表样式
    chart.set_title({'name': '产品月度销售额分布'})
    chart.set_x_axis({'name': '月份'})
    chart.set_y_axis({'name': '销售额 (万元)'})
    
    # 嵌入图表到指定位置
    worksheet.insert_chart('H2', chart)

五、Free Spire.XLS for Python:免费的企业级 Excel 解决方案

核心优势与应用场景

企业级应用实战

import os
from spire.xls import Workbook, FileFormat, DateTime


def process_financial_report(template_path: str, output_excel_path: str,
                             generate_pdf: bool) -> None:
    """
    使用 Free Spire.XLS for Python 处理财务报告模板
    填充数据并导出为Excel和PDF格式
    
    参数:
        template_path: 财务报告模板的完整路径
        output_excel_path: 生成的Excel报告的保存路径
        generate_pdf: 是否额外生成PDF报告
        
    流程:
        1. 加载Excel模板
        2. 填充报告标题和时间戳
        3. 填充季度财务数据
        4. 保存Excel报告
        5. 可选生成PDF报告
    """
    workbook = Workbook()
    try:
        # 加载模板
        workbook.LoadFromFile(template_path)
        # 使用第一个工作表
        worksheet = workbook.Worksheets[0]

        # 设置报告标题
        worksheet.Range["B2"].Text = "2023年度财务报告"

        # 设置当前日期
        worksheet.Range["C5"].DateTimeValue = DateTime.get_Now()

        # 准备数据
        quarterly_data = [["Q1", 1500000, 1200000, 300000],
                          ["Q2", 1650000, 1250000, 400000],
                          ["Q3", 1820000, 1350000, 470000],
                          ["Q4", 2100000, 1450000, 650000]]

        # 数据列对应的列标识
        data_columns = ["A", "B", "C", "D"]

        # 数据起始行(第7行开始)
        START_ROW = 7

        for row_index, quarter_row in enumerate(quarterly_data):
            # 计算当前数据行的行号
            excel_row = START_ROW + row_index

            for col_index, cell_value in enumerate(quarter_row):
                # 获取当前单元格地址
                cell_address = f"{data_columns[col_index]}{excel_row}"

                # 根据数据类型设置单元格值
                if isinstance(cell_value, str):
                    worksheet.Range[cell_address].Text = cell_value
                else:
                    worksheet.Range[cell_address].NumberValue = cell_value

        # 保存Excel报告
        workbook.SaveToFile(output_excel_path, FileFormat.Version2016)

        # 可选生成PDF报告
        if generate_pdf:
            # 替换扩展名
            root, _ = os.path.splitext(output_excel_path)
            pdf_output_path = root + ".pdf"

            workbook.SaveToFile(pdf_output_path, FileFormat.PDF)
            print(f"PDF报告已生成: {pdf_output_path}")

    except Exception as e:
        print(f"报告生成失败: {str(e)}")
        # 实际项目中应记录详细错误日志
        # 可考虑重新抛出异常或返回错误状态码

    finally:
        # 确保释放工作簿资源
        workbook.Dispose()
        print("工作簿资源已释放")


# 使用示例
if __name__ == "__main__":
    # 路径配置(实际使用中建议从配置文件读取)
    TEMPLATE_PATH = "财务模版.xlsx"
    OUTPUT_PATH = "2023财务报告.xlsx"

    process_financial_report(template_path=TEMPLATE_PATH,
                             output_excel_path=OUTPUT_PATH,
                             generate_pdf=True)

六、性能优化与最佳实践

大数据处理技巧

# CSV中转
pd.read_excel("large_dataset.xlsx").to_csv("temp.csv", index=False)

# 分块处理文件
chunk_size = 10000
csv_chunks = pd.read_csv("temp.csv", chunksize=chunk_size)

with pd.ExcelWriter("processed_data.xlsx", engine='openpyxl') as writer:
    for i, chunk in tqdm(enumerate(csv_chunks), desc="Processing"):
        processed = transform_data(chunk)
        # 安全写入策略
        if i >= 200:  # 预留55个sheet给其他数据
            # 合并到主表
            start_row = 0 if i == 0 else writer.sheets['Main'].max_row
            processed.to_excel(writer, sheet_name='Main', startrow=start_row, index=False, header=(i==0))
        else:
            processed.to_excel(writer, sheet_name=f"Part_{i+1}", index=False)

跨平台兼容方案

注:如需 .xls格式支持或 PDF转换,可考虑 Free Spire.XLS for Python等商业库的免费版,但需注意功能限制。开源方案可尝试 odfpy(ODS格式)或 LibreOffice转换工具。

七、总结:选择适合你的Excel工具

功能维度openpyxlpandasFree Spire.XLS for Python
格式支持★★★☆★★★☆★★★★★
单元格控制★★★★★★★☆★★★★☆
大数据处理★★☆★★★★★★★★★☆
图表/公式★★★★☆★★★★★
格式转换★★★★★
学习曲线★★★☆★★★★☆★★★☆

综合评分

1.openpyxl(★★★★☆)

2.pandas(★★★★☆)

3.Free Spire.XLS for Python (★★★★☆)

项目选型建议

通过自动化 Excel 处理流程,典型数据清洗任务耗时从小时级降至分钟级。立即行动:选择适合您项目的库,开始自动化 Excel 处理流程。

以上就是三大Python操作Excel文件扩展库的使用指南的详细内容,更多关于Python操作Excel的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文