您现在的位置是:网站首页 > 博客日记 >

pandas导出美化技巧

作者:YXN-python 阅读量:41 发布日期:2023-03-25

首先,引入一个库StyleFrame,这个库封装 pandas和openpyxl,让我们轻松的设置DataFrame的样式并导出到excel中。

安装:

pip install styleframe

这个库主要包含3个模块:

  • styleframe:相当于这个库的主入口,它封装了DataFrame对象。
  • styler:用来设置单元格的样式。
  • utils:常用样式元素的辅助类,比如数字和日期格式、颜色和边框类型等。

默认导出

output = "d:\data\output.xlsx"
df.to_excel(output, index=None)

1、行列设置

1.1. 设置自适应

设置内容自适应(shrink_to_fit),确保每个单元格中的内容能够完整显示。

from styleframe import StyleFrame, Styler, utils
style = Styler(shrink_to_fit=True) sf = StyleFrame(df, styler_obj=style)
writer = sf.to_excel(output) writer.close()

1.2. 设置列宽

sf.set_column_width_dict(
  {
      "name": 25,
      "positionInfo": 20,
      "advantage": 15,
      "dealCycleDays": 16,
  }
)

1.3. 设置表头,内容

接下来,我们通过字号对齐方式背景色以及是否加粗来区分表头和内容部分。

header_style = Styler(
    bg_color="yellow",
    bold=True,
    font_size=12,
    horizontal_alignment=utils.horizontal_alignments.center,
    vertical_alignment=utils.vertical_alignments.center,
)
content_style = Styler(
    shrink_to_fit=True,
    font_size=8,
    horizontal_alignment=utils.horizontal_alignments.left,
)

sf.apply_column_style(sf.columns, content_style)
sf.apply_headers_style(header_style)

1.4. 设置行间隔颜色

用不同的背景色区分奇数行和偶数行。

row_style = Styler(
    bg_color="#32CD32",
    shrink_to_fit=True,
    font_size=8,
    horizontal_alignment=utils.horizontal_alignments.left,
)

# 计算要设置背景色的行索引
indexes = list(range(1, len(sf), 2))
sf.apply_style_by_indexes(indexes, styler_obj=row_style)

2. 样式设置

通过Styler类提供的接口,我们可以设置灵活的控制导出的样式。

2.1. 字体

给第一行设置不同的字体(font="STKaiti"):

first_line_style = Styler(
    shrink_to_fit=True,
    font="STKaiti",
    font_size=14,
    horizontal_alignment=utils.horizontal_alignments.left,
)
sf.apply_style_by_indexes(indexes_to_style=[0], styler_obj=first_line_style)

2.2. 颜色

把第一行的字调成蓝色(font_color="blue")。

first_line_style = Styler(
    shrink_to_fit=True,
    font="STKaiti",
    font_size=14,
    font_color="blue",
    horizontal_alignment=utils.horizontal_alignments.left,
)
sf.apply_style_by_indexes(indexes_to_style=[0], styler_obj=first_line_style)

2.3. 背景色

给第一行加一个红色背景(bg_color="red")。

first_line_style = Styler(
    shrink_to_fit=True,
    font="STKaiti",
    font_size=14,
    font_color="blue",
    bg_color="red",
    horizontal_alignment=utils.horizontal_alignments.left,
)
sf.apply_style_by_indexes(indexes_to_style=[0], styler_obj=first_line_style)

2.4. 边框

边框是区隔,突出内容的一种手段,比如,我们可以在表头部分用实线粗边框(border_type=utils.borders.thick),内容部分用虚线细边框(border_type=utils.borders.dashed)。

header_style = Styler(
    bg_color="yellow",
    bold=True,
    font_size=14,
    border_type=utils.borders.thick,
)
content_style = Styler(
    shrink_to_fit=True,
    font_size=12,
    border_type=utils.borders.dashed,
)

sf.apply_column_style(sf.columns, content_style)
sf.apply_headers_style(header_style)

2.5. 数字和日期

定制数字(number_format)和日期(date_format)的显示方式。 总价(totalPrice)保留两位小数,日期(DealDate)改为只显示月和日。

num_style = Styler(
    shrink_to_fit=True,
    font_size=12,
    number_format=utils.number_formats.general_float,
    border_type=utils.borders.dashed,
    horizontal_alignment=utils.horizontal_alignments.left,
)
sf.apply_column_style(["totalPrice", "unitPrice"], num_style)

date_style = Styler(
    shrink_to_fit=True,
    font_size=12,
    date_format="DD/MM",
    border_type=utils.borders.dashed,
    horizontal_alignment=utils.horizontal_alignments.left,
)
sf.apply_column_style("dealDate", date_style)

YXN-python

2023-03-25