Daten aus Calc per Makro in Writer

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

Moderator: Moderatoren

Ein__Stadtmensch
***
Beiträge: 61
Registriert: Do, 18.12.2003 10:08

Daten aus Calc per Makro in Writer

Beitrag von Ein__Stadtmensch »

Hallo,

ich möchte gerne eine Calc-Tabelle auslesen und die Zellwerte in dem Writer in Textfelder ablegen.

Das Problem ist dabei, dass ich nicht genau weiß, wie man eine andere Datei (eben die Calc-Datei) öffnet.

Code: Alles auswählen

Dim Calc as Object
Dim sheet as Object
Dim args()
Calc = objDesktop.loadComponentFromURL("file:///C:/Pfad/daten.sxc","_blank", 0, args)
sheet = Calc.currentSelection.getSpreadsheet()
So geht es scheinbar nicht...
Ein__Stadtmensch
***
Beiträge: 61
Registriert: Do, 18.12.2003 10:08

Danke!!

Beitrag von Ein__Stadtmensch »

Hey Charly,

das hat wunderbar funktioniert! Vielen Dank...

Gruß, Beni
Ein__Stadtmensch
***
Beiträge: 61
Registriert: Do, 18.12.2003 10:08

Aber...

Beitrag von Ein__Stadtmensch »

...gleich noch eine Frage hinterher:

Nun ist es so, dass ich wenn ich das Makro in dem Writer ausführe, danach Calc geöffnet ist.

Mit welchem Befehl kann man denn dann wieder automatisch in den Writer wechseln?
Ein__Stadtmensch
***
Beiträge: 61
Registriert: Do, 18.12.2003 10:08

Beitrag von Ein__Stadtmensch »

...und am Besten Calc auch noch geschlossen wird...
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Beitrag von Charly »

Hallo Stadtmensch!

Um zwischen Dokumenten hin und herzuwechseln brauchst du nur jedem Objekt eine Variable zuzuordnen. In meinem Beispiel habe ich dem Tabellendokument den Namen Calc zugeordnet. Du musst also als erstes dem Texdokument eine Variable zuordnen und dann erst das andere Dokument aufrufen.

Code: Alles auswählen

Dim oDoc as object
oDoc = ThisComponent
Mit oDoc kannst du auf das Textdokument und mit Calc auf das Tabellendokument zugreifen.

Bei deiner nächsten Frage würde ich zunächst das Tabellendokument speichern, vorausgesetzt, es ist eine Änderung eingetreten und dann schließen.

Code: Alles auswählen

If (Calc.isModified) Then 
	Calc.store()            
End if

Calc.close(0)
Hinweis ein: Ein neues Dokument braucht zum speichern folgenden Befehl:

Code: Alles auswählen

Calc.storeAsUrl(Url,Dummy())
Gruß
Charly
Ein__Stadtmensch
***
Beiträge: 61
Registriert: Do, 18.12.2003 10:08

Beitrag von Ein__Stadtmensch »

Das Speichern funktioniert nach deiner Anleitung wunderbar.

Beim Beenden findet er die Methode "close" nicht. Als ich die Methoden des Calc-Dokumentes ausgegeben habe, war close auch nicht dabei. Auf den ersten Blick klingt auch keine Methode nach Schliessen...

Hat dafür jemand eine Erklärung?
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo Stadtmensch,

die Methode close(0) sollte funktionieren. prüf mal Schreibweise oder so.

Keines Test Programm:
öffen ein Calc -Dokument, neues Makro:

Code: Alles auswählen

sub main
       oDoc=thisComponent
       oDoc.close(0)
end sub
und weg ist das dokument (eben geschlossen, ohne Nachfrage!!)

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Ein__Stadtmensch
***
Beiträge: 61
Registriert: Do, 18.12.2003 10:08

Beitrag von Ein__Stadtmensch »

Habe die Zeile kopiert... Bei mir hält er dann in der Zeile mit .close(0) an und gibt folgende Fehlermeldung aus:
OpenOffice.org 1.0.3
BASIC-Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden.
Liegt das vielleicht an der Version von OpenOffice?

Ich habe das Makro mit Writer und Calc ausgetestet. Ging in beiden Fällen nicht...
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Ja, wahrscheinlich Versionen-Problem.

Führe alle Basic-Test nur noch mit OOo 1.1.0 durch und da geht es. Es gab auch einige Änderungen zur Vorversion.

Also, updaten.

Anderer Versuch wäre dispose() , entweder so oder mit -1 in der Klammer. Damit "verschwinden" viele Objekte, vielleicht auch die Anwendung?

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
mecki_45
***
Beiträge: 69
Registriert: Mo, 23.02.2004 17:28

Daten aus Calc per Makro in Writer - Nachfrage

Beitrag von mecki_45 »

Hallo,
ich habe dies ganze hier verfolgt und ebenfalls umgesetzt, leider funktioniert es bei mir nur teilweise.
Was ich will ist ein kleinwenig anders.
Bei mir soll der Wert einer Zelle in OO_Calc incrementiert werden, das Ergebnis hiervon wird in die Zelle zurückgeschrieben und dieser zurückgeschriebene Wert soll nun in OO_Writer an die Stelle kopiert werden, an der der Textcursor steht.
Das Auslesen, berechnen und in OO_Calc zurückschreiben klappt, nur das übertragen des Werts in OO_Writer funktioniert nicht.

