Write values to a particular cell in a sheet in pandas in python
Question:
I have an excel sheet, which already has some values in some cells.
For ex :-
A B C D
1 val1 val2 val3
2 valx valy
I want pandas to write to specific cells without touching any other cells,sheet etc
This is the code i tried.
import pandas as pd
from openpyxl import load_workbook
df2 = pd.DataFrame({'Data': [13, 24, 35, 46]})
book = load_workbook('b.xlsx')
writer = pd.ExcelWriter('b.xlsx', engine='openpyxl')
df2.to_excel(writer, "Sheet1", startcol=7,startrow=6)
writer.save()
However this code deletes the older cell values.
I have reffered to :- How to write to an existing excel file without overwriting data (using pandas)?
but this solution does not work.
Answers:
UPDATE2: appending data to existing Excel sheet, preserving other (old) sheets:
import pandas as pd
from openpyxl import load_workbook
fn = r'C:Temp.datadoc.xlsx'
df = pd.read_excel(fn, header=None)
df2 = pd.DataFrame({'Data': [13, 24, 35, 46]})
writer = pd.ExcelWriter(fn, engine='openpyxl')
book = load_workbook(fn)
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
df.to_excel(writer, sheet_name='Sheet1', header=None, index=False)
df2.to_excel(writer, sheet_name='Sheet1', header=None, index=False,
startcol=7,startrow=6)
writer.save()
UPDATE: your Excel file doesn’t have a header, so you should process it accordingly:
In [57]: df = pd.read_excel(fn, header=None)
In [58]: df
Out[58]:
0 1
0 abc def
1 ghi lmn
In [59]: df2
Out[59]:
Data
0 13
1 24
2 35
3 46
In [60]: writer = pd.ExcelWriter(fn)
In [61]: df.to_excel(writer, header=None, index=False)
In [62]: df2.to_excel(writer, startcol=7,startrow=6, header=None, index=False)
In [63]: writer.save()
OLD answer:
You can use the following trick:
first read the existing contents of the excel file into a new DF:
In [17]: fn = r'C:Tempb.xlsx'
In [18]: df = pd.read_excel(fn)
In [19]: df
Out[19]:
A B C D
0 val1 NaN val3 val4
1 val11 val22 NaN val33
now we can write it back and append a new DF2:
In [20]: writer = pd.ExcelWriter(fn)
In [21]: df.to_excel(writer, index=False)
In [22]: df2.to_excel(writer, startcol=7,startrow=6, header=None)
In [23]: writer.save()
I was not able to do what was asked by me in the question by using pandas, but was able to solve it by using Openpyxl
.
I will write few code snippets which would help in achieving what was asked.
import openpyxl
# to open the excel sheet and if it has macros
srcfile = openpyxl.load_workbook('docname.xlsx', read_only=False, keep_vba=True)
# get sheetname from the file
sheetname = srcfile.get_sheet_by_name('sheetname')
# write something in B2 cell of the supplied sheet
sheetname['B2'] = str('write something')
# write to row 1,col 1 explicitly, this type of writing is useful to
# write something in loops
sheetname.cell(row=1, column=1).value = 'something'
# save it as a new file, the original file is untouched and here I am saving
# it as xlsm(m here denotes macros).
srcfile.save('newfile.xlsm')
So Openpyxl writes to a purticular cell, without touching the other sheets,cells etc.
It basically writes to a new file respecting the properties of the original file.
Using pandas to read the excel and append the file
def getpayment_excel(request):
df = pd.read_excel(open(str(settings.MEDIA_ROOT)+"/"+"details.xlsx", 'rb'), sheetname='Sheet1')
XLSX_MIME = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
response = HttpResponse(content_type=XLSX_MIME)
response['Content-Disposition'] = 'attachment; filename="PythonExport.xlsx"'
writer = pd.ExcelWriter(response, engine='xlsxwriter')
df.loc[0,'Bank Name'] = "ICICIW"
df.to_excel(writer, 'Sheet1', index=False)
writer.save()
return response
So the solution buhtz provided didn’t work for me for two reasons:
-
writer.save()
is deprecated in version 1.5.0, you should use writer.close()
.
-
pandas makes a new 0 byte file when you run ExcelWriter
without mode='a'
which resulted in an error
zipfile badzipfile file is not a zip file
So, on the off chance a noob like me stumbles upon this problem I want to save them some time:
file = 'file.xlsx'
sheetNames = pd.ExcelFile(file).sheet_names
writer = pd.ExcelWriter(file, engine='openpyxl', mode='a', if_sheet_exists='overlay')
df2 = pd.DataFrame([13, 24, 35, 46])
for sheet in sheetNames:
df = pd.read_excel(file, sheet_name=sheet, header=None)
df.to_excel(writer, header=None, sheet_name=sheet, index=False)
df2.to_excel(writer, header=None, sheet_name=sheetNames[0], index=False, startcol=4, startrow=6)
writer.close()
I have an excel sheet, which already has some values in some cells.
For ex :-
A B C D
1 val1 val2 val3
2 valx valy
I want pandas to write to specific cells without touching any other cells,sheet etc
This is the code i tried.
import pandas as pd
from openpyxl import load_workbook
df2 = pd.DataFrame({'Data': [13, 24, 35, 46]})
book = load_workbook('b.xlsx')
writer = pd.ExcelWriter('b.xlsx', engine='openpyxl')
df2.to_excel(writer, "Sheet1", startcol=7,startrow=6)
writer.save()
However this code deletes the older cell values.
I have reffered to :- How to write to an existing excel file without overwriting data (using pandas)?
but this solution does not work.
UPDATE2: appending data to existing Excel sheet, preserving other (old) sheets:
import pandas as pd
from openpyxl import load_workbook
fn = r'C:Temp.datadoc.xlsx'
df = pd.read_excel(fn, header=None)
df2 = pd.DataFrame({'Data': [13, 24, 35, 46]})
writer = pd.ExcelWriter(fn, engine='openpyxl')
book = load_workbook(fn)
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
df.to_excel(writer, sheet_name='Sheet1', header=None, index=False)
df2.to_excel(writer, sheet_name='Sheet1', header=None, index=False,
startcol=7,startrow=6)
writer.save()
UPDATE: your Excel file doesn’t have a header, so you should process it accordingly:
In [57]: df = pd.read_excel(fn, header=None)
In [58]: df
Out[58]:
0 1
0 abc def
1 ghi lmn
In [59]: df2
Out[59]:
Data
0 13
1 24
2 35
3 46
In [60]: writer = pd.ExcelWriter(fn)
In [61]: df.to_excel(writer, header=None, index=False)
In [62]: df2.to_excel(writer, startcol=7,startrow=6, header=None, index=False)
In [63]: writer.save()
OLD answer:
You can use the following trick:
first read the existing contents of the excel file into a new DF:
In [17]: fn = r'C:Tempb.xlsx'
In [18]: df = pd.read_excel(fn)
In [19]: df
Out[19]:
A B C D
0 val1 NaN val3 val4
1 val11 val22 NaN val33
now we can write it back and append a new DF2:
In [20]: writer = pd.ExcelWriter(fn)
In [21]: df.to_excel(writer, index=False)
In [22]: df2.to_excel(writer, startcol=7,startrow=6, header=None)
In [23]: writer.save()
I was not able to do what was asked by me in the question by using pandas, but was able to solve it by using Openpyxl
.
I will write few code snippets which would help in achieving what was asked.
import openpyxl
# to open the excel sheet and if it has macros
srcfile = openpyxl.load_workbook('docname.xlsx', read_only=False, keep_vba=True)
# get sheetname from the file
sheetname = srcfile.get_sheet_by_name('sheetname')
# write something in B2 cell of the supplied sheet
sheetname['B2'] = str('write something')
# write to row 1,col 1 explicitly, this type of writing is useful to
# write something in loops
sheetname.cell(row=1, column=1).value = 'something'
# save it as a new file, the original file is untouched and here I am saving
# it as xlsm(m here denotes macros).
srcfile.save('newfile.xlsm')
So Openpyxl writes to a purticular cell, without touching the other sheets,cells etc.
It basically writes to a new file respecting the properties of the original file.
Using pandas to read the excel and append the file
def getpayment_excel(request):
df = pd.read_excel(open(str(settings.MEDIA_ROOT)+"/"+"details.xlsx", 'rb'), sheetname='Sheet1')
XLSX_MIME = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
response = HttpResponse(content_type=XLSX_MIME)
response['Content-Disposition'] = 'attachment; filename="PythonExport.xlsx"'
writer = pd.ExcelWriter(response, engine='xlsxwriter')
df.loc[0,'Bank Name'] = "ICICIW"
df.to_excel(writer, 'Sheet1', index=False)
writer.save()
return response
So the solution buhtz provided didn’t work for me for two reasons:
-
writer.save()
is deprecated in version 1.5.0, you should usewriter.close()
. -
pandas makes a new 0 byte file when you run
ExcelWriter
withoutmode='a'
which resulted in an errorzipfile badzipfile file is not a zip file
So, on the off chance a noob like me stumbles upon this problem I want to save them some time:
file = 'file.xlsx'
sheetNames = pd.ExcelFile(file).sheet_names
writer = pd.ExcelWriter(file, engine='openpyxl', mode='a', if_sheet_exists='overlay')
df2 = pd.DataFrame([13, 24, 35, 46])
for sheet in sheetNames:
df = pd.read_excel(file, sheet_name=sheet, header=None)
df.to_excel(writer, header=None, sheet_name=sheet, index=False)
df2.to_excel(writer, header=None, sheet_name=sheetNames[0], index=False, startcol=4, startrow=6)
writer.close()