ওভাররাইটিং ডেটা (প্যান্ডাস ব্যবহার করে) ছাড়াই কোনও বিদ্যমান এক্সেল ফাইলটিতে কীভাবে লিখবেন?


120

আমি নিম্নলিখিত ফ্যাশনে এক্সেল ফাইল লিখতে পান্ডা ব্যবহার করি:

import pandas

writer = pandas.ExcelWriter('Masterfile.xlsx') 

data_filtered.to_excel(writer, "Main", cols=['Diff1', 'Diff2'])

writer.save()

মাস্টারফাইল.এক্সলসেক্স ইতিমধ্যে বিভিন্ন ট্যাব সংখ্যার সমন্বয়ে গঠিত। তবে এটিতে এখনও "মেইন" থাকে না।

পান্ডস সঠিকভাবে "মেইন" শীটে লিখেছেন, দুর্ভাগ্যক্রমে এটি অন্যান্য সমস্ত ট্যাবও মুছে ফেলে।


1
আপনি একটি উদাহরণ দিতে পারেন বা ExcelReader? ডকুমেন্টেশনে আমি এর মতো কিছু পাইনি।
বিপি_

1
আমি মনে করি পান্ডসে এক্সেলরাইডারের মতো কোনও জিনিস নেই। এক্সেল থেকে ডেটা পড়তে আমি read_excel ব্যবহার করি। আমি মনে করি না এটি এক্সেল করার জন্য ডেটা সংরক্ষণ করবে।
বিপি_

1
@ নরতসস সেখানে ExcelReader
05

মনে রাখবেন যে প্রশ্নটি ঠিক কী জিজ্ঞাসা করছে সে সম্পর্কে উত্তরে কিছু বিভ্রান্তি রয়েছে। কিছু উত্তর ধরে নিয়েছে যে "মেইন" এখনও বিদ্যমান নেই, এবং ওপি কেবল বিদ্যমান এক্সেল ওয়ার্কবুকে একটি নতুন শীট যুক্ত করছে। অন্যরা ধরে নিয়েছে "মেইন" ইতিমধ্যে বিদ্যমান আছে এবং ওপি "মেইন" এর নীচে নতুন ডেটা যুক্ত করতে চায়।
টিসি প্রক্টর

উত্তর:


143

পান্ডাস ডক্স বলছে এটি এক্সএলএসএক্স ফাইলের জন্য ওপেনপেক্সেল ব্যবহার করে। কোডটির মাধ্যমে তাত্ক্ষণিকভাবে নজর ExcelWriterদেওয়া একটি সূত্র দেয় যা এর মতো কিছু কার্যকর হতে পারে:

import pandas
from openpyxl import load_workbook

book = load_workbook('Masterfile.xlsx')
writer = pandas.ExcelWriter('Masterfile.xlsx', engine='openpyxl') 
writer.book = book

## ExcelWriter for some reason uses writer.sheets to access the sheet.
## If you leave it empty it will not know that sheet Main is already there
## and will create a new sheet.

writer.sheets = dict((ws.title, ws) for ws in book.worksheets)

data_filtered.to_excel(writer, "Main", cols=['Diff1', 'Diff2'])

writer.save()

2
আপনি দয়া করে ব্যাখ্যা করতে পারেন লেখক কী জন্য?
বিপি_

5
এক্সেল রাইটার কোনও কারণে শীটটি অ্যাক্সেস করতে এই পরিবর্তনশীলটি ব্যবহার করে। আপনি যদি এটি খালি ছেড়ে দেন তবে এটি জানতে পারবেন না যে শিট মেইন ইতিমধ্যে রয়েছে এবং এটি একটি নতুন শীট তৈরি করবে।
স্কি

2
এই সমাধানটি সূক্ষ্মভাবে কাজ করে। যদিও এটির একটি অপূর্ণতা রয়েছে। এটি স্প্রেডশিটের মধ্যে সূত্র এবং সংযোগগুলি ভেঙে দেয়। কোনও ধারণা কীভাবে এই আচরণটি পরিবর্তন করবেন?
বিপি_

