2016-04-19 10 views
-1

Ich habe hier etwas Code in Python, die eine .xlsx-Datei mit openpyxl erstellt.Python Ändern Sie Daten der bestehenden .xlsx Datei

Wenn ich jedoch versuchte, die Datei zu ändern, werden die neuen Daten in der Datei registriert, aber vorherige Daten sind verschwunden. Ich habe gehört, drecopy oder (.copy.copy) zu verwenden, um die Daten der Datei zu kopieren, aber wie kann ich die kopierten Daten plus meine aktuellen Änderungen in die .xlsx-Datei einfügen?

(* einige Code fehlen hier, wie es ein Programm mit GUI ist, ist der Code juz viel zu lange)

##############creating###################### 

try: 
    wb_ID = load_workbook('list.xlsx') 
    ws_ID = wb_ID.active 
    pass 

except EnvironmentError as e:  # OSError or IOError... As FileNotFoundError only exist in Python 3.x version 
    print(os.strerror(e.errno)) #use operating system error to define FileNotFoundErrorError 
    from openpyxl import Workbook #import Workbook function to create new xlsx (excel) file 
    wb_ID = Workbook() 
    ws_ID = wb_ID.active 
    ws_ID['A1'] = "IC" 
    ws_ID.merge_cells('B1:E1') 
    ws_ID['B1'] = "Name" 
    ws_ID.merge_cells('F1:K1') 
    ws_ID['L1'] = "Email" 
    ws_ID['M1'] = "Height" 
    ws_ID['N1'] = "Gender" 
    ws_ID['K1'] = "Bloodtype" 
    ws_ID.merge_cells('O1:Q1') 
    ws_ID['O1'] = "Default Consultation Day" 
    ws_ID.merge_cells('R1:T1') 
    ws_ID['R1'] = "Latest Appoinment" 
    wb_ID.save("list.xlsx") 
    pass 
############editing######################### 
wb = load_workbook(filename='list.xlsx') 
ws = wb.active 
last_row = 1 
while True: 
    last_row += 1 
    cellchecker =ws['A'+str(last_row)].value #get the value of the cell 
    print(cellchecker) 
    print last_row 
    if cellchecker is None: #check if cell is empty-->then this row number is the new row 
     wb.save('list.xlsx') 
     break 
    else: 
     continue 

print(str(last_row)) #convert to string var before passing the var for worksheet function 
from openpyxl import Workbook 
wb = Workbook() 
ws = wb.active 
ws['A'+str(last_row)] = (str(entry_IC.get().strip(' '))) 
ws.merge_cells('B'+str(last_row)+':E'+str(last_row)) 
ws['B'+str(last_row)] = (str(entry_Name.get())) 
ws.merge_cells('F'+str(last_row)+':K'+str(last_row)) 
ws['F'+str(last_row)] = (str(entry_email.get().strip(' '))) 
ws['L'+str(last_row)] = (str(entry_Height.get().strip(' '))) 
ws['M'+str(last_row)] = gender_selected 
ws['N'+str(last_row)] = bloodtype_selected 
ws.merge_cells('O'+str(last_row)+':Q'+str(last_row)) 
ws['O'+str(last_row)] = str(default_selected_day) 
ws.merge_cells('R'+str(last_row)+':T'+str(last_row)) 
today = datetime.date.today() #as u might wonder why i redeclare this var since it already exist, but this is local var for this function only 
ws['T'+str(last_row)] = (str(today)) 

wb.save('list.xlsx') 

bemerkt, dass die Bearbeitung Teil der vorhandenen Daten überschrieben werden, wie in openpyxl Dokumentation gewarnt. Ich konnte wirklich keine Möglichkeit finden, bestehende .xlsx-Dateien zu ändern. Bitte hilf mir, ich stecke hier fest.

+0

Ich verstehe nicht, was das Problem ist: openpyxl können Sie vorhandene Dateien bearbeiten und dies beinhaltet das Überschreiben von Daten. Außerdem ist der Code unnötig ausführlich. –

+0

über Code führen zum Verlust von Originaldaten in der Datei, während neue Daten darin gespeichert werden @CharlieClark –

+0

Welche Daten verloren wo? Sie ersetzen absichtlich die Datei "list.xlsx" durch eine komplett neue Arbeitsmappe. –

Antwort

0

Ich habe dieses Problem mehrmals, und konnte es nicht mit reinem Python lösen; Sie können jedoch den folgenden Code verwenden, um einen VBA-Makro aus einem Python-Skript aufzurufen, das zum Ändern Ihrer vorhandenen Excel-Datei verwendet werden kann.

Dies hat mir erlaubt, kreative Wege zu finden, um die Arbeit zu rationalisieren, so dass ich Excel-Dateien niemals öffnen muss, um sie zu aktualisieren, selbst wenn die Datenverarbeitung oder das Sammeln Python erfordert.

# run excel macro from python 
import win32com.client 
fn = '//path/filename.xlsm' 
xl=win32com.client.Dispatch("Excel.Application") 
xl.Application.Visible = True 
xl.Workbooks.Open(Filename = fn,ReadOnly = 1) 
xl.Application.Run("macroname") 
xl=0 
+0

Haben Sie etwas dagegen, mir ein Beispiel dafür zu zeigen, wie Sie Ihre xlsx-Datei aktualisieren? Erstellt eine Dummy-Datei? Bitte und DANKE @Nathan Clement –

+0

@HashashihnAltheim Es hängt wirklich davon ab, was Sie tun möchten. Normalerweise beginne ich mit meinem Master .xlsm, den ich modifizieren möchte. Es hat normalerweise eine Menge Diagramme, bedingte Formatierung und Datenüberprüfung, was es schwierig macht, es in Python zu ändern. Ich werde dann neue Daten an einen bekannten Ort mit Python exportieren, dann benutze Python, um einen Makro in meinem Master .xlsm aufzurufen, der den Export in die Master-Tabelle kopiert. –