簡體   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