2017-10-07 77 views
1

我有一个熊猫数据框,需要将它写入Excel中,然后在同一张表上绘制颜色格式并绘制图表。Excel样式和来自熊猫数据框的图表在单个Excel中

我已经使用StyleFrame做Coloring &边框到我的Dataframe,但是这个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() 
+0

“StyleFrame不适用于熊猫XlsxWriter对象”它绝对应该,甚至有它自己的'ExcelWriter'方法来创建它。请提供您使用的代码。 – DeepSpace

+0

@DeepSpace我已经在Question中粘贴了我的代码,在这里我传递了一些来自主代码的数据框,并希望该数据框可以在图表和样式数据表的Excel中给出 –

回答

3

,如果你使用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使用的例子。

+0

谢谢,这很酷。我将在我的代码中应用这个想法。 –

+0

你能否解释一下这部分pos1 =(2,1),pos2 =(2,3)?如何修改类别和数据范围。同时请让我知道如何在此 –

+0

中添加辅助轴图表我编辑了答案,以便它现在包含您要求的内容。我还添加了对使用示例的参考。 – AsafSH