2012-10-03 3 views
6

Ich habe Probleme beim Lesen von .xls-Dateien, die von einem Perl-Skript geschrieben wurden, über das ich keine Kontrolle habe. Die Dateien enthalten einige Formatierungen und Zeilenumbrüche in Zellen.Excel-Dateien mit xlrd lesen

filename = '/home/shared/testfile.xls' 
book = xlrd.open_workbook(filename) 
sheet = book.sheet_by_index(0) 
for rowIndex in xrange(1, sheet.nrows): 
    row = sheet.row(rowIndex) 

die folgenden Fehler Dies wirft:

_locate_stream(Workbook): seen 
    0 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 
    20 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 
172480= 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 
172500 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 2 
172520 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
173840= 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
173860 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 
173880 1 1 1 1 1 1 1 1 
Traceback (most recent call last): 
    File "/home/shared/xlrdtest.py", line 5, in <module> 
    book = xlrd.open_workbook(filename) 
    File "/usr/local/lib/python2.7/site-packages/xlrd/__init__.py", line 443, in open_workbook 
    ragged_rows=ragged_rows, 
    File "/usr/local/lib/python2.7/site-packages/xlrd/book.py", line 84, in open_workbook_xls 
    ragged_rows=ragged_rows, 
    File "/usr/local/lib/python2.7/site-packages/xlrd/book.py", line 616, in biff2_8_load 
    self.mem, self.base, self.stream_len = cd.locate_named_stream(qname) 
    File "/usr/local/lib/python2.7/site-packages/xlrd/compdoc.py", line 393, in locate_named_stream 
    d.tot_size, qname, d.DID+6) 
    File "/usr/local/lib/python2.7/site-packages/xlrd/compdoc.py", line 421, in _locate_stream 
    raise CompDocError("%s corruption: seen[%d] == %d" % (qname, s, self.seen[s])) 
xlrd.compdoc.CompDocError: Workbook corruption: seen[2] == 4 

ich nicht in der Lage bin alle Infos über CompDocError oder Arbeitsmappe Korruption zu finden, noch weniger den gesehen [2] == 4 Teil.

+0

Was enthält 'Dateiname'? – juankysmith

+0

Es ist nur ein Dateipfad, wie 'D: \\ testfile.xls' oder '/home/shared/testfile.xls' (Aktualisierte Frage) – snurre

+0

@snurre, versuche, eine problematische XLS-Datei an diesen Beitrag anzuhängen, also der Fehler wäre reproduzierbar – bpgergo

Antwort

0

Vielleicht können Sie als letzte Möglichkeit versuchen, die .xls-Datei als CSV-Datei zu speichern und sie dann zu lesen.

Offensichtlich sagen Sie, Sie können es nach einem Öffnen und Schließen von Excel öffnen, so ist es die gleiche Anstrengung.

Wenn Sie wirklich möchten, dass Ihr Skript sie öffnet, dann verwenden Sie die pywin32, um Excel aus Ihrem Skript zu öffnen und zu schließen, und öffnen und schließen Sie die Datei im selben Schritt. Vielleicht könnte das funktionieren. (Albern, aber könnte eine Arbeit um sein)

Beispiel (stolen from here)

from win32com.client import Dispatch 
xl = Dispatch('Excel.Application') 
wb = xl.Workbooks.Open('C:\\Documents and Settings\\GradeBook.xls') 
1

Ich habe denselben Fehler mit einem meiner .xls-Dateien (Excel kann sie öffnen nur in Ordnung). Problem befindet sich in xlrdcompdoc.py. Wie ich denke Compdoc.seen Array behält den Überblick über bereits gelesene "FAT" Sektoren. In meinem Fall erhält der Root Entry Reading Block (SSCS) alle Sektoren, die als gesehen markiert sind, was in Zukunft zu einer Ausnahmeerhöhung führt. U kann versuchen, den Fehler in den Sektoren zu finden, die Logik lesen und zu xlrd beitragen :) oder einfach diese Zeilen mit Ausnahmeerhöhung kommentieren, die wahrscheinlich Problem in Ihrem Fall lösen (wie in meiner tat) und auf xlrd Aktualisierung warten.

3

+1 zu Ramiel. Kommentieren Sie einfach in compdoc.py diese Zeilen

if self.seen[s]: 
    print("_locate_stream(%s): seen" % qname, file=self.logfile);dump_list(self.seen, 20, self.logfile) 
    raise CompDocError("%s corruption: seen[%d] == %d" % (qname, s, self.seen[s]))