1
ঠিক কী ভাঙবে তুমি ..? আপনি এটি একটি পৃথক প্রশ্ন হিসাবে জিজ্ঞাসা করতে পারেন এবং এটি ট্যাগ করে openpyxlএবং পর্যাপ্ত বিশদ সরবরাহ করতে পারেন: আপনার কী ধরণের সূত্র রয়েছে, কীভাবে ডেটা আপডেট হয়, কীভাবে এটি সূত্রগুলিকে ব্রেক করে। এখন আমি সাহায্য করতে পারি না, অনেক কিছুই আমি জানি না।
স্কি

2
এটি পরিবর্তে .xlsm ফাইলগুলির সাথে ব্যবহার করা যেতে পারে?
দাপাজ

39

এখানে একটি সহায়ক ফাংশন:

def append_df_to_excel(filename, df, sheet_name='Sheet1', startrow=None,
                       truncate_sheet=False, 
                       **to_excel_kwargs):
    """
    Append a DataFrame [df] to existing Excel file [filename]
    into [sheet_name] Sheet.
    If [filename] doesn't exist, then this function will create it.

    Parameters:
      filename : File path or existing ExcelWriter
                 (Example: '/path/to/file.xlsx')
      df : dataframe to save to workbook
      sheet_name : Name of sheet which will contain DataFrame.
                   (default: 'Sheet1')
      startrow : upper left cell row to dump data frame.
                 Per default (startrow=None) calculate the last row
                 in the existing DF and write to the next row...
      truncate_sheet : truncate (remove and recreate) [sheet_name]
                       before writing DataFrame to Excel file
      to_excel_kwargs : arguments which will be passed to `DataFrame.to_excel()`
                        [can be dictionary]

    Returns: None
    """
    from openpyxl import load_workbook

    # ignore [engine] parameter if it was passed
    if 'engine' in to_excel_kwargs:
        to_excel_kwargs.pop('engine')

    writer = pd.ExcelWriter(filename, engine='openpyxl')

    # 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 = 0

    # write out the new sheet
    df.to_excel(writer, sheet_name, startrow=startrow, **to_excel_kwargs)

    # save the workbook
    writer.save()

উল্লেখ্য: পান্ডাস <0.21.0 জন্য, প্রতিস্থাপন sheet_nameসঙ্গে sheetname!

ব্যবহারের উদাহরণ:

append_df_to_excel('d:/temp/test.xlsx', df)

append_df_to_excel('d:/temp/test.xlsx', df, header=None, index=False)

append_df_to_excel('d:/temp/test.xlsx', df, sheet_name='Sheet2', index=False)

append_df_to_excel('d:/temp/test.xlsx', df, sheet_name='Sheet2', index=False, startrow=25)

1
এই সমাধানটি আমার পক্ষে নিখুঁতভাবে কাজ করেছে, এখানে পোস্ট করা অন্যগুলি কাজ করে না। অনেক ধন্যবাদ! একটি মাত্র মন্তব্য: যখন ফাইলটি বিদ্যমান না থাকে, তখন আমি একটি ত্রুটি পেয়েছি "NameError: গ্লোবাল নাম 'ফাইলনিটফাউন্ড এরির' সংজ্ঞায়িত করা হয়নি"
cholo14

1
@ cholo14, এটি নির্দেশ করার জন্য আপনাকে ধন্যবাদ! আমি এটি পাইথন 3.x এ পরীক্ষা করেছি, তাই আমি এই বাগটি মিস করেছি। আমি উত্তরে এটি স্থির করেছি ...
ম্যাকসু

1
এটি আমার পক্ষে কাজ করেছে তবে xlsx বিন্যাস (মূল xlsx ফাইল থেকে) বজায় রাখার কোন উপায় আছে কি?

@ 2one, আমি ঠিক জানি না - একবার চেষ্টা করে দেখুন বা একটি নতুন এসও প্রশ্ন জিজ্ঞাসা করুন
ম্যাকসু

কেবলমাত্র সারিগুলির পরিবর্তে কলামগুলিতে লেখার কোনও উপায় আছে? যেমন আমি একটি শীট স্বয়ংক্রিয়ভাবে আপডেট করতে চাই তবে নতুন সারি সংযোজন নয়, তবে কলামগুলি ধন্যবাদ!
ডুমডাম

21

সঙ্গে openpyxlসংস্করণ 2.4.0এবং pandasসংস্করণ 0.19.2, প্রক্রিয়া @ski নিয়ে এসেছেন একটু সহজ পায়:

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'])
#That's it!

