Ben xlrd, pandalar, openpyxl ve diğer kütüphaneleri denedim ve hepsi tüm dosyayı okurken dosya boyutu arttıkça üstel zaman alıyor gibi görünüyor. 'On_demand' kullandıkları yukarıda belirtilen diğer çözümler benim için çalışmadı. Başlangıçta sayfa adlarını almak istiyorsanız, xlsx dosyaları için aşağıdaki işlev çalışır.
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
Tüm xlsx temel olarak sıkıştırılmış dosyalar olduğundan, temel xml verilerini ayıklıyoruz ve çalışma kitabından doğrudan sayfa kitabını okuyoruz, bu da kitaplık işlevleriyle karşılaştırıldığında saniyenin bir kısmını alıyor.
Karşılaştırma: (4 sayfalık
6mb xlsx dosyasında)
Pandalar, xlrd: 12 saniye
openpyxl: 24 saniye
Önerilen yöntem: 0.4 saniye
İhtiyacım sadece sayfa adlarını okumak olduğu için, tüm zamanları okumak için gereksiz ek yük beni rahatsız ediyordu, bunun yerine bu yolu seçtim.
ExcelFile
mu? Ayrıca, sayfa listesine baktığımda ve bunların N'sini yüklemeye karar verdiğimiread_excel
varsayalım, her bir sayfa için o noktada çağrı (yeni arayüz) yapmalı mıyım yoksa yapışmalıx1.parse
mıyım?