我被分配了一项“简单”的任务,即将一系列数据列收集到结果工作簿中。结果工作簿包含分析结果所需的公式和图表。这些数据是由我用 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 似乎没有做任何事情。这没有记录。
EDIT无论如何,对 NumDataRef 的调用可能是错误的。 plus 和 minus 参数需要 NumDataSource,其中 NumDataRef 是其中的一部分。正确的语法可能又是一个两步过程,首先创建
foo = openpyxl.chart.data_source.NumRef(f="bar")
然后跟进
minus = openpyxl.chart.data_source.NumDataSource(numRef="foo")
我不确定 numRef 实际指的是什么,如果它是一个单元格、系列名称或其他名称。
如果任何人都可以贡献“plus”、“minus”和“val”参数的作用,那将会很有帮助。