排序列时动态更新openpyxl生成的图表

时间:2017-08-16 13:28:20

标签: python excel charts openpyxl

我正在使用openpyxl 2.4.8生成一些excel文件。我将一些数据填入某些列并插入绘制该数据的图表。如果我在Excel中手动执行此操作,如果我使用数据排序方法删除数据点,则图表会动态更新。但是,openpyxl生成的图表是静态的,忽略任何此类排序。 当查看由excel生成的图表的xml和openpyxl生成的图表时,我看到了很多差异(fx。所有标签都以excel中的'c:'开头),但没有看起来像是自动设置更新内容。我无法在excel中找到可以打开或关闭此设置的设置。 我用来生成带图表的excel文件的代码在这里:

import numpy as np
from openpyxl import *
from random import random
from openpyxl.utils.cell import get_column_letter
from openpyxl.chart import (
    LineChart,
    BarChart,
    ScatterChart,
    Reference,
    Series,
)
from openpyxl.drawing.text import CharacterProperties

wb = Workbook()

ws = wb.create_sheet()
ws.title = 'interactiveChart'

num = 9

ws.cell(column=1, row=2, value='X')
ws.cell(column=2, row=2, value='Y')
for i in range(num+1):
    ws.cell(column=1, row=3+i, value=random()*100)
    ws.cell(column=2, row=3+i, value='=A{0}*3+4+ABS(5/(11-A{0}))+ABS(10/(35-    A{0}))+ABS(30/(67-A{0}))'.format(3+i))

textSize = 10
modeChart = ScatterChart()
modeChart.title = 'Resonance'
modeChart.title.tx.rich.p[0].r.rPr = CharacterProperties(sz=textSize*100,     b=True)
modeChart.style = 48
modeChart.x_axis.title = "X"
modeChart.x_axis.title.tx.rich.p[0].r.rPr =     CharacterProperties(sz=textSize*100, b=True)
modeChart.y_axis.title = "Y"
modeChart.y_axis.title.tx.rich.p[0].r.rPr = CharacterProperties(sz=textSize*100, b=True)
modeChart.legend = None

xvalues = Reference(ws, min_col=1, min_row=2, max_row=num+3)
yvalues = Reference(ws, min_col=2, min_row=2, max_row=num+3)
series = Series(yvalues, xvalues, title_from_data=False, title='Resonace')
modeChart.series.append(series)
s1 = modeChart.series[0]
s1.marker.symbol = "diamond"
s1.marker.graphicalProperties.solidFill = "6495ED"
s1.marker.graphicalProperties.line.solidFill = "6495ED"
s1.graphicalProperties.line.noFill = True

modeChart.x_axis.tickLblPos = "low"
modeChart.y_axis.tickLblPos = "low"

modeChart.width = 12
modeChart.height = 7
ws.add_chart(modeChart, "F6")

ws.auto_filter.ref = 'A2:B{}'.format(num+3)

ws = wb.get_sheet_by_name("Sheet")
wb.remove_sheet(ws)
wb.save('aTest.xlsx')

我找不到这种行为的参考,所以我不确定我应该寻找什么。

2 个答案:

答案 0 :(得分:0)

这不能直接在openpyxl中完成。

openpyxl是一个文件格式库,而不是Excel的替代品。过滤和排序需要由Excel等应用程序完成,openpyxl只维护相关的元数据。

答案 1 :(得分:0)

我找到了解决方案。 xml的Excel图表中有一个名为<plotVisOnly/>的标记。此标记已在openpyxl 2.5中添加(请参阅bitbucket问题:Setting property plotVisOnly for charts)。 感谢friendly openpyxl contributor帮助我解决这个问题。 为了使我的anaconda安装能够正常工作,我首先删除了openpyxl:

pip uninstall openpyxl

然后我从python.org package index下载了最新的openpyxl版本(&gt; 2.5),解压缩并运行:

python setup.py install

这安装了&gt; 2.5版本的openpyxl。我通过运行:

在python中仔细检查了这个
import openpyxl
openpyxl.__version__

希望这有助于某人!