اذهب إلى المحتوى

السؤال

نشر

أحاول انشاء ملف اكسيل 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" دون التعديل في باقي الملف؟

Recommended Posts

  • 0
نشر

يمكنك إستخدام المكتبة 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
نشر (معدل)

كما شرح أحمد أنه تحتاج لإستخدام المكتبة 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)

 

تم التعديل في بواسطة عبدالباسط ابراهيم
خطأ إملائي
  • 0
نشر

وجدت لك تابع رائع ليقوم بذلك بأفضل شكل، مع بعض التعديلات عليه لكي يلائم النسخة الأحدث من بايثون:
الوسيط الأول هو مسار الملف أو 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)

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...