2012-10-03 127 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]))