Python将CSV转Excel的几种方式汇总
更新时间:2026年04月10日 08:26:29 作者:小庄-Python办公
本文介绍了5种将CSV文件转换为Excel格式的方法,包括使用pandas(简洁高效)、openpyxl(功能全面)、xlsxwriter(高性能)、csv模块+openpyxl(精细控制)和pandas+美化(专业级),每种方法都有其特点和适用场景,适用于不同需求的数据处理和转换任务
概述
在日常数据处理工作中,CSV(逗号分隔值)文件是最常见的数据格式之一。但有时我们需要将CSV文件转换为Excel格式以便进行更复杂的数据操作、可视化和共享。Python提供了多种成熟的库来完成这个任务,各有优劣。本文将深入介绍5种实现方式,帮助你选择最适合的方案。
方式一:pandas(最简洁)
特点
- ✅ 代码最简洁,仅需一行
- ✅ 功能完整,支持多sheet转换
- ✅ 性能优秀,适合大文件
- ⚠️ 需要openpyxl或xlsxwriter作为引擎
实现代码
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)
适用场景
- 数据分析和处理
- 批量转换多个CSV文件
- 需要保留数据格式
方式二:openpyxl(最灵活)
特点
- ✅ 功能最全面,支持格式化、公式、图表
- ✅ 适合复杂的Excel操作
- ✅ 可修改现有Excel文件
- ⚠️ 性能稍低,代码更复杂
实现代码
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')
适用场景
- 需要自定义格式和样式
- 添加公式或图表
- 修改现有Excel文件
方式三: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文件(百万行+)
- 需要快速转换
- 简单的格式需求
方式四:csv模块 + openpyxl(精细控制)
特点
- ✅ 对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')
适用场景
- 需要处理特殊编码
- 自定义数据验证逻辑
- 复杂的CSV结构
方式五:pandas + 样式美化(专业级)
特点
- ✅ 结合pandas和openpyxl的最佳实践
- ✅ 代码简洁且功能完整
- ✅ 输出专业美观
- ✅ 适合商业场景
实现代码
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)
最佳实践建议
选择合适的库
- 日常使用:优先pandas(简洁高效)
- 格式复杂:选用openpyxl(功能完整)
- 超大文件:使用xlsxwriter(性能最优)
数据验证
# 转换前检查 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的资料请关注脚本之家其它相关文章!
相关文章
Python Matplotlib 基于networkx画关系网络图
这篇文章主要介绍了Python Matplotlib 基于networkx画关系网络图,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-07-07
利用python计算均值、方差和标准差(Numpy和Pandas)
这篇文章主要给大家介绍了关于利用python计算均值、方差和标准差的相关资料,Numpy在Python中是一个通用的数组处理包,它提供了一个高性能的多维数组对象和用于处理这些数组的工具,它是使用Python进行科学计算的基础包,需要的朋友可以参考下2023-11-11


最新评论