2012-10-03 31 views
6

Tengo problemas para leer archivos .xls escritos por un script Perl sobre el que no tengo control. Los archivos contienen algunos formatos y saltos de línea dentro de las celdas.Lectura de archivos de Excel con xlrd

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) 

Esto es tirar el siguiente error:

_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 

que no soy capaz de encontrar cualquier información sobre CompDocError o corrupción libro de trabajo, incluso menos del [2] == 4 Parte visto.

+0

¿qué contiene 'filename'? – juankysmith

+0

Es solo una ruta de archivo, como 'D: \\ testfile.xls' o '/home/shared/testfile.xls' (Pregunta actualizada) – snurre

+0

@snurre, intenta 'adjuntar' un archivo xls problemático a esta publicación, por lo que el error sería reproducible – bpgergo

Respuesta

0

Tal vez como último recurso, intente y guarde el archivo .xls como un archivo .csv y luego intente y léalo.

Obviamente dices que puedes abrirlo después de abrir y cerrar desde Excel por lo que es el mismo esfuerzo.

Si realmente quiere que su script lo abra, entonces, si está en la plataforma de Windows, use el pywin32 para abrir y cerrar Excel desde su secuencia de comandos, y abrir y cerrar el archivo en el mismo paso. Tal vez eso podría funcionar. (Tonto, pero podría ser una solución alternativa)

Ejemplo (stolen from here)

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

llegué mismo error con uno de mis archivos .xls (Excel puede abrirlos bien). El problema se encuentra en xlrdcompdoc.py. Como supongo, Compdoc.seen array realiza un seguimiento de los sectores "FAT" ya leídos. En mi caso, el bloque de lectura Root Entry (SSCS) obtiene todos los sectores marcados como se ven, lo que lleva a la excepción aumentar en el futuro. U puede intentar encontrar el error en los sectores que leen la lógica y contribuyen a xlrd :) o simplemente comente estas líneas con la excepción raise que probablemente resuelva el problema en su caso (como lo hizo en el mío) y espere la actualización xlrd.

3

+1 a Ramiel. Solo comentar en compdoc.py esta línea

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])) 
Cuestiones relacionadas