11
এটি আমার পক্ষে কাজ করে না। যদি ইতিমধ্যে একটি "মেইন" ওয়ার্কশিট থাকে তবে এটি কেবলমাত্র নতুন ডেটা সহ "মেইন 1" নামে একটি নতুন তৈরি করবে এবং "মেইন" ওয়ার্কশিট সামগ্রীটি অপরিবর্তিত রেখে দেবে।
কুলুলু

2
@ কুলুলু আমি মনে করি এই প্রশ্নটি নিয়ে দুটি ভিন্ন লক্ষ্যের মধ্যে বিভ্রান্তি থাকতে পারে। এটি আপনাকে একটি বিদ্যমান ওয়ার্কবুকে অতিরিক্ত শীট যুক্ত করতে দেয়। এটি বিদ্যমান শীটে অতিরিক্ত ডেটা যুক্ত করার উদ্দেশ্যে নয় । যদি কোনও শিট নামকরণের বিরোধ রয়েছে, তবে এটি শীটটির নামকরণ করে। এটি একটি বৈশিষ্ট্য, না একটি বাগ সংশোধন করা হয়।
টিসি প্রক্টর

@ কুলুলু যেমন বলেছিলেন, এটি বিভিন্ন নামের সাথে কেবল আরও শীট তৈরি করে। প্রথম সমাধানটি ম্যাক্সউ থেকে কাজ করে এবং আপনি যে আউটপুটটি পাবেন তা প্রথম শীটে ডিএফ হবে আপনার ইচ্ছামত বহুবার (এটি হ্যাডারগুলির সাথে বহুগুণ বৃদ্ধি করা হবে।) একটি সাধারণ টেকনিক: প্রতিটি পুনরাবৃত্তি আপনি একটি তালিকাতে ডাটাফ্রেম যুক্ত করুন। শেষ পর্যন্ত আপনার কেবল কনট্যাক্ট করা দরকার। তারা যদি একই কাঠামো অনুসরণ করে তবে কবজ হিসাবে কাজ করবে। list_my_dfs = [df1, df2, ...] # আপনার ডেটাফ্রেমগুলির তালিকা my_dfs_together = pd.concat (list_my_df) # আমার ডেটাফ্রেমে একক ডিএফ
সুসানা সিলভা সান্টোস

@ সুসানাসিলভাসান্টোস, আপনার সামনে টিসি প্রক্টর কী মন্তব্য করেছিলেন তা একবার দেখুন। ওপি একটি বিদ্যমান ওয়ার্কবুকটিতে একটি অস্তিত্বহীন ওয়ার্কশিট যুক্ত করতে চেয়েছিল। এই কোড যে না। ওয়ার্কবুকের মধ্যে বিদ্যমান শীটে ডেটা যুক্ত করা সুযোগের অংশ ছিল না। যদি এটির প্রয়োজন না হয় তবে এটি যথেষ্ট হবে।
mvbentes

16

পান্ডাস 0.24 এ শুরু করে আপনি modeকীওয়ার্ড আর্গুমেন্ট দিয়ে এটিকে সহজ করতে পারেন ExcelWriter:

import pandas as pd

with pd.ExcelWriter('the_file.xlsx', engine='openpyxl', mode='a') as writer: 
     data_filtered.to_excel(writer) 

3
আমার জন্য ওভাররাইট।
কেরামত 16'19

10
@ কেরামাত আমি মনে করি এই প্রশ্নটি নিয়ে দুটি ভিন্ন লক্ষ্যের মধ্যে বিভ্রান্তি থাকতে পারে। এটি আপনাকে একটি বিদ্যমান ওয়ার্কবুকে অতিরিক্ত শীট যুক্ত করতে দেয়। এটি বিদ্যমান শীটে অতিরিক্ত ডেটা যুক্ত করার উদ্দেশ্যে নয়
টিসি প্রক্টর

1
mode = 'a'আরও শীট যুক্ত করে, তবে আমি যদি বিদ্যমান শিটগুলিতে ডেটা ওভাররাইট করতে চাই?
হতবুদ্ধি

11

পুরানো প্রশ্ন, তবে আমি অনুমান করছি যে কিছু লোক এখনও এটি অনুসন্ধান করে - তাই ...

