2012-10-03 83 views
6

我在读取由我无法控制的Perl脚本编写的.xls文件时遇到问题。这些文件在单元格内包含一些格式和换行符。用xlrd读取excel文件

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) 

这是抛出了以下错误:

_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 

我不能够找到的有关CompDocError或工作簿损坏任何信息,甚至更少的看出[2] == 4部分。

+0

'filename'包含什么? – juankysmith

+0

这只是一个文件路径,如'D:\\ testfile.xls'或'/home/shared/testfile.xls'(更新后的问题) – snurre

+0

@snurre,尝试'附加'有问题的xls文件到这个帖子,所以错误将是可重现的 – bpgergo

回答

0

也许作为最后的手段,你可以尝试和.xls文件另存为.csv文件,然后尝试读取它。

很明显,你说你能后打开和关闭从Excel中打开它,所以它是同样的努力。

如果您确实希望您的脚本打开它们,那么如果您在Windows平台上,请使用pywin32从脚本中打开和关闭Excel,然后在同一行中打开并关闭该文件。也许这可以工作。 (愚蠢,但可能是一个解决办法)

例(stolen from here

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

我得到了同样的错误与我的.xls文件一个(Excel可以打开他们就好了)。问题位于xlrdcompdoc.py。正如我猜Compdoc.seen阵列跟踪已读的“FAT”扇区。在我的情况下,Root Entry读取块(SSCS)将所有扇区标记为可见,导致将来异常增加。 U可以尝试找到读取逻辑的部分中的错误,并为xlrd :)做出贡献,或者只是将异常提升注释掉,这可能会解决您的问题(正如我的),并等待xlrd更新。

3

+1给Ramiel。 只需在compdoc.py这一行注释

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