用xlrd读取excel文件

我遇到问题,阅读由Perl脚本编写的.xls文件,我无法控制。 这些文件在单元格中包含一些格式化和换行符。

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 

我无法find有关CompDocError或Workbook损坏的任何信息,甚至没有看到[2] == 4部分。

我有一个与我的.xls文件(Excel可以打开他们就好了)相同的错误。 问题位于xlrd compdoc.py 。 我猜Compdoc.seen数组跟踪已经读取“FAT”扇区。 在我的情况下,Root Entry读取块(SSCS)会将所有扇区标记为可见,导致将来exceptionboost。 ü可以尝试find在读逻辑的部门中的bug,并有助于xlrd :)或者只是注释这个exception提升这将有可能解决您的情况(如在我的)和等待xlrd更新的问题。

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

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

很明显,你说你可以在Excel打开和closures后打开它,所以这是同样的努力。

如果你真的想让你的脚本打开它们,那么如果你在Windows平台上,使用pywin32打开和closures脚本中的Excel,并打开并closures文件。 也许这可以工作。 (傻,但可能是一个工作)

示例( 从这里盗取 )

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