Excel-Tabelle mit Python bearbeiten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Galunder13
User
Beiträge: 8
Registriert: Dienstag 21. Oktober 2014, 10:50

Hallo Leute,

ich möchte mit Python, lediglich eine bereits bestehende EXCEL-Tabelle erweitern. Nun finde ich leider keine gescheiten Ansätze. Mit xlwt scheint's mir so als könnte man dadurch nur neue EXCEL-Tabellen erstellen, aber keine bereits vorhandene Tabelle erweitern. Wen jemand bitte Lösungsansätze hat, ich wäre sehr dankbar!

Gruß
Galunder13
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Das ist schon ein paar Tage her, dass ich mich damit beschäftigt habe, aber soweit ich mich erinnere wird immer eine neue Excel-Tabelle erstellt, wenn du sie bearbeiten willst.

Du müsstest also die bestehende Tabelle lesen, dann die neue Tabelle anlegen, die alten Daten hinein schreiben und die neuen Anhängen.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Galunder13: Unter Windows kannst du Excel mit win32com fernsteuern. https://www.google.de/search?q=win32com+python+excel
In specifications, Murphy's Law supersedes Ohm's.
Papageno
User
Beiträge: 33
Registriert: Sonntag 21. Dezember 2014, 10:53

@Galunder13: Mit dem habe ich innerhalb kürzester Zeit alle meine Excel Fragen gelöst: http://www.python-excel.org/
am2
User
Beiträge: 17
Registriert: Montag 8. September 2014, 09:57

Papageno hat geschrieben:@Galunder13: Mit dem habe ich innerhalb kürzester Zeit alle meine Excel Fragen gelöst: http://www.python-excel.org/
Und wie hast Du dieses Problem genau gelöst?
Also eine Excel- Datei, von der Du nur weißt, dass es z.B. ein Tabellenblatt XY gibt, dass du modifizieren willst (Beispiel: Spalte 3 = Spalte 1 + Spalte 2).
Darüber hinaus kann es andere Tabellenblätter geben mit Formatierungen, Rechten, VBA- Code etc.

Wie kann man eine solche Excel- Tabelle mit python (ohne Fernsteuerung) bearbeiten?
Papageno
User
Beiträge: 33
Registriert: Sonntag 21. Dezember 2014, 10:53

Da sind doch jede Menge Beispiele in dem genannten Link vorhanden.

Ganz grob:
öffnen:

Code: Alles auswählen

 

import xlrd
import xlwt
      
        book = xlrd.open_workbook(filename)
        print("Worksheet name(s):", book.sheet_names())
        sh = book.sheet_by_index(0)
        print( sh.name, sh.nrows, sh.ncols)
Auslesen der Zellen dann mit sh.cell_value(rownummer,colnummer)
Speichern geht irgendwie umgekehrt, das habe ich noch nicht gemacht

Am besten schaust du dir die Doku an, ist gar nicht wild.

Viel Erfolg
am2
User
Beiträge: 17
Registriert: Montag 8. September 2014, 09:57

Ich hatte das damals erfolglos versucht (sowohl die Beispiele als auch die Doku).

xlrd liest (und man kann dorthin nie wieder schreiben)
xlwt schreibt eine neue Datei (man kann nicht in eine vorhandene etwas einfügen)

Wenn ich eine mir unbekannte Datei habe, die gespickt ist mit VBA- Scripten, bedingten Formatierungen, Diagrammen, in die ich irgendein Tabellenblatt einfügen will, ohe den Rest zu manipulieren, dann bin ich erschossen.

Ich benötige irgendetwas in der folgenden Form (pseudo)

Code: Alles auswählen

Workbook = ÖffneDatei(NameDerDatei)
Zaehler = 0
wiederhole
  Zaehler += 1
  IstFrei = FindeTabellenblatt (MeinName+Zaehler) == None
bis IstFrei == True
Tabellenblatt = ErzeugeTabellenblatt(MeinName + Zaehler)
FuelleTabellenblatt (Tabellenblatt)
SpeichereDatei(WorkBook)
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Ich habe das so gemacht, dass ich in der Excel-Tabelle ein Quellblatt habe, aus dem ich alle Werte in Excel ziehe.
Das Quellblatt lese ich mit Python aus, manipuliere es nach belieben und schreibe es in eine neue Excel-Datei.
Von da kopiere ich den Kram in Excel von der geschriebenen in die Quelltabelle, oder verknüpfe die direkt auf die andere Datei.
am2
User
Beiträge: 17
Registriert: Montag 8. September 2014, 09:57

Na ja, aber das löst mein Problem ja letztlich nicht.
Der Anfang würde genauso laufen, ich lese ein Blatt aus einer Exceltabelle. Aber ich kann es eben nicht in eine neue Datei schreiben, sondern ich muss die Originaltabelle modifizieren.