আমি এই পদ্ধতিটি দুর্দান্ত দেখতে পেয়েছি কারণ সমস্ত ওয়ার্কশিট শীট নাম এবং ডেটাফ্রেম জোড়াগুলির একটি অভিধানে লোড করা হয়েছে, শীটনাম = কোনও বিকল্প নয় p স্প্রেডশিটটি ডিক ফর্ম্যাটে পড়া এবং ডিক থেকে ফিরিয়ে লেখার মধ্যে ওয়ার্কশিট যুক্ত করা, মুছতে বা পরিবর্তন করা সহজ। আমার জন্য xlsxwriter গতি এবং বিন্যাসের দিক থেকে এই নির্দিষ্ট কাজের জন্য ওপেনপেক্সএল এর চেয়ে আরও ভাল কাজ করে।

দ্রষ্টব্য: পান্ডাসের ভবিষ্যতের সংস্করণগুলি (0.21.0+) "শীটনাম" পরামিতিটিকে "শীট_নাম" করে দেবে।

# read a single or multi-sheet excel file
# (returns dict of sheetname(s), dataframe(s))
ws_dict = pd.read_excel(excel_file_path,
                        sheetname=None)

# all worksheets are accessible as dataframes.

# easy to change a worksheet as a dataframe:
mod_df = ws_dict['existing_worksheet']

# do work on mod_df...then reassign
ws_dict['existing_worksheet'] = mod_df

# add a dataframe to the workbook as a new worksheet with
# ws name, df as dict key, value:
ws_dict['new_worksheet'] = some_other_dataframe

# when done, write dictionary back to excel...
# xlsxwriter honors datetime and date formats
# (only included as example)...
with pd.ExcelWriter(excel_file_path,
                    engine='xlsxwriter',
                    datetime_format='yyyy-mm-dd',
                    date_format='yyyy-mm-dd') as writer:

    for ws_name, df_sheet in ws_dict.items():
        df_sheet.to_excel(writer, sheet_name=ws_name)

২০১৩ সালের প্রশ্নের উদাহরণের জন্য:

ws_dict = pd.read_excel('Masterfile.xlsx',
                        sheetname=None)

ws_dict['Main'] = data_filtered[['Diff1', 'Diff2']]

with pd.ExcelWriter('Masterfile.xlsx',
                    engine='xlsxwriter') as writer:

    for ws_name, df_sheet in ws_dict.items():
        df_sheet.to_excel(writer, sheet_name=ws_name)

এই ধরণের কাজ করা যাইহোক, আমার মার্জ হওয়া ঘর, কোষের রঙ এবং সেল প্রস্থ সংরক্ষণ করা হয়নি were
ভার্চুয়ালসিটিসি

1
হ্যাঁ, এই পদ্ধতির সাহায্যে বিন্যাসের ধরণটি নষ্ট হয়ে যাবে কারণ প্রতিটি কার্যপত্রকটি পান্ডাস ডেটাফ্রেমে রূপান্তরিত হয় (সেই এক্সেল বিন্যাসের কোনওটিই নেই), তারপরে ডেটাফ্রেমগুলি থেকে একটি নতুন এক্সেল ওয়ার্কবুকের মধ্যে ওয়ার্কশিটগুলিতে রূপান্তরিত হয় (যার মূল নাম একই থাকে) ফাইল)। এটি প্রদর্শিত হয় যে ওপেনপেক্সএল ব্যবহার করে একটি নতুন "সংযোজন" পদ্ধতি আসন্ন হতে পারে যা আসল ফাইল ওয়ার্কশিট ফর্ম্যাটিং সংরক্ষণ করতে পারে? github.com/pandas-dev/pandas/pull/21251
b2002

11

আমি জানি এটি একটি পুরানো থ্রেড, তবে অনুসন্ধানের সময় এটিই প্রথম আইটেমটি খুঁজে পাওয়া যায় এবং আপনি ইতিমধ্যে তৈরি ওয়ার্কবুকের চার্ট ধরে রাখার প্রয়োজন হলে উপরের সমাধানগুলি কাজ করে না। সেক্ষেত্রে xlwings একটি ভাল বিকল্প - এটি আপনাকে এক্সেল বইতে লেখার অনুমতি দেয় এবং চার্ট / চার্টের ডেটা রাখে।

সাধারণ উদাহরণ:

import xlwings as xw
import pandas as pd

