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
Excel-Tabelle mit Python bearbeiten
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.
Du müsstest also die bestehende Tabelle lesen, dann die neue Tabelle anlegen, die alten Daten hinein schreiben und die neuen Anhängen.
- pillmuncher
- User
- Beiträge: 1527
- 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.
@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?Papageno hat geschrieben:@Galunder13: Mit dem habe ich innerhalb kürzester Zeit alle meine Excel Fragen gelöst: http://www.python-excel.org/
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?
Da sind doch jede Menge Beispiele in dem genannten Link vorhanden.
Ganz grob:
öffnen:
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
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)
Speichern geht irgendwie umgekehrt, das habe ich noch nicht gemacht
Am besten schaust du dir die Doku an, ist gar nicht wild.
Viel Erfolg
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)
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)
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.
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.
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.
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.
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.
Alternativ kannst du LibreOffice nehmen. Wenn ich das richtig verstanden habe kann das sogar Makros in Python.
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.
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.
.. .und Apache OpenOffice.sparrow hat geschrieben:LibreOffice nehmen
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.
งูหลาม
@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...
Es gibt auch .net und java-Bibliotheken, die deutlich mehr können, wenn also Iron- oder Jython eine Alternative sind...
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?
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?
@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/
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/
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 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?
Ich habe es versucht, leider scheint es nicht zu funktionieren, zumindest nicht so: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/
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')
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älenPapageno hat geschrieben: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 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?

@am2: Du musst das Ergebnis natürlich auch speichern, also nicht nur das Attribut `save` abfragen sondern auch *aufrufen* → ``Workbook.save()``
Ich TrottelBlackJack hat geschrieben:@am2: Du musst das Ergebnis natürlich auch speichern, also nicht nur das Attribut `save` abfragen sondern auch *aufrufen* → ``Workbook.save()``

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