ฉันได้ลองใช้ xlrd, pandas, openpyxl และไลบรารีอื่น ๆ แล้วและดูเหมือนว่าทั้งหมดจะใช้เวลาเอ็กซ์โพเนนเชียลเนื่องจากขนาดไฟล์เพิ่มขึ้นเมื่ออ่านทั้งไฟล์ วิธีแก้ปัญหาอื่น ๆ ที่กล่าวถึงข้างต้นซึ่งพวกเขาใช้ 'on_demand' ไม่ได้ผลสำหรับฉัน หากคุณต้องการรับชื่อแผ่นงานในตอนแรกฟังก์ชันต่อไปนี้ใช้ได้กับไฟล์ xlsx
def get_sheet_details(file_path):
sheets = []
file_name = os.path.splitext(os.path.split(file_path)[-1])[0]
directory_to_extract_to = os.path.join(settings.MEDIA_ROOT, file_name)
os.mkdir(directory_to_extract_to)
zip_ref = zipfile.ZipFile(file_path, 'r')
zip_ref.extractall(directory_to_extract_to)
zip_ref.close()
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)
shutil.rmtree(directory_to_extract_to)
return sheets
เนื่องจาก xlsx ทั้งหมดเป็นไฟล์ซิปโดยทั่วไปเราจึงดึงข้อมูล xml ที่อยู่เบื้องหลังและอ่านชื่อแผ่นงานจากสมุดงานโดยตรงซึ่งใช้เวลาเพียงเสี้ยววินาทีเมื่อเทียบกับฟังก์ชันไลบรารี
Benchmarking: (บนไฟล์ 6mb xlsx ที่มี 4 แผ่น)
Pandas, xlrd: 12 วินาที
openpyxl: 24 วินาที
วิธีการเสนอ: 0.4 วินาที
เนื่องจากความต้องการของฉันเพียงแค่อ่านชื่อแผ่นงานค่าใช้จ่ายที่ไม่จำเป็นในการอ่านตลอดเวลาทำให้ฉันติดขัดดังนั้นฉันจึงใช้เส้นทางนี้แทน
ExcelFile
หรือเปล่า นอกจากนี้สมมติว่าฉันค้นหารายการแผ่นงานและตัดสินใจที่จะโหลด N จากนั้นฉันควรเรียกใช้read_excel
(อินเทอร์เฟซใหม่) สำหรับแต่ละแผ่นหรือx1.parse
ไม่?