Ich muss für meinen Häuptling ein tool schreiben, das auch mit wenig EDV- Kenntnissen das liefert, was er erwartet.
Also Exceltabelle auf, Tabellenblatt ausfüllen, eine exe starten und das Ergebnis in der selben Excel- Tabelle wiederfinden.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Warum schreibst du den Kram dann nicht einfach in VisualBasic? Oder wie dieser Makrokram rund um Microsoft Office heißt.

Alternativ kannst du LibreOffice nehmen. Wenn ich das richtig verstanden habe kann das sogar Makros in Python.
am2
User
Beiträge: 17
Registriert: Montag 8. September 2014, 09:57

Weil ich keinen Einfluss auf die Datei haben will/darf/soll etc, ich soll sie nur ergänzen. Sie geht mich nichts an, ich bekomme sie nie zu Gesicht. Ich muss nur ein Tool schreiben, dass auf Knopfdruck diese Datei an den vereinbarten Stellen füllt.

Ich weiß, dass ich theoretisch beim Öffnen der Datei auch alles mögliche andere herausziehen und irgendwohin schicken kann. Aber zum Einen wird mir vertraut, dass ich eben das nicht tue, zum anderen ist ja der Quelltext bekannt. Aber die betroffenen Excel- Dateien entstehen ohne mein Zutun lange nach meinem Script.
Benutzeravatar
ngulam
User
Beiträge: 35
Registriert: Freitag 18. Oktober 2013, 11:03

sparrow hat geschrieben:LibreOffice nehmen
.. .und Apache OpenOffice.

Da gibt es eine Anbindung für Python zur API.

Für "Office"-Kram mache ich das lieber in OO/LO direkt, anstelle die xlrd/xlwt Module zu nutzen.

Die Python-Skripte können von der Office-Installation aus gestartet werden, oder das Office von der Kommandozeile fernsteuern.

Fragen? Fragen!



@am2: Warum nicht in eine neue Datei schreiben, die alte sichern, die Neue dann unter "altem Namen" speichern?
Edit: sehe gerade Dein Posting... ist dann echt schwer.
งูหลาม
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Naja, die Aufgabenstellung schreit halt danach durch Makros in Office gelöst zu werden :)
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Galunder13: erzähl doch ein bißchen mehr, was Du machen willst. Die COM-Schnittstelle von Excel aus Python heraus anzuprechen, ist doch das einfachste. Wenn es nur darum geht, den Inhalt bestimmter Zellen zu ändern, kann man über Python auch direkt XML lesen und schreiben.
Es gibt auch .net und java-Bibliotheken, die deutlich mehr können, wenn also Iron- oder Jython eine Alternative sind...
am2
User
Beiträge: 17
Registriert: Montag 8. September 2014, 09:57

Ich fürchte, Galunder13 ist nicht mehr Teilnehmer der Diskussion.

Muss ich aus dem Fehlen geeigneter Antworten folgern, dass es keine Möglichkeit gibt, eine Excel- Tabelle ohne Zuhilfenahme von Excel selbst allein mit den Mitteln von Python zu modifizieren?
Ich kann also entweder Lesen ODER schreiben, aber nicht etwas laden, verändern und speichern?
BlackJack

@am2: Du kannst schon etwas laden, verändern, und speicher, bzw. Filter schreiben die zwischen laden und speichern die Daten verändern/erweitern, die Frage ist allerdings ob dabei wirklich alles aus der Ursprungsdatei diesen Vorgang überlebt. Excel-Dateien sind ein relativ komplexes Format das entweder geschlossen ist (ältere Versionen), oder offen spezifiziert, aber dafür wirklich sehr komplex (XML-basierte Versionen). Selbst verschiedene Excel-Versionen können sehr aufwändige Dokumente kaputtmachen oder zumindest nicht 1:1 wieder speichern wenn man Pech hat.

Falls es die neuen XML-basierten Formate von Excel sein dürfen, könntest Du auch mal einen Blick auf OpenPyxl werfen: http://openpyxl.readthedocs.org/en/latest/
Papageno
User
Beiträge: 33
Registriert: Sonntag 21. Dezember 2014, 10:53

am2 hat geschrieben: Muss ich aus dem Fehlen geeigneter Antworten folgern, dass es keine Möglichkeit gibt, eine Excel- Tabelle ohne Zuhilfenahme von Excel selbst allein mit den Mitteln von Python zu modifizieren?
Ich kann also entweder Lesen ODER schreiben, aber nicht etwas laden, verändern und speichern?
Benutze die win32com Schnittstelle. Das greift direkt auf die installierte MS Office Version zu und kann die Orginaldateien bearbeiten. Beispiele findest du in anspruchsvollen englischsprachigen Foren.
am2
User
Beiträge: 17
Registriert: Montag 8. September 2014, 09:57