Any idea?

Gruß
Alex
openmind
****
Beiträge: 184
Registriert: So, 29.06.2003 15:00
Wohnort: Schweiz

Re: Daten aus Calc per Makro in Writer - Nachfrage

Beitrag von openmind »

mecki_45 hat geschrieben:Any idea?

any code?
Meine Installation: AMD Athlon XP 1600+, 512 MB RAM, SuSE Linux 8.2, OpenOffice 1.1
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
mecki_45
***
Beiträge: 69
Registriert: Mo, 23.02.2004 17:28

Beitrag von mecki_45 »

Hallo openmind,

anbei der komplette Code des Makro:

Sub Calculate_and_copy_to_OO_Writer
'--------------------------------------------------
' Variablen deklarieren
Dim Pfad as String ' Pfad und Dateiname
Dim Dummy()
Dim URL as String
Dim Calc as Object
Dim Sheet as Object ' Tabellenblatt
Dim Zelle as Object ' Zelle, z.B. A1
Dim Wert as Integer ' Zellinhalt als Integer

'-------------------------------------------------
' hier sollte eine Abfrage hin, ob das OO_Calc -Dokument
' gerade geöffnet ist
' wenn ja, Makro mit Hinweis auf nochmaliges Laden
' der Dokumentvorlage beenden
'--------------------------------------------------
' Variablen belegen
Pfad = "E:\Texte\zaehl_tab.sxc" ' Variable mit Pfad und Dateiname
URL = ConvertToUrl(Pfad)
Calc = StarDesktop.loadComponentFromUrl(URL, "_blank", 0, Dummy())

'------------------------------------------------------------------
' Zellinhalt holen, incrementieren und wieder zurückschreiben
' für spätere Verwendung
Sheet = Calc.sheets(0) ' Sheet 1 festlegen
Zelle = Sheet.getCellbyPosition (0,0) ' Position A1 setzen
Wert = Zelle.Value ' Zellwert an Variable
Wert = Wert + 1 ' Increment
Zelle.Value = Wert ' numerischen Wert in Zelle

'----------------------------------------------------------------
' OO_Calc -Dokument speichern und schließen
If (Calc.isModified) then ' Calc-Doku speichern, wenn geändert
Calc.store() ' (was ja passiert ist)
End if
Calc.close(0) ' Calc-Doku schliessen

'--------------------------------------------------------------------
' und jetzt wird der Inhalt der Variable "Wert" an die
' Cursorposition von OO_Writer kopiert

und das fehlt


End Sub
================================

Soweit das Makro. Bis auf die Datenübertragung nach OO_Writer funktioniert alles bestens. Der incrementierte Wert erscheint in OO_Calc, aber OO_Writer bleibt Datenlos.

Any idea?

Grüßle
Alex
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo Alex.

kleiner Tipp: Unter

http://www.amt-wiesbaden.de
im Bereich OpenOffice -> Downloads gibt es eine recht gut dokumentierte Vorlage "Rechnungsvorlage....".

Dort wird ein ähnliches Problem gelöst, die zu incrementierende Zahl jedoch aus einer einfachen Textdatei geholt statt uas einem Calc-Dokument.
Würde ich allerdings in deinem Fall aus Perfrmancegründen auch vorziehen, falls die Calc -Tabelle nicht noch andere Funktionen hat.

Der Code zum Einfügen in ein Writer Dokument ist dort gut beschrieben. Das sollte dir weiterhelfen.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
mecki_45
***
Beiträge: 69
Registriert: Mo, 23.02.2004 17:28

Beitrag von mecki_45 »

Hallo Thomas,
Danke für den Tipp.
Habe es ausprobiert und es hat auch kurzzeitig funktioniert.
Als ich dann das Ganze in eine Doku-Vorlage kopiert habe, begannen die Probleme.
OO meldet mir einen Fehler beim Übertragen des Inhalts an die Position der Textmarke - hier die betr. Zeile:

Cursor.String = Inhalt

Die Fehlermeldung besagt,das die ObjektVariable "Cursor" nicht definiert ist. Doch selbst dann,wenn ich "DIM Cursor as Object" definiere,klappt es nicht mehr.
Ich weiß beim besten Willen nicht, wo der Fehler liegen soll.

Gruß
Alex
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

HAllo Axel,

ok, da bräuchte ich mehr Code. Wie wurde der Cursoe definiert? nicht mit Dim , sondern richtig?

Entweder Code hier posten (im Zusammenhang), oder du schickst mir mal die Datei als PM. Dann kannich mehr sagen und evt. helfen.

Das Beispiel sollte eigentlich auch nicht dazu dienen, es zu kopieren, sondern, um das Prinzip zu verstehen. Im Beispiel "Rechnungsformular" wurde mit Tabellen gearbeitet und TExtmarken innerhalb davon gesetzt. Dort wird der Cursor völlig anders definiert wie im normalen Dokument. Vielleicht liegen hier die Fehler?

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Antworten