python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python将CSV转Excel

Python将CSV转Excel的几种方式汇总

作者:小庄-Python办公

本文介绍了5种将CSV文件转换为Excel格式的方法,包括使用pandas(简洁高效)、openpyxl(功能全面)、xlsxwriter(高性能)、csv模块+openpyxl(精细控制)和pandas+美化(专业级),每种方法都有其特点和适用场景,适用于不同需求的数据处理和转换任务

概述

在日常数据处理工作中,CSV(逗号分隔值)文件是最常见的数据格式之一。但有时我们需要将CSV文件转换为Excel格式以便进行更复杂的数据操作、可视化和共享。Python提供了多种成熟的库来完成这个任务,各有优劣。本文将深入介绍5种实现方式,帮助你选择最适合的方案。

方式一:pandas(最简洁)

特点

实现代码

import pandas as pd

# 基础用法
df = pd.read_csv('data.csv')
df.to_excel('output.xlsx', index=False)

# 指定sheet名称
df.to_excel('output.xlsx', sheet_name='数据', index=False)

# 多sheet写入
with pd.ExcelWriter('output.xlsx') as writer:
    df1.to_excel(writer, sheet_name='Sheet1', index=False)
    df2.to_excel(writer, sheet_name='Sheet2', index=False)

适用场景

方式二:openpyxl(最灵活)

特点

实现代码

import csv
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill

# 创建工作簿
wb = Workbook()
ws = wb.active
ws.title = '数据'

# 从CSV读取数据
with open('data.csv', 'r', encoding='utf-8') as f:
    csv_reader = csv.reader(f)
    for row_idx, row in enumerate(csv_reader, 1):
        for col_idx, value in enumerate(row, 1):
            cell = ws.cell(row=row_idx, column=col_idx, value=value)

            # 第一行格式化为标题
            if row_idx == 1:
                cell.font = Font(bold=True, color='FFFFFF')
                cell.fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid')

# 自适应列宽
for column in ws.columns:
    max_length = 0
    column_letter = column[0].column_letter
    for cell in column:
        max_length = max(max_length, len(str(cell.value)))
    ws.column_dimensions[column_letter].width = min(max_length + 2, 50)

wb.save('output.xlsx')

适用场景

方式三:xlsxwriter(高性能)

特点

实现代码

import csv
import xlsxwriter

# 创建Excel文件
workbook = xlsxwriter.Workbook('output.xlsx')
worksheet = workbook.add_worksheet('数据')

# 定义格式
header_format = workbook.add_format({
    'bold': True,
    'bg_color': '#4472C4',
    'font_color': 'white',
    'border': 1
})

data_format = workbook.add_format({
    'border': 1,
    'align': 'left',
    'valign': 'vcenter'
})

# 读取CSV并写入Excel
with open('data.csv', 'r', encoding='utf-8') as f:
    csv_reader = csv.reader(f)
    for row_idx, row in enumerate(csv_reader):
        for col_idx, value in enumerate(row):
            if row_idx == 0:
                worksheet.write(row_idx, col_idx, value, header_format)
            else:
                worksheet.write(row_idx, col_idx, value, data_format)

# 冻结首行
worksheet.freeze_panes(1, 0)

workbook.close()

适用场景

方式四:csv模块 + openpyxl(精细控制)

特点

实现代码

import csv
from openpyxl import Workbook
from openpyxl.utils import get_column_letter

def csv_to_excel(csv_file, excel_file, sheet_name='Sheet1', encoding='utf-8'):
    """
    将CSV转换为Excel

    参数:
        csv_file: CSV文件路径
        excel_file: 输出Excel文件路径
        sheet_name: Excel sheet名称
        encoding: 文件编码
    """
    wb = Workbook()
    ws = wb.active
    ws.title = sheet_name

    with open(csv_file, 'r', encoding=encoding) as f:
        csv_reader = csv.reader(f)
        for row_idx, row in enumerate(csv_reader, 1):
            for col_idx, value in enumerate(row, 1):
                ws.cell(row=row_idx, column=col_idx, value=value)

    wb.save(excel_file)
    print(f"✅ 转换完成: {excel_file}")

# 使用示例
csv_to_excel('data.csv', 'output.xlsx')

适用场景

方式五:pandas + 样式美化(专业级)

特点

实现代码

