Daten eines Skriptes in EXCEL exportieren

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
Thorsten
User
Beiträge: 9
Registriert: Freitag 9. Juni 2006, 06:37

Hallo. Ich habe gesehen, dass es schon das eine oder andere dazu gab. Allerdings wurden da immer neue Excel-Dateien angelegt.

Ich möchte folgendes tun:

Ich habe ein Programm, aus dem ich mit Hilfe verschiedener Python-Skripte Daten auslese und momentan noch in eine txt-Datei schreibe. Schöner wäre es diese in eine bestehende EXCEL-Datei zu schreiben.

Beispiel:

Die EXCEL Datei liegt in "C:\meineDaten\Excel\Auswertung.xls.
In der Excel gibt es ein Tabellenblatt "Werte"
In diesem Tabellenblatt will ich meine Daten: "Name" "wert" ab Zeile2 in die Spalten A und B eintragen also so

Spalte A SpalteB
Name1 Wert1
Name2 Wert2
......

Wie realisiere ich sowas?

Danke schonmal für die Hilfe.
Gruß
Thorsten
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

Vielleicht hilft das:

Code: Alles auswählen

from win32com.client import Dispatch


xlApp = Dispatch("Excel.Application")
xlApp.Visible = 1
xlApp.Workbooks.Add()
xlApp.ActiveSheet.Cells(2,1).Value = 'Name'
xlApp.ActiveSheet.Cells(3,1).Value = 'Name'
xlApp.ActiveSheet.Cells(2,2).Value = 'Name1'
xlApp.ActiveSheet.Cells(3,2).Value = 'Name2'

xlApp.ActiveWorkbook.Close(SaveChanges=1)
xlApp.Quit()
xlApp.Visible = 0
Das ist nur, was ich auf die schnelle noch finden konnte, habs bissl an
dein Beispiel angepasst. Genauer gehts auf die schnelle aber net^^
Thorsten
User
Beiträge: 9
Registriert: Freitag 9. Juni 2006, 06:37

Ok soweit so gut. Jetzt ist noch die Frage wie ich eine bestimmte Datei aufrufe und wie ich ein bestimmtes Tabellenblatt aufrufe.

Dann noch eine Frage: "win32com.client" ist das eine Python Bibliothek oder muss ich dazu noch was zusätzliches installieren? Ich meine in einem anderen Beitrag stand da, dass man dazu noch ein Programm installieren muss. Bin mir aber nicht ganz sicher.

Gibt es zu diesen Befehlen in für win32com.client eigentlich eine Dokumenation? Also was es für Befehle gibt und was die genau machen?

Danke aber schonmal für den Beispielcode


Gruß
Thorsten
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Thorsten hat geschrieben:Ok soweit so gut. Jetzt ist noch die Frage wie ich eine bestimmte Datei aufrufe und wie ich ein bestimmtes Tabellenblatt aufrufe.
Bezugnehmend auf das vorherige Beispiel:

Code: Alles auswählen

xlApp.Workbooks.Open("C:\meineDaten\Excel\Auswertung.xls")
xlApp.ActiveWorkbook.Worksheets("Werte").Activate()
Das sind übrigens keine win32com.client Befehle, sondern Aufrufe, die an Excel weitergeleitet werden. Als Dokumentation hierzu dient die VBA-Hilfe.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Thorsten hat geschrieben:Die EXCEL Datei liegt in "C:\meineDaten\Excel\Auswertung.xls.
In der Excel gibt es ein Tabellenblatt "Werte"
In diesem Tabellenblatt will ich meine Daten: "Name" "wert" ab Zeile2 in die Spalten A und B eintragen also so
[...]
Wie realisiere ich sowas?
Hi Thorsten!

Diese Antwort gebe ich wahrscheinlich Allen.

Öffne Excel. Zeichne ein Makro auf, in dem du die Datei öffnest, befüllst und dann wieder schließt. Analysiere dieses VBA-Makro und versuche daraus ein Python-Skript zu erstellen.

So musst du nur noch die Syntax an Python anpassen und zuerst mit ``Dispatch("Excel.Application")`` zum Excel-Objekt kommen.
Bis alles läuft "Visible = 1" und sobald es funktioniert, kannst du das alles im Hintergrund laufen lassen.

WICHTIG!!! Zerstöre nachher das Excel-Objekt mit "del", sonst schwirrt es weiter im Speicher herum.
Hier findest du ein schönes Beispiel von mir: http://www.python-forum.de/post-32375.html#32375

Wenn du beim Übersetzen des VBA-Makros in ein Python-Skript hilfe brauchst, dann helfen wir gerne weiter.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Thorsten hat geschrieben:"win32com.client" ist das eine Python Bibliothek oder muss ich dazu noch was zusätzliches installieren?
Hi Thorsten!

pywin32 bekommst du hier: http://sourceforge.net/project/showfile ... p_id=78018

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Thorsten
User
Beiträge: 9
Registriert: Freitag 9. Juni 2006, 06:37

