web-dev-qa-db-fra.com

Écrire des valeurs dans une cellule particulière d'une feuille de pandas en python

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.

5
penta

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

3
penta

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()

 enter image description here

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()

 enter image description here

5
MaxU

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
0
selvakumar