用xlrd读取excel文件

2024-04-19 02:37:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我在读取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

我找不到任何关于CompDocError或工作簿损坏的信息,更不用说看到的[2]==4部分了。


Tags: inpystreamlibpackagesusrlocalline
3条回答

也许作为最后的办法,您可以尝试将.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到Ramiel。 只需在compdoc.py中注释这些行(在xlrd 1.2.0中的425-27行):

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文件也出现了同样的错误(excel可以很好地打开它们)。问题位于xlrdcompdoc.py。我猜Compdoc.seen数组会跟踪已经读取的“胖”扇区。在我的例子中,根条目读取块(SSCS)获取所有标记为seen的扇区,这将导致将来出现异常。你可以尝试在读取逻辑的扇区中发现错误,并对xlrd:做出贡献,或者只对这几行进行注释,并引发异常,这可能会解决你的问题(就像我在我的例子中所做的那样),然后等待xlrd更新。

相关问题 更多 >