Ein Arbeitsblatt kopieren und einfügen

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
python_fan
User
Beiträge: 13
Registriert: Mittwoch 12. März 2008, 14:06

Hallo,

ich bin neu hier. Ich habe jetzt eine Aufgabe und weiß nicht, wie ich sie dann erledigen kann.

Ich soll ein bestimmtes Arbeitsblatt von einer Excel-Datei kopieren und in einer anderen Excel-Datei ein neues Arbeitsblatt erstellen und dann das kopierte Arbeitsblatt in das neue Arbeitsblatt einfügen. Dabei soll das Format auch nicht verloren gehen. Das alles soll mit Python erledigt werden. Ich weiß , wie man mit python die Daten aus der Excel-Datei lesen und auch in die Excel-Datei schreiben kann. Aber ich weiß nicht, wie man ein Arbeiltsblatt kopiert und wieder einfügt. Daher suche ich eine Hilfe.

Danke.
Zuletzt geändert von python_fan am Mittwoch 12. März 2008, 15:42, insgesamt 1-mal geändert.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

python_fan hat geschrieben:Ich weiß , wie man mit python die Daten aus der Excel-Datei lesen und auch in die Excel-Datei schreiben [kann]
Ok, dann weist du vmtl mehr als viele hier (üblicherweise ist die Antwort, MsOffice betreffend: "vergiss es").
Welche Bibliothek benutzt du? Vielleicht kann man da was finden.
Und, auch wenn ich die "Sprache" hasse, aber VBA kann sowas, und ist (*lufthol, schluck*) hierfür vielleicht tatsächlich besser geeignet.
python_fan
User
Beiträge: 13
Registriert: Mittwoch 12. März 2008, 14:06

Hallo keppla,

vielen Dank für die Antwort.

Ich habe auch erst seit einigen Tagen von diesem Forum gelernt, wie man eine Excel-Datei mit Python ungefähr behandeln kann. Als ich das Ergebnis mit meinem kleinen Script in unserem Team gezeigt habe, war die höhere Anforderung gestellt. Jetzt weiß ich wirklich nicht mehr, wie ich dieses Problem lösen kann.

Übrigens, ich benutze win32com. Von VBA habe ich keine Ahnung.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Auf diesem Auszug aus der Microsoft Visual Basic-Hilfe von Excel könnte man doch aufbauen. Es müsste nur entsprechend an die "Python-Syntax" angepasst werden:

Code: Alles auswählen

Beispiel zur Copy-Methode

In diesem Beispiel wird Sheet1 kopiert und die Kopie hinter Sheet3 eingefügt.

Worksheets("Sheet1").Copy after := Worksheets("Sheet3")
Im folgenden Beispiel wird der verwendete Bereich in Sheet1 kopiert und ein neues Tabellenblatt erstellt.
Anschließend werden die Werte des kopierten Bereichs darin eingefügt.

Worksheets("Sheet1").UsedRange.Copy
Set newSheet = Worksheets.Add
newSheet.Range("A1").PasteSpecial Paste:=xlValues
In diesem Beispiel werden die Formeln im Bereich A1:D4 von Sheet1 in die Zellen E5:H8 in Sheet2 kopiert.

Worksheets("Sheet1").Range("A1:D4").Copy _
    destination:=Worksheets("Sheet2").Range("E5")
MfG
HWK
python_fan
User
Beiträge: 13
Registriert: Mittwoch 12. März 2008, 14:06

Hallo HWK,

danke für deinen Lösungsvorschlag. Soviel ich weiß, gibt es für die Python-Klasse Worksheet auch die Methode "Copy" und "Paste". Ich weiß nun nicht, wie man diese Mrthoden aufruft und was zurück gegeben wird.

Z.B. was bedeutet "Copy before" oder "Copy after"? Muß man vor "Copy" erst "Select all" machen und wie? Kann man den Rückgabewert von "Copy" in die Methode "Paste" von einer anderen Instanz einsetzen?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

HWK hat geschrieben:Auf diesem Auszug aus der Microsoft Visual Basic-Hilfe von Excel...
Von allein geht es nicht. Du musst Dich schon ein bisschen mit VBA beschäftigen. Blätter doch einfach mal etwas in der o.g. Hilfe.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

So, ich habe mir doch mal für Dich die Mühe gemacht. Das folgende Beispiel kopiert Tabelle 1 aus Mappe 1 in Tabelle 1 von Mappe 2.

