Saya telah mencoba xlrd, panda, openpyxl dan pustaka-pustaka semacam itu dan semuanya sepertinya memerlukan waktu yang eksponensial karena ukuran file bertambah ketika membaca seluruh file. Solusi lain yang disebutkan di atas di mana mereka menggunakan 'on_demand' tidak berfungsi untuk saya. Jika Anda hanya ingin mendapatkan nama sheet pada awalnya, fungsi berikut berfungsi untuk file xlsx.
def get_sheet_details(file_path):
sheets = []
file_name = os.path.splitext(os.path.split(file_path)[-1])[0]
# Make a temporary directory with the file name
directory_to_extract_to = os.path.join(settings.MEDIA_ROOT, file_name)
os.mkdir(directory_to_extract_to)
# Extract the xlsx file as it is just a zip file
zip_ref = zipfile.ZipFile(file_path, 'r')
zip_ref.extractall(directory_to_extract_to)
zip_ref.close()
# Open the workbook.xml which is very light and only has meta data, get sheets from it
path_to_workbook = os.path.join(directory_to_extract_to, 'xl', 'workbook.xml')
with open(path_to_workbook, 'r') as f:
xml = f.read()
dictionary = xmltodict.parse(xml)
for sheet in dictionary['workbook']['sheets']['sheet']:
sheet_details = {
'id': sheet['@sheetId'],
'name': sheet['@name']
}
sheets.append(sheet_details)
# Delete the extracted files directory
shutil.rmtree(directory_to_extract_to)
return sheets
Karena semua xlsx pada dasarnya adalah file zip, kami mengekstrak data xml yang mendasarinya dan membaca nama lembar dari buku kerja secara langsung yang membutuhkan sepersekian detik dibandingkan dengan fungsi perpustakaan.
Benchmarking: (Pada file xlsx 6mb dengan 4 lembar)
Panda, xlrd: 12 detik
openpyxl: 24 detik
Metode yang diusulkan: 0,4 detik
Karena kebutuhan saya hanya membaca nama lembar, overhead yang tidak perlu dari membaca sepanjang waktu mengganggu saya jadi saya mengambil rute ini sebagai gantinya.
ExcelFile
? Juga, katakanlah saya mencari daftar lembar dan memutuskan untuk memuat N dari mereka, haruskah saya pada saat itu memanggilread_excel
(antarmuka baru) untuk setiap lembar, atau menempelx1.parse
?