openpyxl图表错误栏样式

2024-06-03 15:28:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我被分配了一个“简单”的任务,收集一系列数据列到结果工作簿中。结果工作簿包含分析结果所需的公式和图表。数据是由一个图像分析应用程序生成的,我用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)

现在要使用误差线,必须按如下方式定义和创建它们:

^{pr2}$

现在,我想知道是否有一种方法可以跳过构建spPr对象,方法是首先定义用于创建GraphicalProperties对象的LineProperties,然后在实例化期间将其输入ErrorBars方法。在

那个NumDataRef似乎什么也没做。没有记录在案。在

编辑对NumDataRef的调用在任何情况下都可能是错误的。加号和减号参数需要NumDataSource,NumDataRef是其一部分。正确的语法可能同样需要两个步骤:首先创建

foo = openpyxl.chart.data_source.NumRef(f="bar") 

然后通过

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

我不确定numRef实际上指的是什么,如果它是一个单元、序列名或其他东西。 如果有人能提供“加号”、“减号”和“val”参数所做的工作,这将很有帮助。在


Tags: 数据方法datachart图表minexcelrow
1条回答
网友
1楼 · 发布于 2024-06-03 15:28:42

似乎需要NumValNumData和{}从头开始创建ErrorBars

# 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

因为我也找不到好的文档,所以我从源代码中找到了答案。如果有更简单的方法让我知道。在

相关问题 更多 >