Code: Alles auswählen

import os
import win32com.client

excel_app = win32com.client.dynamic.Dispatch('Excel.Application')
excel_workbook1 = excel_app.Workbooks.Open(os.path.abspath('Mappe1.xls'))
excel_workbook1.Worksheets('Tabelle1').UsedRange.Copy()
excel_workbook2 = excel_app.Workbooks.Open(os.path.abspath('Mappe2.xls'))
excel_workbook2.Worksheets('Tabelle1').Range('A1').PasteSpecial()
excel_workbook1.Close()
del excel_workbook1
excel_workbook2.Close(SaveChanges=True)
del excel_workbook2
excel_app.Quit()
del excel_app
MfG
HWK
Zuletzt geändert von HWK am Donnerstag 13. März 2008, 21:52, insgesamt 1-mal geändert.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Versehentlich auf Zitat statt Edit gekommen.
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Also ich würd mir das nicht mit win32com antun ... schon weil es ohne Excel installiert zu haben nicht geht.

PyExcelerator und XLRD empfehle ich da ...

PyExcelerator ist total geil für das erzeugen von allen möglichen Excel sheets inklusive formeln.

Habe da schon einiges mit gebaut.
python_fan
User
Beiträge: 13
Registriert: Mittwoch 12. März 2008, 14:06

Hallo allerseits,

vielen Dank für die Info und vor allem für das Beispiel von HWK.

Ich werde mal das Beispiel ausprobieren und erweitern.
python_fan
User
Beiträge: 13
Registriert: Mittwoch 12. März 2008, 14:06

Hallo,

die Copy-Funktion funktioniert bei Text sehr gut, aber nicht bei Bildern. In der Vorlage sind Texte und Bilder vorhanden. Aber nach Copy und Paste sind Texte da, aber nicht Bilder. Wer kann mir helfen?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Du könntest noch das komplette Arbeitsblatt als neues Arbeitsblatt in die zweite Arbeitsmappe kopieren:

Code: Alles auswählen

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

import os
import win32com.client

excel_app = win32com.client.dynamic.Dispatch('Excel.Application')
excel_workbook1 = excel_app.Workbooks.Open(os.path.abspath('Mappe1.xls'))
excel_workbook2 = excel_app.Workbooks.Open(os.path.abspath('Mappe2.xls'))
excel_workbook1.Worksheets('Tabelle1').Copy(excel_workbook2.
                                            Worksheets('Tabelle3'))
excel_workbook1.Close()
del excel_workbook1
excel_workbook2.Close(SaveChanges=True)
del excel_workbook2
excel_app.Quit()
del excel_app
MfG
HWK
python_fan
User
Beiträge: 13
Registriert: Mittwoch 12. März 2008, 14:06

Hallo HWK,

anscheint funktioniert die folgende Zeile nicht:

Code: Alles auswählen

excel_workbook1.Worksheets('Tabelle1').Copy(excel_workbook2.
                                            Worksheets('Tabelle3'))

Das heißt, es wird nichts in "Tabelle1" kopiert.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Bißchen off-topic:
Mad-Marty hat geschrieben:PyExcelerator ist total geil für das erzeugen von allen möglichen Excel sheets inklusive formeln.
Finde ich auch ein sehr gutes Modul, insbesondere unter LINUX/UNIX. Aber ich habe leider bemerken müssen, daß komplexe Sheets von der aktuellen EXCEL-Vista-Version nicht mehr korrekt gelesen werden können. Und das Paket wird nicht mehr weiterentwickelt. Also rate ich inzwischen davon ab es zu nutzen, bzw. sich als Einsteiger darin einzuarbeiten.

Gruß,
Christian
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

python_fan hat geschrieben:Hallo HWK,

anscheint funktioniert die folgende Zeile nicht:

Code: Alles auswählen

excel_workbook1.Worksheets('Tabelle1').Copy(excel_workbook2.
                                            Worksheets('Tabelle3'))

Das heißt, es wird nichts in "Tabelle1" kopiert.
Doch es funktioniert:
Es kopiert Tabelle 1 aus Workbook1 als Tabelle1... als neues Arbeitsblatt vor Tabelle 3 in Workbook2. Die komplette Tabelle kannst Du meines Wissens nicht in eine andere Tabelle kopieren.
MfG
HWK
Antworten