import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side

def csv_to_excel_pro(csv_file, excel_file, sheet_name='Sheet1'):
    """
    将CSV转换为格式化的Excel(专业级)
    """
    # 第一步:使用pandas读取CSV
    df = pd.read_csv(csv_file)

    # 第二步:用pandas写入Excel
    df.to_excel(excel_file, sheet_name=sheet_name, index=False)

    # 第三步:使用openpyxl美化样式
    wb = load_workbook(excel_file)
    ws = wb.active

    # 定义样式
    header_fill = PatternFill(start_color='366092', end_color='366092', fill_type='solid')
    header_font = Font(bold=True, color='FFFFFF', size=12)
    header_alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)

    border = Border(
        left=Side(style='thin'),
        right=Side(style='thin'),
        top=Side(style='thin'),
        bottom=Side(style='thin')
    )

    # 应用样式到所有单元格
    for row in ws.iter_rows(min_row=1, max_row=ws.max_row, min_col=1, max_col=ws.max_column):
        for cell in row:
            cell.border = border
            cell.alignment = Alignment(horizontal='left', vertical='center', wrap_text=True)

            # 特殊处理头行
            if cell.row == 1:
                cell.fill = header_fill
                cell.font = header_font
                cell.alignment = header_alignment

    # 自适应列宽
    for column in ws.columns:
        max_length = 0
        column_letter = column[0].column_letter
        for cell in column:
            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_letter].width = adjusted_width

    # 冻结首行
    ws.freeze_panes = 'A2'

    wb.save(excel_file)
    print(f"✅ 专业级转换完成: {excel_file}")
    print(f"📊 数据量: {len(df)} 行 × {len(df.columns)} 列")

# 使用示例
csv_to_excel_pro('data.csv', 'output.xlsx', sheet_name='数据')

性能对比

方式速度功能易用性推荐场景
pandas⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐日常数据分析
openpyxl⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐复杂格式需求
xlsxwriter⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐超大文件处理
csv + openpyxl⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐特殊需求
pandas + 美化⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐专业级报告

库的安装

# pandas(包含Excel支持)
pip install pandas openpyxl

# 仅xlsxwriter
pip install xlsxwriter

# 仅openpyxl
pip install openpyxl

常见问题解决

Q1: 编码问题导致乱码?

# 使用encoding参数指定编码
df = pd.read_csv('data.csv', encoding='gbk')  # 或 utf-8, gb2312

Q2: 大文件内存溢出?

# 方案1:使用xlsxwriter(流式写入)
# 方案2:分块处理
chunks = pd.read_csv('data.csv', chunksize=10000)
for chunk in chunks:
    chunk.to_excel('output.xlsx', mode='a')

Q3: 保留原始数据类型?

# 指定dtype
df = pd.read_csv('data.csv', dtype={'ID': str, '金额': float})

Q4: 需要多个CSV合并为一个Excel?

import glob
import pandas as pd

# 读取所有CSV文件
csv_files = glob.glob('*.csv')

with pd.ExcelWriter('merged.xlsx') as writer:
    for csv_file in csv_files:
        df = pd.read_csv(csv_file)
        sheet_name = csv_file.replace('.csv', '')
        df.to_excel(writer, sheet_name=sheet_name, index=False)

最佳实践建议

选择合适的库

数据验证

# 转换前检查
assert not df.isnull().any().any(), "存在空值"
assert len(df) > 0, "数据为空"

错误处理

try:
    df = pd.read_csv('data.csv')
    df.to_excel('output.xlsx', index=False)
except FileNotFoundError:
    print("❌ 文件不存在")
except Exception as e:
    print(f"❌ 转换失败: {e}")

日志记录

import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info(f"成功转换 {len(df)} 行数据")

总结

方案优先级原因
pandas⭐⭐⭐⭐⭐简洁、高效、功能足够
openpyxl⭐⭐⭐⭐需要复杂格式时
xlsxwriter⭐⭐⭐⭐超大文件时

建议方案:在大多数场景下,使用 pandas + openpyxl 的组合方案(方式五)能够提供最好的平衡——既简洁易用,又能生成专业、美观的输出。

以上就是Python将CSV转Excel的几种方式汇总的详细内容,更多关于Python将CSV转Excel的资料请关注脚本之家其它相关文章!

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