Hallo. Danke für die schnelle und kompetente Hilfe. Ich werde versuchen das heute noch zu testen. Jetzt habe ich aber noch zwei Fragen:

1.Ich arbeite zwangsweise noch mit Python 2.1. Dafür habe ich aber keine pywin32 Version gefunden. Das fängt erst bei 2.2 an. Kann ich die dann trotzdem verwenden?

2. Ist das ein Open Source Programm oder einfach eine Software die kostenlos erhältlich ist?

Gruß
Thorsten
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Thorsten hat geschrieben:1.Ich arbeite zwangsweise noch mit Python 2.1.
[...]
2. Ist das ein Open Source Programm oder einfach eine Software die kostenlos erhältlich ist?
Hi Thorsten!

Dann bleibt dir nichts anderes übrig, als auf ein neueres Python upzudaten. Alles andere wird wohl mehr Probleme bereiten als diese zu lösen.

Du musst ja nicht einmal updaten. Du kannst mehrere Python-Versionen nebeneinander installieren. Das geht mit der Installations-Option "REMOVE=Extensions". Siehe auch hier: http://www.python-forum.de/post-19119.html#19119
und hier: http://www.python.org/download/releases/2.4/msi/

http://sourceforge.net/project/showfile ... e_id=79063
Die Zip-Dateien enthalten den Quellcode.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Thorsten
User
Beiträge: 9
Registriert: Freitag 9. Juni 2006, 06:37

So einfach ist das leider nicht. Die Python 2.1 ist in dem Programm integriert in dem ich auch die Skripte schreibe und ausführe. Ich glaube da muss ich mich dann so oder so mal informieren, wie ich das pywin32 da in die Software mit integrieren muss, damit das funktioniert.

Gruß
Thorsten
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Thorsten hat geschrieben:So einfach ist das leider nicht. Die Python 2.1 ist in dem Programm integriert in dem ich auch die Skripte schreibe und ausführe.
Hi Thorsten!

Das ist auch kein großes Problem. Installiere dir das neueste Python und das dazu passende pywin32. Vom Programm aus, das nur Python 2.1 integriert hat, startest du dein Programm als eigenen Prozess.

Du kannst dir alle Daten die du z.B. vom eingeschränkten Programm aus exportieren möchtest, mit Pickle in eine Datei schreiben und den Pfad, zur Datei mit den Einstellungen, als Kommandozeilenparameter an das Python 2.4-Programm übergeben. Pickle gab es auch schon im 2.1'er Python.

Du kannst aber auch das Modul "subprocess" und "pickle" verwenden um Daten direkt über STDIN und STDOUT von einem Prozess zum nächsten zu transportieren. Siehe: http://www.python-forum.de/topic-4941.html

Ich glaube, "subprocess" lässt sich auch unter Python 2.1 zum Laufen bringen. Diese Frage kann "jens" sicher beantworten. Der hat sich, glaube ich, schon mal damit befasst.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

So könntest du Daten von einem Prozess zum nächsten weiter geben.

sender.py:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

# sender.py
# Dieses Programm kann mit dem alten Python 2.1 ausgeführt werden

import os
import pickle

TMP_FILENAME = "datenaustausch.tmp"


# Daten, die übergeben werden sollen
data = (
    {"vorname": "Gerold", "nachname": "Penz"},
    {"vorname": "Bernhard", "nachname": "Mustermann"},
)

# Temporäre Datei erstellen
tmpfile = open(TMP_FILENAME, "wb")

# Daten in temp. Datei speichern und Datei schließen
p = pickle.dump(data, tmpfile)
tmpfile.close()

# Empfängerprogramm (Python 2.4) aufrufen
os.system("empfaenger.py " + TMP_FILENAME)

# Temporäre Datei löschen
os.remove(TMP_FILENAME)
empfaenger.py:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

# empfaenger.py
# Dieses Programm wird mit Python 2.4 ausgeführt...

import sys
import pickle


# Prüfe ob der Pfad zur temp. Datei übergeben wurde
assert(len(sys.argv) == 2)

# Datei öffnen, Daten laden und wieder schließen
tmpfile = open(sys.argv[1], "rb")
data = pickle.load(tmpfile)
tmpfile.close()

print data
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Thorsten
User
Beiträge: 9
Registriert: Freitag 9. Juni 2006, 06:37

Hallo gerold. Danke für deine große Unterstützung.

Ich werde mal sehen ob ich das so hinbekomme. Wenn nicht könnte ich noch versuchen die Daten in eine CSV-Datei zu speichern wobei ich da noch interessant wäre ob man da vorher den Datentyp festlegen kann. Bei meinem Versuch wurden Zahlen als "Standard" interpretiert und können ohne die Zellen in EXCEL nochmal um zu formatieren nicht für Berechnungen benutzt werden.

Gruß
Thorsten
Antworten