2017-12-07 2 views
0

Also im Grunde möchte ich ein Arbeitsblatt mit neuen Daten aktualisieren und bestehende Zellen in Excel überschreiben. Beide Dateien haben die gleichen Spaltennamen (ich möchte keine neue Arbeitsmappe erstellen oder eine neue Spalte hinzufügen).Wie kann ich Werte aus einer Liste oder einem Datenrahmen in jede Zelle in einer vorhandenen Excel-Datei eingeben?

Hier habe ich die Daten am retreiving, was ich will:

import pandas as pd 
df1 = pd.read_csv 
print(df1) 

Ouput (I Kopieren und Einfügen nur die ersten fünf Reihen gibt es etwa 500 Zeilen gesamt):

  Index Type Stage CDID Period Index Value 
0  812008000  6  2 JTV9 201706  121.570 
1  812008000  6  2 JTV9 201707  121.913 
2  812008000  6  2 JTV9 201708  121.686 
3  812008000  6  2 JTV9 201709  119.809 
4  812008000  6  2 JTV9 201710  119.841 
5  812128000  6  1 K2VA 201706  122.030 

Die bestehenden Excel-Datei hat die gleichen Spalten (und Zeilensumme) wie df1, aber ich möchte nur die 'Index' Spalte mit den neuen Werten neu gefüllt haben. Sagen wir einfach, es sieht wie folgt aus (dh so dass ich die vorherigen Werte wollen Index in der entsprechenden Spalte zu gehen):

  Index Type Stage CDID Period Index Value 
0  512901100  6  2 JTV9 201706  121.570 
1  412602034  6  2 JTV9 201707  121.913 
2  612307802  6  2 JTV9 201708  121.686 
3  112808360  6  2 JTV9 201709  119.809 
4  912233066  6  2 JTV9 201710  119.841 
5  312128003  6  1 K2VA 201706  122.030 

Hier habe ich die Excel-Datei am Abrufen und versuchen, sie zu überschreiben:

from win32com.client import Dispatch 
import os 

xl = Dispatch("Excel.Application") 
xl.Visible = True 

wbs_path = ('folder path') 

for wbname in os.listdir(wbs_path): 
    if not wbname.endswith("file name.xlsx"): 
     continue 
    wb = xl.Workbooks.Open(wbs_path + '\\' + wbname) 
    sh = wb.Worksheets("sheet name") 
    sh.Range("A1:A456").Value = df1[["Index"]] 
    wb.Save() 
    wb.Close() 
xl.Quit() 

Aber das tut nichts. Wenn ich in Strings geben, wie zum Beispiel:

h.Range("A1:A456").Value = 'o', 'x', 'c' 

Dies wiederholt sich o in Zellen durch A1 bis zur A456 (es aktualisiert die Tabelle), aber ignoriert x und c. Ich habe versucht, df1 in eine Liste und ein numpy Array zu konvertieren, aber das funktioniert nicht.

Kennt jemand eine Lösung oder eine alternative Problemumgehung?

Antwort

1

Wenn der Index des Datenrahmens identisch ist, können Sie Spalten mit update() aktualisieren. Es könnte wie folgt funktionieren:

df1.update(df2['Index'].to_frame()) 

Hinweis: die() mit dem Rahmen wird wahrscheinlich nicht

EDIT benötigt:

Da Sie versuchen, eine Excel-Datei zu aktualisieren und kein Datenrahmen, meine Antwort ist wahrscheinlich nicht genug. Für diesen Teil würde ich vorschlagen, die Datei in einen Datenrahmen zu laden, die Daten zu aktualisieren und zu speichern.

df1 = pd.read_excel('file.xlsx', sheet_name='sheet_name') 

# do the update 

writer = pd.ExcelWriter('file.xlsx') 
df1.to_excel(writer,sheet_name='sheet_name', engine='xlsxwriter') 
writer.save() 
+0

Ah richtig, so wissen Sie, ob es möglich ist die aktualisierte Tabelle zu speichern, die ältere Datei überschrieben werden? Wenn ich die Datei mit dem gleichen Namen wie die ältere Version benenne, wird sie überschrieben? – DanONS

+0

Werfen Sie einen Blick auf diese Frage: https://stackoverflow.com/questions/42370977/how-to-save-a-new-sheet-in-existing-excel-file-using-pandas Nur das Blatt wird überschrieben werden - die Datei bleibt gleich. Aber ich würde immer noch eine Kopie des Blattes machen, wenn es ein wichtiges ist;) – EyJay

+0

Cool, das war interessant, ich habe es ausprobiert. Während es die Blätter überschreibt, wollte ich, dass Blatt 2 und Blatt 3 intakt bleiben. Jedenfalls könnte es ein Schritt in die richtige Richtung sein, also werde ich sehen, ob es tun kann, was ich brauche – DanONS

Verwandte Themen