#create DF
months = ['2017-01','2017-02','2017-03','2017-04','2017-05','2017-06','2017-07','2017-08','2017-09','2017-10','2017-11','2017-12']
value1 = [x * 5+5 for x in range(len(months))]
df = pd.DataFrame(value1, index = months, columns = ['value1'])
df['value2'] = df['value1']+5
df['value3'] = df['value2']+5

#load workbook that has a chart in it
wb = xw.Book('C:\\data\\bookwithChart.xlsx')

ws = wb.sheets['chartData']

ws.range('A1').options(index=False).value = df

wb = xw.Book('C:\\data\\bookwithChart_updated.xlsx')

xw.apps[0].quit()

ফাইল তৈরির উপায় কি যদি এটি বিদ্যমান না থাকে?
টিঙ্কিংক

হ্যাঁ, আপনি কি ডকগুলি অন্বেষণ করেছেন? docs.xlwings.org/en/stable/api.html
ফ্লাইংমাটবল

তাদের ওয়েবসাইটে wb = xw.Book (ফাইলের নাম) বলছে এটি একটি বই তৈরি করেছে। তবে এটি হয় না
টিঙ্কিংক ২ '

wb = xw.Book () একটি নতুন খালি বই তৈরি করে, যখন আপনি কোনও পথটি পাস করেন আপনি কোনও বিদ্যমান বই লোড করার চেষ্টা করছেন।
ফ্লাইংমাটবল

1
দ্রষ্টব্য: xlwings এক্সেলের চলমান উদাহরণের সাথে ইন্টারঅ্যাক্ট করে এবং তাই লিনাক্সে চলবে না।
ভার্চুয়ালসিটিসি

5

পান্ডাস ০.২৪-তে আরও ভাল সমাধান রয়েছে:

with pd.ExcelWriter(path, mode='a') as writer:
    s.to_excel(writer, sheet_name='another sheet', index=False)

আগে:

এখানে চিত্র বর্ণনা লিখুন

পরে:

এখানে চিত্র বর্ণনা লিখুন

সুতরাং এখন আপনার পান্ডাস আপগ্রেড করুন:

pip install --upgrade pandas


1
ভবিষ্যতের জন্য কেবল একটি শীর্ষস্থান, এটি XslxWriterবিকল্পটির সাথে কাজ করে না ।
মেটিন্যাসটর্ক

এটি ডিফল্টরূপে এটির সাথেও কাজ করে না engine=openpyxlকারণ এটি কেবল একটি নতুন ওয়ার্কশিট যুক্ত করবেthe only worksheet1
11:37 এ বিজন বি

1
def append_sheet_to_master(self, master_file_path, current_file_path, sheet_name):
    try:
        master_book = load_workbook(master_file_path)
        master_writer = pandas.ExcelWriter(master_file_path, engine='openpyxl')
        master_writer.book = master_book
        master_writer.sheets = dict((ws.title, ws) for ws in master_book.worksheets)
        current_frames = pandas.ExcelFile(current_file_path).parse(pandas.ExcelFile(current_file_path).sheet_names[0],
                                                               header=None,
                                                               index_col=None)
        current_frames.to_excel(master_writer, sheet_name, index=None, header=False)

        master_writer.save()
    except Exception as e:
        raise e

এটি পুরোপুরি সূক্ষ্মভাবে কাজ করে কেবলমাত্র মাস্টার ফাইলের ফর্ম্যাটিং (যে ফাইলটিতে আমরা নতুন শীট যুক্ত করি) হারিয়ে গেছে।


0
writer = pd.ExcelWriter('prueba1.xlsx'engine='openpyxl',keep_date_col=True)

"কিপ_ডেট_কোল" আশা আপনাকে সহায়তা করবে


0
book = load_workbook(xlsFilename)
writer = pd.ExcelWriter(self.xlsFilename)
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
df.to_excel(writer, sheet_name=sheetName, index=False)
writer.save()

3
যদিও এটি লেখকদের প্রশ্নের জবাব দিতে পারে, এতে কিছু ব্যাখ্যাকারী শব্দ এবং / অথবা ডকুমেন্টেশনের লিঙ্কের অভাব রয়েছে। আশেপাশে কিছু বাক্যাংশ ছাড়া কাঁচা কোড স্নিপেটগুলি খুব বেশি সহায়ক হয় না। আপনি কীভাবে একটি ভাল উত্তর লিখতে পারেন তা খুব সহায়ক। আপনার উত্তর সম্পাদনা করুন।
রায় শেফার্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.