繁体   English   中英

使用 xlrd 打开 BytesIO (xlsx)

[英]Open BytesIO (xlsx) with xlrd

我正在使用 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=request.FILES['xlsx_file'].read())

我正在将我的评论变成它自己的答案。 它与更新问题中给出的示例代码(包括解码)有关:

好的,谢谢你的指点。 我下载了 xlrd 并在本地进行了测试。 似乎最好的方法是传递一个字符串,即。 open_workbook(file_contents=xlsx_file.read().decode(encoding=file_enc, errors='replace')) 我误解了文档,但我肯定 file_contents= 可以使用字符串。

我遇到了类似的问题,但在我的情况下,我需要通过用户下载 xls 文件对 Djano 应用程序进行单元测试。

使用 StringIO 的基本代码对我有用。

class myTest(TestCase):
    def test_download(self):
        response = self.client('...')
        f = StringIO.StringIO(response.content)
        book = xlrd.open_workbook(file_contents = f.getvalue() )
        ...
        #unit-tests here

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM