Tôi đã thử xlrd, gấu trúc, openpyxl và các thư viện khác như vậy và tất cả chúng dường như mất thời gian theo cấp số nhân khi kích thước tệp tăng lên khi nó đọc toàn bộ tệp. Các giải pháp khác được đề cập ở trên nơi họ sử dụng 'on_demand' không hoạt động với tôi. Nếu bạn chỉ muốn lấy tên trang tính ban đầu, hàm sau sẽ hoạt động cho các tệp 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
Vì tất cả các xlsx về cơ bản là các tệp nén, chúng tôi trích xuất dữ liệu xml bên dưới và đọc tên trang tính từ sổ làm việc chỉ mất một phần giây so với các hàm thư viện.
Điểm chuẩn: (Trên tệp xlsx
6mb có 4 tờ) Gấu trúc, xlrd: 12 giây
openpyxl: 24 giây
Phương pháp đề xuất: 0,4 giây
Vì yêu cầu của tôi chỉ là đọc tên trang tính, nên việc đọc toàn bộ thời gian không cần thiết đã làm tôi khó chịu nên tôi đã chọn con đường này để thay thế.
ExcelFile
không? Ngoài ra, giả sử tôi tra cứu danh sách các trang tính và quyết định tải N của chúng, tôi có nên gọi điểm đóread_excel
(giao diện mới) cho mỗi trang tính hayx1.parse
không?