Как прочитать определенный лист из файла 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()
Шаги:
- Считывание целевого листа из файла excel в объект data-frame
- Записать кадр данных в объект
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