Python Pandas实现dataframe导出为Excel 2007格式的文件,并且针对每一列的数据调整到合适宽度,并封装为函数。
此函数能够有效处理大多数情况下的列宽调整需求,确保Excel文件内容清晰易读。
将Pandas DataFrame导出为Excel 2007+格式(.xlsx)并自动调整列宽,可以使用以下函数。该函数会处理索引列和数据列,确保每列宽度适合内容。
python
import pandas as pd
from openpyxl.utils import get_column_letter
def export_to_excel(df, filename, index=False, sheet_name='Sheet1'):
"""
将DataFrame导出为Excel文件,并自动调整列宽。
参数:
df (pd.DataFrame): 要导出的数据框
filename (str): 导出的Excel文件路径
index (bool): 是否包含索引,默认为False
sheet_name (str): 工作表名称,默认为'Sheet1'
"""
with pd.ExcelWriter(filename, engine='openpyxl') as writer:
df.to_excel(writer, index=index, sheet_name=sheet_name)
worksheet = writer.sheets[sheet_name]
columns_info = []
# 处理索引列
if index:
index_name = str(df.index.name) if df.index.name is not None else ''
index_header_len = len(index_name)
index_data = df.index.to_series().astype(str)
index_data_len = index_data.str.len().max() if not index_data.empty else 0
columns_info.append((index_header_len, index_data_len))
# 处理数据列
for col in df.columns:
col_header_len = len(str(col))
col_data = df[col].fillna('').astype(str)
col_data_len = col_data.str.len().max() if not col_data.empty else 0
columns_info.append((col_header_len, col_data_len))
# 调整列宽
for i, (header_len, data_len) in enumerate(columns_info):
max_len = max(header_len, data_len)
adjusted_width = max_len * 1.2 + 2 # 调整系数和缓冲
col_letter = get_column_letter(i + 1)
worksheet.column_dimensions[col_letter].width = adjusted_width
使用示例:
python
# 示例数据
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'Description': ['A long description', 'Short', None]
}
df = pd.DataFrame(data)
df.index.name = 'ID'
# 导出到Excel,包含索引
export_to_excel(df, 'output.xlsx', index=True, sheet_name='Data')
说明:
- 依赖库 :确保安装了
pandas
和openpyxl
,可通过pip install pandas openpyxl
安装。 - 功能 :
- 导出DataFrame到Excel 2007+格式(.xlsx)。
- 自动调整所有列(包括索引列)的宽度,基于标题和数据的最大长度。
- 使用
openpyxl
引擎处理Excel文件。
- 参数 :
df
: 待导出的DataFrame。filename
: 输出文件路径。index
: 是否包含索引,默认不包含。sheet_name
: 工作表名称,默认为"Sheet1"。
- 调整逻辑 :
- 计算每列标题和数据的最大长度。
- 列宽计算公式:
max_length * 1.2 + 2
,可根据需求调整系数。