使用pd.DataFrame.to_excel时如何旋转单元格文本?
解决Pandas导出Excel时设置部分单元格垂直文本的问题
嘿,我之前也碰到过一模一样的需求,其实不用纠结——pandas和xlsxwriter完全可以配合实现这个功能,关键是要拿到pandas导出时对应的workbook和worksheet对象,然后用xlsxwriter的格式工具来设置。下面我给你两种常用的实现方式:
方法一:写入DataFrame时直接指定格式(适合整列/批量单元格)
这种方式适合你提前知道哪些列或区域需要垂直文本的场景,步骤很清晰:
- 先创建xlsxwriter的格式对象,设置文本旋转角度(90度逆时针是从上到下的垂直排列,270度顺时针是从下到上,根据你的需求选);
- 用pandas的
ExcelWriter指定xlsxwriter引擎,写入DataFrame; - 获取对应的workbook和worksheet对象,用
set_column给整列加格式,或者用write给特定单元格覆盖格式。
代码示例:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ '常规文本': ['张三', '李四', '王五'], '垂直文本': ['需要垂直显示', '这里是垂直', '文本内容'] }) # 创建ExcelWriter并写入DataFrame writer = pd.ExcelWriter('垂直文本示例.xlsx', engine='xlsxwriter') df.to_excel(writer, sheet_name='Sheet1', index=False) # 获取xlsxwriter的工作簿和工作表对象 workbook = writer.book worksheet = writer.sheets['Sheet1'] # 创建垂直文本格式:rotation=90是从上到下的垂直排列 vertical_format = workbook.add_format({'rotation': 90}) # 给整列设置垂直格式(这里"垂直文本"列是第2列,对应xlsxwriter的列索引1) worksheet.set_column('B:B', None, vertical_format) # 如果只想给特定单元格设置,比如B2单元格(对应df的第0行第1列) # worksheet.write(1, 1, df.iloc[0, 1], vertical_format) # 保存并关闭writer writer.close()
方法二:写入后给零散单元格设置格式
如果你的垂直文本单元格是分散的,没有规律,可以先写入整个DataFrame,再遍历需要修改的单元格,用xlsxwriter的write方法重新写入单元格内容并附带格式(注意:xlsxwriter不支持直接修改已写入单元格的格式,必须重写内容覆盖)。
代码示例(接上面的代码):
# 假设要设置B3和B4单元格为垂直文本(对应Excel行号3、4,xlsxwriter的行索引2、3) target_cells = [(2, 1), (3, 1)] # (行索引, 列索引) for row_idx, col_idx in target_cells: # 获取原单元格的值 cell_value = df.iloc[row_idx - 1, col_idx] # 因为df的行从0开始,Excel表头是行索引0,数据从行索引1开始 # 重写单元格并应用垂直格式 worksheet.write(row_idx, col_idx, cell_value, vertical_format) writer.close()
注意事项
- 旋转角度:
rotation=90是逆时针旋转90度,文字从上到下垂直;rotation=270是顺时针旋转90度,文字从下到上垂直,按需选择; - 合并单元格:如果要给合并后的单元格设置垂直文本,需要在合并时指定格式,或者给合并区域的左上角单元格应用格式;
- 必须用xlsxwriter引擎:确保
ExcelWriter的engine参数设为'xlsxwriter',其他引擎(比如openpyxl)的操作方式不同。
内容的提问来源于stack exchange,提问作者RagingRoosevelt
相关产品推荐
相关产品推荐

