【问题标题】:Excel Styles and Chart from Pandas Dataframe in Single Excel单个 Excel 中 Pandas 数据框的 Excel 样式和图表
【发布时间】:2018-03-18 22:17:40
【问题描述】:

我有一个 Pandas 数据框,我需要将其写入 Excel,然后进行颜色格式化并在同一张表上绘制图表。

我已经使用 StyleFrame 对我的数据框进行着色和边框,但是这个 StyleFrame 不适用于 Pandas XlsxWriter 对象。反过来,从这个样式化的数据框中绘制图表也不起作用。

谁能分享一下解决办法!?

import pandas as pd
import xlfunc
import genfunc
from StyleFrame import StyleFrame, Styler, utils

def applystyle(df):
    sf=StyleFrame(df)

    sf.apply_column_style(cols_to_style=df.columns,
                          styler_obj=Styler(bg_color=utils.colors.white, bold=True, font=utils.fonts.calibri,
                                            font_size=8), style_header=True)
    sf.apply_headers_style(
        styler_obj=Styler(bg_color=utils.colors.blue, bold=True, font_size=8, font_color=utils.colors.white,
                          number_format=utils.number_formats.general, protection=False))

    sf.set_column_width(columns=sf.columns, width=15)
    sf.set_row_height(rows=sf.row_indexes, height=12)
    return sf


def createchart(regionname,workbook,outxl,sheetname,cellid,charttitle,startrow,startcol,endrow,endcol):

    worksheet = outxl.sheets[sheetname]
    kpichart = workbook.add_chart({'type': 'line'})
    bsckpi = workbook.add_chart({'type': 'column'})

    for col_num in range(startcol+1, endcol-1):
        kpichart.set_title(
            {'name': charttitle, 'name_font': {'name': 'Cambria', 'size': 18, 'color': '#000000'}})
        kpichart.add_series({
            'name': [sheetname, startrow, col_num],
            'categories': [sheetname, startrow+1, 1, endrow, 1],
            'values': [sheetname, startrow+1, col_num, endrow, col_num],
        })
    nodekpi.add_series({
        'name': [sheetname, startrow, endcol-1],
        'categories': [sheetname,startrow+1,1,endrow,1],
        'values': [sheetname,startrow+1,endcol-1,endrow,endcol-1],
        'y2_axis': True,
    })
    kpichart.combine(nodekpi)
    kpichart.set_x_axis({'name': 'Date'})
    kpichart.set_x_axis({'num_font': {'name': 'Cambria', 'size': 10, 'color': '#000000'}})
    kpichart.set_y_axis({'name': charttitle, 'minor_gridlines': {'visible': True, 'color': '#FFFFFF'}})
    kpichart.set_y_axis({'num_font': {'name': 'Cambria', 'size': 10, 'color': '#000000'}})

    worksheet.insert_chart(cellid, kpichart, {'x_scale': 1.75, 'y_scale': 1.25})


def df_to_xl(regionname,hostlist,timerdf,hostData):

    outxl = pd.ExcelWriter("timer_audit_data.xlsx", engine='xlsxwriter')
    stylexl = StyleFrame.ExcelWriter("timer_audit_data_styled.xlsx")
    outxl.sheets.clear()
    workbook = outxl.book
    stylebook = stylexl.book

    style_timerdf = applystyle(timerdf)
    style_timerdf.to_excel(stylexl, sheet_name='Parameters', index=False)


    timerdfnew = timerdf

    # Pivot
    timer_summary = timerdfnew.pivot_table(values='NODE', index='HOST', columns='timer', aggfunc="count")
    timer_summary = applystyle(timer_summary)
    timer_summary.to_excel(stylexl, sheet_name='Parameters', startrow=0, startcol=15)

    for hostname in hostlist:
        hostname = genfunc.toString(hostname)
        hostData.to_excel(outxl,sheet_name=hostname,startrow=1,startcol=1,index=False)        
        createchart(regionname,workbook,outxl,hostname,'G2',"Timer Performance"+hostname,1,1,tr+1,tc+1)
        #In this Section I am pasting the dataframe to excel workbook & I am preparing a chart in the same sheet
        #But here i would like to apply some colors and borders to hostData pasted in excel and then I want to prepare chart in the same sheet

    outxl.save()
    stylexl.save()

【问题讨论】:

  • "StyleFrame 不适用于 Pandas XlsxWriter 对象" 它绝对应该甚至有自己的 ExcelWriter 方法来创建它。请提供您使用的代码。
  • @DeepSpace 我现在已经将我的代码粘贴到了问题中,这里我从主代码中传递了一些数据框,并希望在 Excel 中给出带有图表和样式数据表的数据框

标签: python pandas charts formatting styleframe


【解决方案1】:

如果您使用 openpyxl 包绘制图表会更好,因为据我所知,StyleFrame 使用 openpyxl 引擎,而 xlsxwriter 包不适用于现有文件。

此示例适用于我的 openpyxl 版本 2.2.5 和 StyleFrame 版本 1.2

import pandas as pd
from openpyxl.charts import BarChart, Reference, Series
from StyleFrame import StyleFrame, Styler, utils


def apply_style(sf):
    sf.apply_headers_style(styler_obj=Styler(bg_color=utils.colors.black, font_color=utils.colors.white, bold=True))
    sf.apply_column_style(cols_to_style=sf.columns, styler_obj=Styler(font_color=utils.colors.blue))

    return sf


def draw_chart_openpyxl(worksheet):
    # pos: (row, column)
    chart = BarChart()
    labels = Reference(worksheet, pos1=(2, 1), pos2=(4, 1))

    valuesA = Reference(worksheet, pos1=(2, 2), pos2=(4, 2))
    seriesA = Series(valuesA, title='A', labels=labels)
    chart.append(seriesA)

    valuesB = Reference(worksheet, pos1=(2, 3), pos2=(4, 3))
    seriesB = Series(valuesB, title='B', labels=labels)
    chart.append(seriesB)

    chart.drawing.top = 100
    chart.drawing.left = 200
    chart.drawing.width = 300
    chart.drawing.height = 200
    worksheet.add_chart(chart)
    return worksheet


if __name__ == '__main__':
    ew = StyleFrame.ExcelWriter('output.xlsx')
    df = pd.DataFrame({
        'A': [1, 2, 3],
        'B': [4, 5, 6]
    }, columns=['A', 'B'], index=['Row 1', 'Row 2', 'Row 3'])

    sf = StyleFrame(df)
    sf = apply_style(sf)
    sf.to_excel(excel_writer=ew, sheet_name='Sheet1')

    draw_chart_openpyxl(ew.book.get_sheet_by_name('Sheet1'))
    ew.save()

你可以找到here很多用法示例。

【讨论】:

  • 你能解释一下这部分 pos1=(2, 1), pos2=(2, 3) 吗?如何修改类别和数据范围。另外请让我知道如何在此中添加辅助轴图
  • 我编辑了答案,现在它包含了您要求的内容。我还添加了对使用示例的引用。
  • 谢谢,现在我可以理解如何修改类别和数据范围了。在此示例中,我可以将两个图表组合成一个图表。你能告诉我如何添加辅助轴图吗?我的意思是主轴中的一个数据范围和次轴中的另一个数据范围。
猜你喜欢
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 2020-08-21
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 2016-02-25
相关资源
最近更新 更多