BlackJack hat geschrieben:@am2: Du kannst schon etwas laden, verändern, und speicher, bzw. Filter schreiben die zwischen laden und speichern die Daten verändern/erweitern, die Frage ist allerdings ob dabei wirklich alles aus der Ursprungsdatei diesen Vorgang überlebt. Excel-Dateien sind ein relativ komplexes Format das entweder geschlossen ist (ältere Versionen), oder offen spezifiziert, aber dafür wirklich sehr komplex (XML-basierte Versionen). Selbst verschiedene Excel-Versionen können sehr aufwändige Dokumente kaputtmachen oder zumindest nicht 1:1 wieder speichern wenn man Pech hat.

Falls es die neuen XML-basierten Formate von Excel sein dürfen, könntest Du auch mal einen Blick auf OpenPyxl werfen: http://openpyxl.readthedocs.org/en/latest/
Ich habe es versucht, leider scheint es nicht zu funktionieren, zumindest nicht so:

Code: Alles auswählen

from openpyxl import Workbook,load_workbook

def TryWrite(FileName,SheetName):
    WorkBook = load_workbook(FileName, read_only = False)
    WorkSheet = WorkBook[SheetName]
    Content = WorkSheet['A1'].value
    print Content
    WorkSheet['A1'] = Content + 1
    WorkBook.save

TryWrite('Test.xlsx','Test')  
TryWrite('Test.xlsx','Test')
TryWrite('Test.xlsx','Test')
In A1 verändert sich der Wert überhaupt nicht.
Papageno hat geschrieben:
am2 hat geschrieben: Muss ich aus dem Fehlen geeigneter Antworten folgern, dass es keine Möglichkeit gibt, eine Excel- Tabelle ohne Zuhilfenahme von Excel selbst allein mit den Mitteln von Python zu modifizieren?
Ich kann also entweder Lesen ODER schreiben, aber nicht etwas laden, verändern und speichern?
Benutze die win32com Schnittstelle. Das greift direkt auf die installierte MS Office Version zu und kann die Orginaldateien bearbeiten. Beispiele findest du in anspruchsvollen englischsprachigen Foren.
Das ist ja dann wohl NICHT ohne Zuhilfenahme von Excel. Ich will nicht die Anwendung (oder Teile davon) fernsteuern, sondern eine vorhandene Datei ausschließlich mit python modifizieren. Anderenfalls klappt das weder unter Linux, noch unter Android oder auf einem Windows- Rechner ohne Office etc. Wenn ich eine Anwendung fernsteuern will, dann kann ich auch andere Wege gehen, als mich durch python zu quälen ;)
BlackJack

@am2: Du musst das Ergebnis natürlich auch speichern, also nicht nur das Attribut `save` abfragen sondern auch *aufrufen* → ``Workbook.save()``
am2
User
Beiträge: 17
Registriert: Montag 8. September 2014, 09:57

BlackJack hat geschrieben:@am2: Du musst das Ergebnis natürlich auch speichern, also nicht nur das Attribut `save` abfragen sondern auch *aufrufen* → ``Workbook.save()``
Ich Trottel :)
Leider kann ich nicht diese Datei direkt speichern, sondern muss sie unter einem neuen Namen speichern.

Code: Alles auswählen

from openpyxl import Workbook,load_workbook

def TryWrite(FileName, FileNameSave, SheetName):
    WorkBook = load_workbook(FileName, read_only = False)
    WorkSheet = WorkBook[SheetName]
    Content = WorkSheet['A1'].value
    print Content
    WorkSheet['A1'] = Content + 1
    WorkBook.save(FileNameSave)

TryWrite('Test.xlsx','Test2.xlsx','Test')  
TryWrite('Test2.xlsx','Test3.xlsx','Test')  
TryWrite('Test3.xlsx','Test2.xlsx','Test')  
TryWrite('Test2.xlsx','Test3.xlsx','Test')  
TryWrite('Test3.xlsx','Test2.xlsx','Test') 
Aber das lässt sich im Grunde in den Griff bekommen.
Meine aktuelle Beobachtung:
- weitere Tabellenblätter werden mit Inhalt geladen
- Zum Inhalt zählen
-- übliche Zellinhalte (Text, Zahlen, Formeln)
-- bedingte Formatierungen
- nicht funktionert
-- Pivottabelle (wird nur als Datentabelle kopiert)
-- Shapes (verschwinden)
-- Diagramme (verschwinden)

Also noch nicht alles so, wie man sich das wünschen würde, aber immerhin eine gute Lösung
Vielen Dank
Antworten