我正在使用Django,需要阅读上载的xlsx文件的工作表和单元格。 xlrd应该可以,但是由于文件必须保留在内存中并且可能无法保存到某个位置,因此我不确定如何继续。
在这种情况下,起点是带有上传输入和提交按钮的网页。提交后,文件将被request.FILES['xlsx_file'].file
捕获并发送到处理类,该类必须提取所有重要数据以进行进一步处理。request.FILES['xlsx_file'].file
的类型为BytesIO,并且由于没有getitem方法,xlrd无法读取该类型。
将BytesIO转换为StringIO后,错误消息似乎保持不变'_io.StringIO' object has no attribute '__getitem__'
file_enc = chardet.detect(xlsx_file.read(8))['encoding']
xlsx_file.seek(0)
sio = io.StringIO(xlsx_file.read().decode(encoding=file_enc, errors='replace'))
workbook = xlrd.open_workbook(file_contents=sio)
最佳答案
我将自己的评论移到它自己的答案中。它与更新的问题中给出的示例代码(包括解码)有关:
好的,谢谢您的指导。我下载了xlrd并在本地对其进行了测试。看来最好的方法是传递一个字符串,即。 open_workbook(file_contents=xlsx_file.read().decode(encoding=file_enc, errors='replace'))
。我误解了文档,但我肯定file_contents =可以与字符串一起使用。
关于python - 使用xlrd打开BytesIO(xlsx),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36472681/