Tabellenblätter kopieren (Calc)

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

fichte.buche
***
Beiträge: 55
Registriert: Di, 29.03.2005 12:38

Tabellenblätter kopieren (Calc)

Beitrag von fichte.buche »

Hallo,

Ich möchte ein Makro erstellen mit dem ich ein Tabellenblatt (Sheet) von einer Datei in eine ander kopieren.

Innerhalb einer Datei funktioniert das z.B. mit

Code: Alles auswählen

oSheet.CopyByName("Name1", "Name2", 1)
Aber wie geht das von einer Datei in die andere.

Vielen Dank im Voraus
Fichte.Buche
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Fichte.buche,
..Aber wie geht das von einer Datei in die andere. ...
Nicht so einfach :wink:

Da usst du zuerst die andere Datei öffnen, das Objekt des Tabellenblattes erhalten und dann dieses als neues Tabellenbaltt dort einfügen.

Nicht getestet! Im Prinzip sollte es wie folgt gehen:

Code: Alles auswählen

...
oDok1 = thisComponent   'das aktive Dokument
oSheet = oDok1.sheets(0)   'das erste Tabellenblatt

sUrl = convertToURL("d:/meinPfad/meineDatei2.ods")  'die zweite Datei
oDok2 = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, Dummy())
oDok2.getSheets().insertByName("meineKopierteTab", oSheet)
...
Evt. musst du die zweite Tabelle zunächst als Instanz des zweiten Dokumentes erzeugen (oSheet2 = oDok2.createInstance("com.sun.star.sheet.Spreadsheet") )und dann den kompletten Inhalt der ersten Tabelle in den Ihnahlt der zweiten Tabelle kopieren. Das musst du einfach ausprobieren.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
fichte.buche
***
Beiträge: 55
Registriert: Di, 29.03.2005 12:38

Geht noch nicht so wie ich will

Beitrag von fichte.buche »

Hallo,

Vielen Dank Toxitom.
Ich hab inzwischen so einiges ausprobiert, aber ganz komm ich noch nicht dorthin wo ich will.
Mit dem (oDok2.getSheets().insertByName("meineKopierteTab", oSheet)) wie du schrieben hast funktionierts leider nicht.
Ich hab dann probiert ein neues Tabellenblatt einzufügen dies funktioniert auch mit

Code: Alles auswählen

oDoc.Sheets.insertNewByName( "Aktuell", 0 )
Aber wie kann man jetzt die ganze Tabelle samt Bildern, Formatierung usw. von der einen Datei in die nächst kopieren. Hierfür feht mir eine Idee wie ich das machen soll.
Bitte um Hilfe. DANKE

Fichte.Buche
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Ich kenne auch keinen nativen Code, jedoch:
Hierfür feht mir eine Idee wie ich das machen soll.
Naja, wie würdest Du es denn per Hand machen?

Das aufzuzeichnen gibt sowas hier:

Code: Alles auswählen

rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "DocName"
args1(0).Value = "jms1"
args1(1).Name = "Index"
args1(1).Value = 2
args1(2).Name = "Copy"
args1(2).Value = true

dispatcher.executeDispatch(document, ".uno:Move", "", 0, args1())
Wenn Du es selbst aufzeichnest kannst Du leicht nachvollziehen das:

Code: Alles auswählen

args1(0).Name = "DocName"
args1(0).Value = "jms1"
natürlich (in 1.1.x) nur der Dokumentname ist wenn das Dokument unter Eigenschaften bei "Titel" keinen Eintrag hat

Code: Alles auswählen

args1(1).Name = "Index"
args1(1).Value = 2
Da im Dialog nur der Punkt "einfügen vor" verfügbar ist und einfügen vor <x> als Index wieder <x> ergibt

Ja und damit hast Du alles, Du mußt nur:
*das zu kopierende Blatt aktivieren
*den Titel des Zieldokuments wissen
*wissen wo Du einfügen willst
*den obenstehenden Code ausführen

somit:

Code: Alles auswählen

Sub kopieren()
'das zu kopierende Blatt aktivieren
Sheet = ThisComponent.Sheets.getByName("Beispiel")
ThisComponent.CurrentController.setActiveSheet(Sheet)
'den Titel des Zieldokuments wissen
'-->zunächst öffnen:
Dim Dummy()
sUrl = convertToURL("C:\Datei.sxc")  'die zweite Datei 
oDok2 = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, Dummy()) 
'-->Titel oder nicht?
If oDok2.getDocumentInfo.title <> "" Then
titel = oDok2.getDocumentInfo.title
Else
i = 4
Do
i = i + 1
a = Right(oDok2.URL, i)
Loop While Left(a,1)<>"/"
titel = Right(a, LEN(a)-1)
end if 
'wissen wo Du einfügen willst
'weiß ich auch nicht, z.B.:
pos = 1 'ganz links
'den obenstehenden Code ausführen
dim document   as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
Dim args1(2) as new com.sun.star.beans.PropertyValue 
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
args1(0).Name = "DocName"
args1(0).Value = titel
args1(1).Name = "Index"
args1(1).Value = pos
args1(2).Name = "Copy"
args1(2).Value = true
dispatcher.executeDispatch(document, ".uno:Move", "", 0, args1())
End Sub

Gruß
Stephan
Antworten