J'ai une feuille Excel, qui contient déjà des valeurs dans certaines cellules.
Par exemple: -
A B C D
1 val1 val2 val3
2 valx valy
Je veux que les pandas écrivent dans des cellules spécifiques sans toucher aucune autre cellule, feuille, etc.
C'est le code que j'ai essayé.
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()
Toutefois, ce code supprime les anciennes valeurs de cellule.
J'ai demandé à: - Comment écrire dans un fichier Excel existant sans écraser les données (avec des pandas)? mais cette solution ne fonctionne pas.
Je ne pouvais pas faire ce que ma question m'avait demandé en utilisant des pandas, mais j'étais capable de le résoudre en utilisant Openpyxl
.
J'écrirai quelques extraits de code qui aideraient à réaliser ce qui était demandé.
import openpyxl
srcfile = openpyxl.load_workbook('docname.xlsx',read_only=False, keep_vba= True)#to open the Excel sheet and if it has macros
sheetname = srcfile.get_sheet_by_name('sheetname')#get sheetname from the file
sheetname['B2']= str('write something') #write something in B2 cell of the supplied sheet
sheetname.cell(row=1,column=1).value = "something" #write to row 1,col 1 explicitly, this type of writing is useful to write something in loops
srcfile.save('newfile.xlsm')#save it as a new file, the original file is untouched and here I am saving it as xlsm(m here denotes macros).
OpenPyxl écrit donc dans une cellule purticulaire sans toucher aux autres feuilles, cellules, etc. .. Il écrit dans un nouveau fichier dans le respect des propriétés du fichier d'origine
UPDATE2: ajout de données à une feuille Excel existante, en préservant les autres (anciennes) feuilles:
import pandas as pd
from openpyxl import load_workbook
fn = r'C:\Temp\.data\doc.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: votre fichier Excel n'a pas d'en-tête, vous devez donc le traiter en conséquence:
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()
ANCIENNE réponse:
Vous pouvez utiliser le truc suivant:
d'abord, lisez le contenu existant du fichier Excel dans un nouveau fichier DF:
In [17]: fn = r'C:\Temp\b.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
maintenant nous pouvons le réécrire et ajouter un nouveau 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()
Utiliser des pandas pour lire Excel et annexer le fichier
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