
Polars 的 write_excel 默认不支持为不同列设置差异化表头格式,但可通过分段写入 + xlsxwriter 底层控制实现:将 DataFrame 拆分为两部分,分别写入同一工作表的指定位置,并仅为后段启用 header_format={"rotation": 90}。
polars 的 `write_excel` 默认不支持为不同列设置差异化表头格式,但可通过分段写入 + `xlsxwriter` 底层控制实现:将 dataframe 拆分为两部分,分别写入同一工作表的指定位置,并仅为后段启用 `header_format={"rotation": 90}`。
在使用 Polars 导出 Excel 时,header_format 参数(如 {"rotation": 90})会统一作用于全部列标题,无法原生实现“仅旋转最后三列”的精细控制。但借助 xlsxwriter 引擎的底层能力与分段写入策略,我们可绕过该限制,达成目标效果。
核心思路是:将 DataFrame 拆分为“前缀列”和“目标旋转列”两部分 → 分别调用 write_excel 写入同一工作表 → 精确控制第二部分的起始单元格位置 → 仅对第二部分启用旋转格式。
以下为完整可运行示例:
import polars as pl
import xlsxwriter
df = pl.DataFrame({
'A long name': [1, 2, 3],
'Be my guest': [4, 5, 6],
'Come in and find out': ['a', 'b', 'c'],
'Dont stop me now': ['d', 'e', 'f'],
'Easy stuff only': ['g', 'h', 'i'],
})
# 拆分:保留前 n-3 列(不旋转),后 3 列(需旋转)
n = len(df.columns)
df_prefix = df.select(df.columns[:-3])
df_rotated = df.select(df.columns[-3:])
# 计算第二部分起始列(Excel 列字母),例如前 2 列 → 从第 C 列('C1')开始
start_col_letter = chr(ord('@') + len(df_prefix.columns) + 1) # A=65, @=64 → C=67
position_df2 = f"{start_col_letter}1" # 起始位置为第 1 行,对应列首
# 使用 xlsxwriter 工作簿进行分段写入
with xlsxwriter.Workbook('rotated_headers.xlsx') as workbook:
# 写入前缀部分(无旋转)
df_prefix.write_excel(workbook=workbook, worksheet="Sheet1")
# 写入旋转部分:指定位置 + header_format
df_rotated.write_excel(
workbook=workbook,
worksheet="Sheet1",
header_format={"rotation": 90},
position=position_df2
)✅ 关键说明:
-
position参数必须为形如"C1"的字符串,表示左上角单元格坐标; - 列字母计算使用
chr(ord('@') + col_index + 1)是安全的(适用于 A–Z;若列数 >26,需扩展为 AA、AB 等,本文暂不覆盖); - 必须传入同一
workbook实例,确保两部分写入同一文件; -
worksheet名称需严格一致(如"Sheet1"),否则将创建新表。
⚠️ 注意事项:
- 此方案依赖
xlsxwriter(Polars 默认后端),请确保已安装:pip install xlsxwriter; - 若数据含空值或特殊类型,建议在
select()前验证列名顺序,避免因动态列变动导致错位; - 所有样式(如字体、背景色)也可通过
header_format统一配置,仅旋转属性按需差异化。
通过这种“逻辑拆分 + 物理拼接”的方式,你既能保持 Polars 的简洁语法优势,又能突破其高级格式化的边界,精准控制任意子集列的表头呈现效果。


















