2016-07-09 9 views
1

Ich arbeite mit einer xlsx-Datei mit openpyxl, aber wenn ich diese xlsx-Datei im read_only-Modus öffne, kann ich nur auf die ersten 10 Zeilen zugreifen. Ich sehe das nicht mit allen xlsx-Dateien. Gibt es etwas über die Daten in einer xlsx-Datei, die die StopIteration früh mit read_only als True auslöst, aber nicht mit False? Alle Daten in der Tabelle sind (theoretisch) einheitlich und reiner Text.Python openpyxl: Der schreibgeschützte Modus gibt eine andere Zeilenanzahl zurück

Dies funktioniert wie erwartet für Buch2, aber nicht für Buch1 wie unten gezeigt.

>>> import openpyxl 
>>> a = openpyxl.load_workbook("book1.xlsx", read_only=True) 
>>> a.active.max_row 
10 
>>> a = openpyxl.load_workbook("book1.xlsx", read_only=False) 
>>> a.active.max_row 
20082 

>>> a = openpyxl.load_workbook("book2.xlsx", read_only=True) 
>>> a.active.max_row 
1069 
>>> a = openpyxl.load_workbook("book2.xlsx", read_only=False) 
>>> a.active.max_row 
1069 
+0

Wie haben Sie die XLSX-Dateien erstellen? Die Zeilenanzahl ist in VBA durcheinander geraten, wenn Daten/Zeilen gelöscht wurden, vielleicht ist dies hier ähnlich. –

+0

Danke für Ihre Frage. Die xlsx-Datei, die nicht funktioniert, wurde von einem Drittanbieter-Programm generiert, so dass ich leider keine Kontrolle darüber habe. Ich habe es jedoch überhaupt nicht manipuliert. – sunilbeforezod

+0

Das Element Dimensionen im Arbeitsblatt weist möglicherweise ungültige Werte auf. –

Antwort

1

gesetzt ws.max_row = ws.max_column = None wird Ihr Problem Zitat von docs beheben:

Read-only-Modus verlässt sich auf Anwendungen und Bibliotheken, die die Datei bereitstellt korrekte Informationen über die Arbeitsblätter erstellt, die speziell den verwendeten Teil davon, bekannt wie die Dimensionen.

Einige Anwendungen setzen dies falsch. Sie können die scheinbaren Abmessungen eines Arbeitsblatts mit ws.calculate_dimension() überprüfen.

Wenn dies eine Reihe zurückgibt, die Sie wissen nicht richtig ist, sagen A1:A1 dann einfach die max_row und max_column Attribute Zurücksetzen sollte Ihnen ermöglichen, mit der Datei zu arbeiten:

ws.max_row = ws.max_column = None