2017-08-09 49 views
0

添加標籤ScatterChart我已經寫了這個簡單的代碼來測試的事情了一個更復雜的一個:在openpyxl

import sys 

from openpyxl import load_workbook 
from openpyxl.chart import Reference, ScatterChart, Series 
from openpyxl.chart.label import DataLabel, DataLabelList 
from openpyxl.chart.marker import Marker 
from openpyxl.chart.shapes import GraphicalProperties 
from openpyxl.drawing.colors import ColorChoice 

wb = load_workbook(sys.argv[1]) 
for ws in wb: 
    chart = ScatterChart(scatterStyle='smoothMarker') 
    for x in range(2, 192): 
     labels = Reference(ws, min_col=1, max_col=1, min_row=x, max_row=x) 
     xaxis = Reference(ws, min_col=2, max_col=2, min_row=x, max_row=x) 
     data = Reference(ws, min_col=3, max_col=3, min_row=x, max_row=x) 
     s = Series(xaxis, data, title=ws['A' + str(x)].value) 
     sp_color = ColorChoice(prstClr=(str(ws['A' + str(x)].value))) 
     sp_sppr = GraphicalProperties(solidFill=sp_color) 
     s.marker = Marker(symbol=('circle'), size=20, spPr=sp_sppr) 
     s.marker.spPr.ln.noFill = True 
     s.spPr.ln.noFill = True 
     slabel = list() #EDITED 
     for x in labels.cells: #EDITED 
      slabel.append(ws[x].value) #EDITED 
     s.labels = DataLabelList(dLbl=slabel, dLblPos='bestFit') 
     chart.series.append(s) 
    chart.dataLabels = (DataLabelList(showLegendKey=True)) 
    ws.add_chart(chart, 'D1') 
wb.save(sys.argv[1]) 

sys.argv[1]文件的用途是這樣的(在技術上它只是color list爲ColorChoice的prstClr其中x + = 10,Y = X):

Color x y 
beige 0 0 
forestGreen 10 10 
dkGoldenrod 20 20 
lightPink 30 30 
slateGrey 40 40 

s.labels = DataLabelList(dLbl=slabel, dLblPos='bestFit')輸出錯誤:

Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/openpyxl/descriptors/base.py", line 57, in _convert 
    value = expected_type(value) 
ValueError: invalid literal for int() with base 10: 'beige' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/openpyxl/descriptors/base.py", line 57, in _convert 
    value = expected_type(value) 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/openpyxl/chart/label.py", line 100, in __init__ 
    self.idx = idx 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/openpyxl/descriptors/nested.py", line 36, in __set__ 
    super(Nested, self).__set__(instance, value) 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/openpyxl/descriptors/base.py", line 69, in __set__ 
    value = _convert(self.expected_type, value) 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/openpyxl/descriptors/base.py", line 59, in _convert 
    raise TypeError('expected ' + str(expected_type)) 
TypeError: expected <class 'int'> 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "csv/test.py", line 37, in <module> 
    s.labels = DataLabelList(dLbl=slabel, dLblPos='bestFit') 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/openpyxl/chart/label.py", line 128, in __init__ 
    self.dLbl = dLbl 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/openpyxl/descriptors/sequence.py", line 27, in __set__ 
    seq = [_convert(self.expected_type, value) for value in seq] 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/openpyxl/descriptors/sequence.py", line 27, in <listcomp> 
    seq = [_convert(self.expected_type, value) for value in seq] 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/openpyxl/descriptors/base.py", line 59, in _convert 
    raise TypeError('expected ' + str(expected_type)) 
TypeError: expected <class 'openpyxl.chart.label.DataLabel'> 

編輯:我使用了列表作爲查理指出它沒有更多的成功,這個列表應包含相同數量的項目與每個的標籤名稱。
要麼slabel.append(ws[x].value)要麼slabel.append(x)輸出相同的錯誤,該列表包含哪些內容?

Versions:
- openpyxl 2.4.8
- python 3.6
- macOS Siera 10.12.6

問候

回答

0

Sequence是作文課,當你使用它使用不當的描述符。您需要提供Python序列(列表,元組等)

+0

用您的備註編輯了問題,這改變了錯誤。該清單應包含哪些內容? – Gysco

+0

這個例外清楚了這一點:一系列'DataLabel'對象。所以,你可能需要改變創建'slabel'的代碼來創建其中的一個,儘管我不確定這是你真正想做什麼。不幸的是,圖表的規格太複雜了,無法在這裏討論。郵件列表將是一個更好的地方。 –