Как прочитать определенный лист из файла Excel с помощью Django

Я читаю xlsx файл для хранения данных в базе данных. Все работает правильно. Но мой вопрос в том, что я хочу прочитать только одну конкретную электронную таблицу из файла Excel.

Например, файл может содержать несколько листов, например:

Лист1, Лист2 ...

Я хочу прочитать данные только из Sheet2 и сохранить в базе данных.

На данный момент я делаю это следующим образом:

imported_data = dataset.load(data.read(), format='xlsx')

Однако таким образом он не фильтрует конкретный лист.

Как я могу это сделать?

После того, как я поместил каждую строку листа в базу данных.

 for d in imported_data:
                    value = DataSheet(
                        x,
                        d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], d[11],
                        d[12], d[13], d[14], d[15], d[16], d[17], d[18], d[19], d[20], d[21], d[22], d[23],
                        d[24], d[25], d[26], d[27]
                    )
                
                    value.save()

Шаги:

  1. Считывание целевого листа из файла excel в объект data-frame
  2. Записать кадр данных в объект BytesIO (или файл xlsx)

file.xlsx

  • Sheet1

    This is
    number 1
  • Sheet2

    While this
    is 2nd
  • Sheet3

    Here lies
    the third

Вот решение, использующее панды

import io

import pandas

with open('./file.xlsx', 'rb') as file_xlsx:  # In your case, this would be the <data.read()>
    data_frame = pandas.read_excel(file_xlsx, sheet_name='Sheet2')

    bytes_io = io.BytesIO()
    excel_writer = pandas.ExcelWriter(bytes_io, engine='openpyxl')

    data_frame.to_excel(excel_writer, index=False)

    excel_writer.save()  # Save the workbook
    bytes_io.seek(0)  # Seek back to the beginning of the file

Теперь, bytes_io содержит результирующие байты файла excel только с "Sheet2". Это данные, которые необходимо сохранить в базе данных.

Чтобы проверить это, давайте запишем его обратно в файл xlsx, обратившись к bytes_io.read().

with open('./file_updated.xlsx', 'wb') as file_xlsx_updated:
    file_xlsx_updated.write(bytes_io.read())

file_updated.xlsx

  • Sheet1

    While this
    is 2nd

Я решил эту проблему с помощью tablib.Databook()

imported_data = tablib.Databook()  
imported_data.xlsx = data.read()
for dataset in imported_data.sheets():
    if dataset.title == 'name of the sheet':
       #do anything
Вернуться на верх