【问题标题】:Rotate cell's text when using pd.DataFrame.to_excel?使用 pd.DataFrame.to_excel 时旋转单元格的文本?
【发布时间】:2018-03-08 21:28:13
【问题描述】:

我正在开发一个程序,需要的功能之一是获取 pandas 数据框并将其导出到 Excel。这部分工作正常。但是,在导出时,我需要将一些单元格的文本旋转为垂直而不是默认的水平排列。

这是我目前所拥有的:

output = BytesIO()
writer = pd.ExcelWriter(output, engine='xlsxwriter')
filename = "Data for {} at {} on {}".format(item_no, loc, date)
columns = [('A:A', 18),
           ('B:B', 4),
           ('C:C', 18),
           ('D:Y', 20),
           ('Z:Z', 18),
           ('AA:AA', 12),
           ('AB:AB', 18),
           ('AC:AC', 12),
           ('AD:AD', 4),
           ('AE:AF', 18),
           ('AG:AG', 11),
           ('AH:AK', 16),
           ('AL:AL', 10),
           ('AM:AN', 14.5)]
df = fetch_data(item_no, loc, date)
df.to_excel(writer, index=False, sheet_name='Sheet1')

for col, width in columns:
    writer.sheets['Sheet1'].set_column(col, width)

writer.save()    
writer.close()
output.seek(0)

我知道 xlsxwriter 库有format.set_rotation()from what I can tell,这仅在您使用worksheet.write(..., format) 时使用,而不是在pandas 将每个单元格写入工作表之后。

如何让某些单元格垂直(90 度旋转)而不是水平定向文本?特别是,我对在单元格D1:Y1 中旋转文本感兴趣。

【问题讨论】:

  • 您必须对生成的文件进行后处理 - 可能使用 xlsxwriter 本身,以便向其中添加特定于单元格的选项。
  • 我同意。最好的方法是将数据帧转储到 Excel,然后用帧数据和您想要的格式覆盖单元格 D1:Y1 中的数据。

标签: python python-3.x pandas xlsxwriter


【解决方案1】:

您拥有来自数据帧编写器对象的 xlsxwriter 对象。所以你可以添加一个格式并设置它的属性。然后你可以使用它循环通过writer.sheets['Sheet1'].set_column(col, width)。另一方面,如果您只想轮换列名,您可以选择在df.to_excel() 中设置header=False,然后在循环中一个接一个地写出列名。

我在下面提供了一个示例来说明这一点。如果您只想在 'D1:Y1' 上旋转,您可以设置条件

import pandas as pd

df = pd.DataFrame({"Name": ["A", "B", "C"], "Status": [1, 2, 3]})

writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')

columns = [('A:A', 18),
           ('B:B', 4),
           ('C:C', 18),
           ('D:Y', 20),
           ('Z:Z', 18),
           ('AA:AA', 12),
           ('AB:AB', 18),
           ('AC:AC', 12),
           ('AD:AD', 4),
           ('AE:AF', 18),
           ('AG:AG', 11),
           ('AH:AK', 16),
           ('AL:AL', 10),
           ('AM:AN', 14.5)]

header_list = list(df.columns.values)

df.to_excel(writer, index=False, header=False, startrow=1, sheet_name='Sheet1')

workbook  = writer.book

format = workbook.add_format({})
format.set_rotation(90) 

for col, width in columns:
    writer.sheets['Sheet1'].set_column(col, width)

for i in range (0, len(header_list)):
    writer.sheets['Sheet1'].write(0, i, header_list[i], format)

workbook.close()

预期输出:

【讨论】:

  • 这会将格式应用于整个列,而不仅仅是第一行,对吧?我只是在寻找D1:Y1 而不是D:Y
  • @RagingRoosevelt 我已将答案修改为仅轮换列名。它涉及df.to_excel() 的一些更改并创建列名列表。
  • 谢谢!我通过设置header_list = [(i, v) for i,v in enumerate(df.columns.values) if <v meets criteria>] 然后循环for i, v in header_list: 对您的解决方案进行了一些修改。我希望可能有一种不那么肮脏的方式来做到这一点,但似乎没有:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
相关资源
最近更新 更多