2017-06-02 3 views
0

Ich importiere ein bestehendes Excel-Blatt mit openpyxl und versuche, einige Werte zu füllen und erneut zu speichern, aber ich habe bemerkt, dass die vorhandenen Data Validation-Dropdown-Boxen in der Tabelle durcheinander geraten. Dies geschieht sogar, wenn Sie nur die Tabelle laden, keine anderen Operationen ausführen und dann erneut speichern, so dass es etwas zu sein scheint, das mit openpyx zusammenhängt. Die Datenüberprüfung in der Tabelle besteht aus Dropboxen in bestimmten Zellen, die ihre möglichen Werte aus einer Reihe anderer Zellen über 20 Spalten übernehmen (um QC-Berichte für eine Firma zu generieren). Zum Beispiel hat Zelle C13 eine anfängliche Datenüberprüfung "Quelle" von $ Z $ 6: $ AB $ 6, aber nach Laden und Speichern der Excel-Tabelle wird fälschlicherweise in $ Z $ 5 geändert: $ AB $ 5 für diese Zelle. Seltsamerweise ist dies nicht über alle Zellen hinweg konsistent; Einige Zellen bleiben im korrekten Bereich und einige Zellen sind stattdessen fünf oder fünf Zeilen entfernt. Es sieht so aus, als wäre es nur in Reihen, nicht in Spalten. Alle Zellen mit Datenvalidierung werden zusammengeführt, ich bin mir nicht sicher, ob das wichtig ist oder nicht. Weiß jemand, warum das passieren kann oder wie man es beheben kann? Es gibt nicht viel Code ist es zu zeigen, aber hier ist ein einfaches Beispiel für eine Last/Save-Funktion, die dieses Problem verursachen:openpyxl verursacht den Verlust vorhandener DataValidation in Excel

wb = load_workbook(filename='myspreadsheet.xlsx') 
    wb.save('myspreadsheet.xlsx') 

Vielen Dank im Voraus! Robert

+0

Ich versuchte, konnte das Problem jedoch nicht reproduzieren. Verwenden Sie die neueste Version von 'openpyxl' (derzeit 2.4.7)? – Xukrao

+0

Hallo Xukrao, ja ich benutze die neueste Version von openpyxl. Beim Versuch, das Problem neu zu erstellen, habe ich bemerkt, dass es manchmal in einfachen Tabellenkalkulationen mit Beispieldatenüberprüfung nicht auftritt. Ich habe ein Beispiel für eine Kalkulationstabelle erstellt, in der dieses Problem auftritt, aber ich kann es anscheinend nicht hier hochladen, also hier ist ein Dropbox-Link mit der Tabelle: https://www.dropbox.com/s/sbw07makodkg7oo/DataValidationErrorExample.XLSX?dl = 0 Sie können sehen, dass die "DV" -Zeilen für Test1-3 mit ihren "Zeilen" -Optionen übereinstimmen, aber nachdem Sie diese Tabelle durch openpyxl passiert haben, werden Sie feststellen, dass die Links durcheinander geraten sind. –

+0

Alternativ, wenn der Dropbox-Link nicht funktioniert, kann ich das Beispiel mailen, wenn eine E-Mail-Adresse angegeben wird. Danke –

Antwort

0

Es kann sein, dass Ihre Excel-Tabelle Datenvalidierungen für überlappende Zellbereiche definiert hat, was zu Verwirrung bei openpxyl und/oder Excel führt.

Wenn Sie diesen Code verwenden:

wb = load_workbook(filename='DataValidationErrorExample.XLSX') 
ws = wb.worksheets[0] 
print(ws.data_validations) 

ich:

