আমি xlrd, পান্ডা, ওপেনপেক্সএল এবং এই জাতীয় অন্যান্য লাইব্রেরি চেষ্টা করেছি এবং পুরো ফাইলটি পড়ার সাথে সাথে ফাইলগুলির আকার বাড়ার সাথে তাদের সকলেরই তাত্পর্যপূর্ণ সময় লাগবে। উপরে উল্লিখিত অন্যান্য সমাধানগুলি যেখানে তারা 'অন_ডেম্যান্ড' ব্যবহার করেছিল তা আমার পক্ষে কার্যকর হয়নি। আপনি যদি প্রথমে শীটের নাম পেতে চান তবে নিম্নলিখিত ফাংশনটি এক্সএলএসএক্স ফাইলগুলির জন্য কাজ করে।
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
যেহেতু সমস্ত এক্সএলএক্সএক্স মূলত জিপ করা ফাইল, তাই আমরা অন্তর্নিহিত এক্সএমএল ডেটা বের করি এবং সরাসরি ওয়ার্কবুক থেকে শীটের নামগুলি পড়ি যা লাইব্রেরির ক্রিয়াকলাপের তুলনায় এক সেকেন্ডের একটি অংশ গ্রহণ করে।
বেঞ্চমার্কিং: (4
শীটযুক্ত 6 এমবি এক্সএলএক্সএক্স ফাইলটিতে ) পান্ডা, এক্সএলআরডি: 12 সেকেন্ড
ওপেনপেক্সএল: 24 সেকেন্ড
প্রস্তাবিত পদ্ধতি: 0.4 সেকেন্ড
যেহেতু আমার প্রয়োজনীয়তা কেবল শীটের নামগুলি পড়ছিল, পুরো সময়টি পড়ার অপ্রয়োজনীয় ওভারহেড আমাকে বগল করছে তাই আমি পরিবর্তে এই রুটটি নিয়েছি।
ExcelFile
? এছাড়াও, বলুন যে আমি শীটগুলির তালিকাটি অনুসন্ধান করেছি এবং সেগুলির মধ্যে এন লোড করার সিদ্ধান্ত নিয়েছি, আমি কিread_excel
প্রতিটি পাতের জন্য সেই মুহুর্তে কল (নতুন ইন্টারফেস) করব, বা আটকে থাকবx1.parse
?