使用StyleFrame从pandas到Excel:如何禁用换行文本&缩小以适合?

时间:2017-12-11 20:40:18

标签: python excel pandas styleframe

我使用StyleFrame从pandas导出到Excel。

默认情况下,单元格被格式化为“换行文本”和“缩小到适合”。 (怎么样)我可以更改这些设置吗?

API documentation描述了utils模块包含样式元素使用最广泛的值,并且只要Excel识别它就可以直接使用utils模块中不存在的值。

在这种情况下,我需要为Excel指定什么?我在哪里/哪里可以找到Excel所期望的?非常感谢提前!

我尝试过的例子:

此代码非常完美:

sf.apply_column_style(cols_to_style=['A'], styler_obj=Styler(bg_color=utils.colors.blue))

但我的问题是我不知道要改变什么来关闭文本换行和缩小以适应选项:

sf.apply_column_style(cols_to_style=['A'], styler_obj=Styler(text_control=wrap_text.none))        
NameError: name 'wrap_text' is not defined

sf.apply_column_style(cols_to_style=['A'], styler_obj=Styler(text_control=utils.wrap_text.none)) 
AttributeError: module 'StyleFrame.utils' has no attribute 'wrap_text'

sf.apply_column_style(cols_to_style=['A'], styler_obj=Styler(utils.wrap_text.none)) 
AttributeError: module 'StyleFrame.utils' has no attribute 'wrap_text'

sf.apply_column_style(cols_to_style=['A'], styler_obj=Styler(wrap_text=False))        
TypeError: __init__() got an unexpected keyword argument 'wrap_text'

2 个答案:

答案 0 :(得分:2)

坏消息是你无法在当前版本中做得很好。

好消息是你现在可以修补它,我会在下一个版本中为它公开一个API。

from openpyxl.styles import (PatternFill, Style, Color, Border,
                             Side, Font, Alignment, Protection)
from StyleFrame import StyleFrame, Styler, utils

def my_create_style(self):
    side = Side(border_style=self.border_type, color=utils.colors.black)
    border = Border(left=side, right=side, top=side, bottom=side)
    return Style(font=Font(name=self.font, size=self.font_size, color=Color(self.font_color),
                           bold=self.bold, underline=self.underline),
                 fill=PatternFill(patternType='solid', fgColor=self.bg_color),
                 alignment=Alignment(horizontal='center', vertical='center',
                                     wrap_text=False,  # use True/False as needed
                                     shrink_to_fit=False,  # use True/False as needed
                                     indent=0),
                 border=border,
                 number_format=self.number_format,
                 protection=Protection(locked=self.protection))

Styler.create_style = my_create_style

# rest of code

请记住,这会改变所有Styler个对象的行为。如果你想要更好的控制,你可以修补单个Styler实例,但它需要更多的创造力:

from functools import partial
# ... and rest of imports from above example

# same code as above

a_style = Styler(bg_color=utils.colors.blue)

# this needs to be done BEFORE applying
a_style.create_style = partial(my_create_style, a_style)
sf.apply_column_style(cols_to_style=['A'], styler_obj=a_style)

答案 1 :(得分:2)

从版本 1.3 开始,可以将wrap_textshrink_to_fit直接传递给Styler,例如no_wrap_text_style = Styler(wrap_text=False)