<openpyxl.worksheet.datavalidation.DataValidationList object> 
Parameters: 
disablePrompts=None, xWindow=None, yWindow=None, count=10, dataValidation=[<openpyxl.worksheet.datavalidation.DataValidation object> 
Parameters: 
showErrorMessage=True, showDropDown=None, showInputMessage=True, allowBlank=False, errorTitle=None, error=None, promptTitle=None, prompt=None, type='list', errorStyle=None, imeMode=None, operator=None, sqref='C15:C28 D15:D28 E15:E28 F15:F28 G15:G28 H15:H28 I15 J15 K15', formula1='$Z$12:$AB$12', formula2=None, <openpyxl.worksheet.datavalidation.DataValidation object> 
Parameters: 
showErrorMessage=True, showDropDown=None, showInputMessage=True, allowBlank=False, errorTitle=None, error=None, promptTitle=None, prompt=None, type='list', errorStyle=None, imeMode=None, operator=None, sqref='I12 J12 K12', formula1='$Z$5:$AC$5', formula2=None, <openpyxl.worksheet.datavalidation.DataValidation object> 
Parameters: 
showErrorMessage=True, showDropDown=None, showInputMessage=True, allowBlank=False, errorTitle=None, error=None, promptTitle=None, prompt=None, type='list', errorStyle=None, imeMode=None, operator=None, sqref='C13:C26 D13:D26 E13:E26 F13:F26 G13:G26 H13:H26 I13 J13 K13', formula1='$Z$6:$AB$6', formula2=None, <openpyxl.worksheet.datavalidation.DataValidation object> 
Parameters: 
showErrorMessage=True, showDropDown=None, showInputMessage=True, allowBlank=False, errorTitle=None, error=None, promptTitle=None, prompt=None, type='list', errorStyle=None, imeMode=None, operator=None, sqref='C12:C25 D12:D25 E12:E25 F12:F25 G12:G25 H12:H25', formula1='$Z$5:$AB$5', formula2=None, <openpyxl.worksheet.datavalidation.DataValidation object> 
Parameters: 
showErrorMessage=True, showDropDown=None, showInputMessage=True, allowBlank=False, errorTitle=None, error=None, promptTitle=None, prompt=None, type='list', errorStyle=None, imeMode=None, operator=None, sqref='G8', formula1='$Z$8:$AB$8', formula2=None, <openpyxl.worksheet.datavalidation.DataValidation object> 
Parameters: 
showErrorMessage=True, showDropDown=None, showInputMessage=True, allowBlank=False, errorTitle=None, error=None, promptTitle=None, prompt=None, type='list', errorStyle=None, imeMode=None, operator=None, sqref='C16:C29 D16:D29 E16:E29 F16:F29 G16:G29 H16:H29 I16 J16 K16', formula1='$Z$9:$AA$9', formula2=None, <openpyxl.worksheet.datavalidation.DataValidation object> 
Parameters: 
showErrorMessage=True, showDropDown=None, showInputMessage=True, allowBlank=False, errorTitle=None, error=None, promptTitle=None, prompt=None, type='list', errorStyle=None, imeMode=None, operator=None, sqref='C17:C30 D17:D30 E17:E30 F17:F30 G17:G30 H17:H30 I17 J17 K17', formula1='$Z$10:$AC$10', formula2=None, <openpyxl.worksheet.datavalidation.DataValidation object> 
Parameters: 
showErrorMessage=True, showDropDown=None, showInputMessage=True, allowBlank=False, errorTitle=None, error=None, promptTitle=None, prompt=None, type='list', errorStyle=None, imeMode=None, operator=None, sqref='C14:C27 D14:D27 E14:E27 F14:F27 G14:G27 H14:H27 I14 J14 K14', formula1='$Z$11:$AA$11', formula2=None, <openpyxl.worksheet.datavalidation.DataValidation object> 
Parameters: 
showErrorMessage=True, showDropDown=None, showInputMessage=True, allowBlank=False, errorTitle=None, error=None, promptTitle=None, prompt=None, type='date', errorStyle=None, imeMode=None, operator=None, sqref='C8 D8', formula1='41275', formula2='43101', <openpyxl.worksheet.datavalidation.DataValidation object> 
Parameters: 
showErrorMessage=True, showDropDown=None, showInputMessage=True, allowBlank=False, errorTitle=None, error=None, promptTitle=None, prompt=None, type='list', errorStyle=None, imeMode=None, operator=None, sqref='J8 K8', formula1='$Z$4:$AA$4', formula2=None] 

Die sqref Eigenschaft zeigt gilt eine Datenvalidierung, auf die Zellen, und wie kann man es sehen, ist eine gewisse Überlappung zwischen den verschiedenen Datenvalidierungen.

+0

Ah, das ist eine hilfreiche Funktion von .data_validations. Aus dieser Ausgabe sieht es jedoch so aus, als wäre die Datenvalidierung bereits durcheinander, sobald sie von openpyx geladen wird. Wenn Sie sich die Excel-Tabelle in Excel ansehen, können Sie sehen, dass die Links C15 mit C28 verbinden (Datenvalidierung für jede Zelle dazwischen), wenn es nur C15 und C28 alleine sein sollte. Wenn ich herausfinden kann, warum es diese liest und ein: zwischen Zellen setzt, ist das wahrscheinlich die Wurzel meines Problems. Ich bin mir nicht sicher, warum es das tun oder wie es zu beheben wäre. Danke nochmal fürs schauen. –

+0

Mit dem Wissen von .data_validations (openpyxl, das fälschlicherweise Datenvalidierungszellenbereiche wie C12: C25 anstelle von C12, C25 kombiniert) konnte ich eine Lösung für dieses Problem finden. Das Problem tritt immer dann auf, wenn Zellen in zwei verschiedenen Zeilen dieselbe Datenvalidierungseingabe verwenden. Da ich zwei Reihen von Zeilen für alles habe, kopierte ich meine Datenvalidierungseingabe so, dass sie zweimal erscheint, und verknüpfte jede Zeile mit einem eindeutigen Datenvalidierungsbereich. Dies ist keine vollständige Lösung und nicht ideal, wird aber das Problem vorübergehend lösen. Wenn jemand eine vollständige Lösung kennt, wäre das immer noch hilfreich. –

Verwandte Themen