2015-04-14 38 views
0

我想通過unicode二進制數據作爲XLRD的open_workbook的參數(file_contents)。數據文件類型爲.xls傳遞unicode二進制數據作爲XLRD的open_workbook方法的參數

來自article的文檔。

open_workbook(filename=None, logfile=sys.stdout, verbosity=0, pickleable=True, use_mmap=USE_MMAP, file_contents=None, encoding_override=None, formatting_info=False,) 

file_contents 
... as a string or an mmap.mmap object or some other behave-alike object. If file_contents is supplied, filename will not be used, except (possibly) in messages. 

這裏是source code

我試着這樣做:

input = StringIO.StringIO() 
input.write(vals['data']) 

book = xlrd.open_workbook(file_contents=input.getvalue()) 

但有一個錯誤:

raise XLRDError('Unsupported format, or corrupt file: ' + msg) 
XLRDError: Unsupported format, or corrupt file: Expected BOF record; found '0M8R4KGx' 

我該怎麼辦?

+0

你從哪兒弄來'瓦爾斯[ '數據']'?請提供簡短的**完整**程序,以顯示您所看到的錯誤。 –

+0

@Robᵩ這很難做到,因爲我的程序依賴於'Odoo'框架。但是當我使用'type()'它說'unicode'。該文件本身實際上是'.xls'格式,odoo基本上只接受上傳爲二進制文件,我可以通過'vals ['data']'來訪問它。 – William

回答

2

我注意到你的數據以字符串0M8R4KGx開頭。我還注意到base64.decodestring('0M8R4KGx')產生\xd0\xcf\x11\xe0\xa1\xb1,這是XLS文件的頭幾個字節。

vals['data']中的字符串是base64編碼的字符串。你必須把它它寫入文件之前先進行解碼,就像這樣:

input.write(base64.decodestring(vals['data'])) 

input.write(vals['data'].decode('base64')) 

參考:

+0

它的工作原理!謝謝! – William