Mohamed Elnemr نشر 31 أغسطس 2021 أرسل تقرير نشر 31 أغسطس 2021 أحاول انشاء ملف اكسيل excel وكتابة بعض القيم فيه باستخدام pandas كالتالي: import pandas writer = pandas.ExcelWriter('test.xlsx') data_filtered.to_excel(writer, "Main", cols=['col1', 'col2']) writer.save() الملف test.xlsx يحتوى بالفعل على عدد من علامات التبويب tabs ، لكنه لا يحتوى على علامة تبويب بإسم "Main" ، ومع ذلك عند استخدام هذا الكود فانه يقوم بانشاء التبويب "Main" لكنه يحذف باقي tabs الأخرى، كيف يمكنني إضافة "Main" دون التعديل في باقي الملف؟ 2 اقتباس
0 Ahmed Sharshar نشر 31 أغسطس 2021 أرسل تقرير نشر 31 أغسطس 2021 يمكنك إستخدام المكتبة openpyxl في حفظ البيانات من pandas كالتالي: import pandas from openpyxl import load_workbook book = load_workbook('test.xlsx') writer = pandas.ExcelWriter('test.xlsx', engine='openpyxl') writer.book = book writer.sheets = dict((ws.title, ws) for ws in book.worksheets) data_filtered.to_excel(writer, "Main", cols=['col1', 'col2']) writer.save() وهذا عن طريق تحويلة الى dictionary ثم حفظه على هذا الشكل. يمكنك كذلك استخدام pandas لاداء نفس الوظيفة كالتالي: with pd.ExcelWriter(path, mode='a') as writer: s.to_excel(writer, sheet_name='another sheet', index=False) الكود السابق يقوم بفتح صفحة جديدة tab يمكنك اضافة فيها بياناتك دون المساس بباقي علامات التبويب. اقتباس
0 عبدالباسط ابراهيم نشر 31 أغسطس 2021 أرسل تقرير نشر 31 أغسطس 2021 (معدل) كما شرح أحمد أنه تحتاج لإستخدام المكتبة openpyxl في حفظ البيانات من pandas لذلك مع openpyxl إصدار 2.4.0 و إصدار 0.19.2 pandas ، يمكنك استخدام حل ابسط كالتالي import pandas from openpyxl import load_workbook with pandas.ExcelWriter('Masterfile.xlsx', engine='openpyxl') as writer: writer.book = load_workbook('Masterfile.xlsx') data_filtered.to_excel(writer, "Main", cols=['Diff1', 'Diff2']) وجرب أيضاً استخدام المعامل keep_date_col بالقيمة True writer = pd.ExcelWriter('prueba1.xlsx'engine='openpyxl',keep_date_col=True) تم التعديل في 31 أغسطس 2021 بواسطة عبدالباسط ابراهيم خطأ إملائي 1 اقتباس
0 Ali Haidar Ahmad نشر 31 أغسطس 2021 أرسل تقرير نشر 31 أغسطس 2021 وجدت لك تابع رائع ليقوم بذلك بأفضل شكل، مع بعض التعديلات عليه لكي يلائم النسخة الأحدث من بايثون: الوسيط الأول هو مسار الملف أو ExcelWriter موجود مثلاً: '/path/to/file.xlsx' الوسيط الثاني هو الداتافريم المراد حفظه في ال workbook. أما باقي الوسطاء فهي اختيارية. حيث أن الوسيط الثالث هو اسم الشيت التي ستحتوي الداتافريم. الوسيط startrow هو صف الخلية الأيسر العلوي لتفريغ إطار البيانات (افتراضياً يقوم بحساب الصف الأخير في الداتافريم ثم يكتبه في لسطر التالي). أما truncate_sheet يقوم باقتطاع (إزالة وإعادة إنشاء) [اسم_ورقة] قبل كتابة DataFrame إلى ملف Excel . أما resizeColumns يقوم بتغيير حجم جميع الأعمدة بناءً على عرض محتوى الخلية. أما to_excel_kwargs فيمثل الوسائط التي سيتم تمريرها إلى الدالة `DataFrame.to_excel`و يمكن أن تكون على شكل قاموس. وأخيراً na_rep في حالة ضبطه على True سيستبدل قيم nan ب ' '. import pandas as pd def append_df_to_excel(filename, df, sheet_name='Sheet1', startrow=None, startcol=None, truncate_sheet=False, resizeColumns=True, na_rep = 'NA', **to_excel_kwargs): from openpyxl import load_workbook from string import ascii_uppercase from openpyxl.utils import get_column_letter from openpyxl import Workbook # ignore [engine] parameter if it was passed if 'engine' in to_excel_kwargs: to_excel_kwargs.pop('engine') try: f = open(filename) # Do something with the file except IOError: # print("File not accessible") wb = Workbook() ws = wb.active ws.title = sheet_name wb.save(filename) writer = pd.ExcelWriter(filename, engine='openpyxl', mode='a') # Python 2.x: define [FileNotFoundError] exception if it doesn't exist try: FileNotFoundError except NameError: FileNotFoundError = IOError try: # try to open an existing workbook writer.book = load_workbook(filename) # get the last row in the existing Excel sheet # if it was not specified explicitly if startrow is None and sheet_name in writer.book.sheetnames: startrow = writer.book[sheet_name].max_row # truncate sheet if truncate_sheet and sheet_name in writer.book.sheetnames: # index of [sheet_name] sheet idx = writer.book.sheetnames.index(sheet_name) # remove [sheet_name] writer.book.remove(writer.book.worksheets[idx]) # create an empty sheet [sheet_name] using old index writer.book.create_sheet(sheet_name, idx) # copy existing sheets writer.sheets = {ws.title:ws for ws in writer.book.worksheets} except FileNotFoundError: # file does not exist yet, we will create it pass if startrow is None: # startrow = -1 startrow = 0 if startcol is None: startcol = 0 # write out the new sheet df.to_excel(writer, sheet_name, startrow=startrow, startcol=startcol, na_rep=na_rep, **to_excel_kwargs) if resizeColumns: ws = writer.book[sheet_name] def auto_format_cell_width(ws): for letter in range(1,ws.max_column): maximum_value = 0 for cell in ws[get_column_letter(letter)]: val_to_check = len(str(cell.value)) if val_to_check > maximum_value: maximum_value = val_to_check ws.column_dimensions[get_column_letter(letter)].width = maximum_value + 2 auto_format_cell_width(ws) # save the workbook writer.save() مثال: # Create a sample dataframe df = pd.DataFrame({'c1': [22, 4, 93], 'c2': ['red', 'white', 'blue'], 'c3': ['yellow', 'white', 'blue'] }) path = "D:\\data\\df.xlsx" append_df_to_excel(path, df, index=False, startrow=0) 1 اقتباس
السؤال
Mohamed Elnemr
أحاول انشاء ملف اكسيل excel وكتابة بعض القيم فيه باستخدام pandas كالتالي:
الملف test.xlsx يحتوى بالفعل على عدد من علامات التبويب tabs ، لكنه لا يحتوى على علامة تبويب بإسم "Main" ، ومع ذلك عند استخدام هذا الكود فانه يقوم بانشاء التبويب "Main" لكنه يحذف باقي tabs الأخرى، كيف يمكنني إضافة "Main" دون التعديل في باقي الملف؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.