openpyxl图表错误栏样式

时间:2016-03-15 18:10:28

标签: python python-2.7 charts openpyxl

我被分配了一个简单的"将一系列数据列收集到结果工作簿的任务。结果工作簿包含分析结果的必要公式和图表。数据由我用python编写的图像分析应用程序生成,作为一系列excel工作簿。

现在的问题是openpyxl会删除excel工作簿中的所有现有图表。我花了一天时间弄清楚如何使用openpyxl图表,其中有一些文档和图表错误栏,没有任何示例。有来源有简洁的评论..

使用win32com扩展程序可以直接与Excel进行交互,但除了在Windows中安装Excel之外,这显然不会起作用。情况可能并非如此。还试图弄清楚如何与Excel进行交互可能需要一段时间而不是从VBA宏中进行。

...

对于设置图表样式,有一个相对好的方法,有点像这样:

valuewidth=openpyxl.utils.units.points_to_pixels(2.25)
valuewidth=openpyxl.utils.units.pixels_to_EMU(valuewidth)
redcolor=openpyxl.drawing.colors.ColorChoice(prstClr="red")
bluecolor=openpyxl.drawing.colors.ColorChoice(prstClr="blue")

xvalues = openpyxl.chart.Reference(exceldata.sheetrep, min_col=exceldata.seriesx['column'], min_row=exceldata.seriesx['row'], max_row=exceldata.seriesx['row']+exceldata.seriesx['rows'])
values = openpyxl.chart.Reference(exceldata.sheetrep, min_col=exceldata.seriesy['column'], min_row=exceldata.seriesy['row'], max_row=exceldata.seriesy['row']+exceldata.seriesy['rows'])
series = openpyxl.chart.Series(values, xvalues, title_from_data=True)
series.graphicalProperties.line.width=valuewidth
series.graphicalProperties.line.solidFill=bluecolor
chart.series.append(series)

现在使用错误栏,必须像这样定义和创建它们:

errorwidth=openpyxl.utils.units.points_to_pixels(1)
errorwidth=openpyxl.utils.units.pixels_to_EMU(errorwidth)
errorlinetype=openpyxl.drawing.line.LineProperties(w=errorwidth, solidFill=redcolor)
errorline=openpyxl.chart.shapes.GraphicalProperties(ln=errorlinetype)
values = openpyxl.chart.Reference(exceldata.sheetrep, min_col=exceldata.lowerlim['column'], min_row=exceldata.lowerlim['row'])
xvalues = openpyxl.chart.Reference(exceldata.sheetrep, min_col=exceldata.lower['column'], min_row=exceldata.lower['row'])
chart.title="LL"
errorbar=openpyxl.chart.error_bar.ErrorBars(errBarType="minus",errValType="percentage",val=100.0, spPr=errorline)
errorbar.NumDataRef="LL"
series = openpyxl.chart.Series(values, xvalues, title=None, title_from_data=False)
series.errBars=errorbar
chart.series.append(series)

现在我想知道是否可以通过首先定义用于创建GraphicalProperties对象的LineProperties来跳过构建spPr对象的方法,然后在实例化过程中将其提供给ErrorBars方法。

NumDataRef似乎没有做任何事情。它没有记录。

编辑在任何情况下,对NumDataRef的调用可能都是错误的。加号和减号参数期望NumDataRef是NumDataRef的一部分。适当的语法可能再次是第一次创建

的两步过程
foo = openpyxl.chart.data_source.NumRef(f="bar") 

然后按

进行跟进
minus = openpyxl.chart.data_source.NumDataSource(numRef="foo")

我不确定numRef实际上指的是什么,如果它是一个单元格,系列名称或其他东西。 如果有人可以贡献什么"加","减去"和" val"参数确实有用。

1 个答案:

答案 0 :(得分:3)

从头开始创建NumVal似乎需要NumDataNumDataSourceErrorBars

# References for X and Y
xvalues = Reference(<worksheet>, min_col=<xcol>, min_row=<min>, max_row=<max>)
yvalues = Reference(<worksheet>, min_col=<ycol>, min_row=<min>, max_row=<max>) 
plus = [<list of error values for plus>]
minus = [<list of error values for minus>]

# Convert lists of error values to ErrorBars object
errorbars = list2errorbars(plus, minus, errDir='y')

# Create series data and set error bar
series = SeriesFactory(yvalues, xvalues, title="y direction error")
series.errBars = errorbars

def list2errorbars(plus, minus, errDir='y', errValType='cust'):
    "Returns ErrorBar from lists of error values"

    #Convert to list of NumVal
    numvals_plus = [NumVal(i, None, v=x) for i,x in enumerate(plus)]
    numvals_minus = [NumVal(i, None, v=x) for i,x in enumerate(minus)]

    # Convert to NumData
    nd_plus = NumData(pt=numvals_plus)
    nd_minus = NumData(pt=numvals_minus)

    # Convert to NumDataSource
    nds_plus = NumDataSource(numLit=nd_plus)
    nds_minus = NumDataSource(numLit=nd_minus)

    return ErrorBars(plus=nds_plus, minus=nds_minus, errDir=errDir, errValType=errValType)

完整示例代码:https://github.com/uskysd/openpyxl-errorbar

由于我无法找到好的文档,我从源代码中找到了答案。如果有更简单的方法可以告诉我。