2012-10-03 43 views
6

Tôi gặp sự cố khi đọc tệp .xls được viết bởi một tập lệnh Perl mà tôi không có quyền kiểm soát. Các tệp có chứa một số định dạng và ngắt dòng trong các ô.Đọc các tệp excel với 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) 

này được ném các lỗi sau:

_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 

Tôi không thể tìm thấy bất kỳ thông tin về CompDocError hay Workbook tham nhũng, thậm chí ít nhìn thấy [2] == 4 phần.

+0

'tên tệp' chứa gì? – juankysmith

+0

Chỉ là đường dẫn tệp, như 'D: \\ testfile.xls' hoặc '/home/shared/testfile.xls' (Câu hỏi được cập nhật) – snurre

+0

@snurre, hãy thử 'đính kèm' tệp xls có vấn đề vào bài đăng này, vì vậy lỗi sẽ được tái sản xuất – bpgergo

Trả lời

0

Có thể là phương sách cuối cùng bạn có thể thử và lưu tệp .xls dưới dạng tệp .csv rồi thử và đọc nó.

Rõ ràng là bạn nói rằng bạn có thể mở nó sau khi mở và đóng từ Excel vì vậy đó là nỗ lực tương tự.

Nếu bạn thực sự muốn tập lệnh của mình mở chúng, thì nếu bạn đang sử dụng nền tảng windows, hãy sử dụng pywin32 để mở và đóng Excel từ tập lệnh của bạn và mở và đóng tệp đó trong cùng một lần. Có lẽ điều đó có thể hiệu quả. (Ngớ ngẩn nhưng có thể là một công việc xung quanh)

Ví dụ (stolen from here)

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

tôi đã cùng một lỗi với một trong các file .xls của tôi (excel có thể mở chúng chỉ tốt). Sự cố nằm ở xlrdcompdoc.py. Như tôi đoán Compdoc.seen mảng theo dõi các lĩnh vực đã được đọc "FAT". Trong trường hợp của tôi, Root Entry reading block (SSCS) nhận được tất cả các lĩnh vực được đánh dấu như đã thấy, dẫn đến tăng ngoại lệ trong tương lai. U có thể cố gắng tìm lỗi trong các sector đọc logic và đóng góp cho xlrd :) hoặc chỉ bình luận dòng này với ngoại lệ nâng cao mà có khả năng sẽ giải quyết vấn đề trong trường hợp của bạn (Như đã làm trong tôi) và chờ cập nhật xlrd.

3

+1 cho Ramiel. Chỉ cần nhận xét trong compdoc.py dòng này

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])) 
Các vấn đề liên quan