Calc-Programmierung; arbeiten unter VB2005

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

Moderator: Moderatoren

dherr
*
Beiträge: 17
Registriert: Mi, 23.01.2008 17:02

Calc-Programmierung; arbeiten unter VB2005

Beitrag von dherr »

Hallo,
bin neu in OO. Programmiere mit VB2005 und fülle mit meinem Programm Calc-Tabellen aus. Das funktioniert bis auf zwei Probleme bestens:
Wenn ich eine Tabellenzeile mit meinen Daten ausgefüllt habe, entstehen öfters Zellen mit Zeilenumbruch, d.h., die Zeile wird höher als Standardhöhe. Ich berechne in meinem Programm aber die Summe der zeilenhöhen, um kontrollieren zu können, ob die Seitenhöhe erreicht wurde.
Die Zeilenhöhe zu ermitteln mache ich

Code: Alles auswählen

oRow = oSheet.Rows(zn)
oRow.OptimalHeight = True
zh = oRow.Height
Dabei sind zn die aktuelle Zeilennummer, zh die Zeilenhöhe. Es wird durch diese Befehlsfolge aber immer nur die Standardhöhe ausgegeben, nicht beispielsweise die dreifache Standardhöhe, wenn Umbruch in einer Zelle der Zeile besteht.

Auch der Befehl

Code: Alles auswählen

oRow = oSheet.Rows(zn)
oRow.IsStartOfNewPage = True
funktioniert nicht. Calc 'hängt sich auf', wie man so schön sagt.

Hat bitte jemand Lösungsvorschläge?
Gruß-
dherr
Dietrich
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Calc-Programmierung; arbeiten unter VB2005

Beitrag von Toxitom »

Hey dHerr,
dherr hat geschrieben:Es wird durch diese Befehlsfolge aber immer nur die Standardhöhe ausgegeben, nicht beispielsweise die dreifache Standardhöhe, wenn Umbruch in einer Zelle der Zeile besteht.
hmm, kann ich nicht nachvollziehen. Bei mir wird die tatsächliche Höhe der Reihe ausgegeben - auch wenn ich deinen Code nutze.
Ich denke allerdings auch, dass die "OptimalHeight" nicht gesetzt werden müsste - das ist sie doch sowieso???
Möglicherweise hast du aber einen Vorgabewert fest in den Zelleigenschaften (Zeilenhöhe) stehen ??

Gruss
Thomas

Ach ja: OOo 2.3.1 unter MS Vista
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
dherr
*
Beiträge: 17
Registriert: Mi, 23.01.2008 17:02

Re: Calc-Programmierung; arbeiten unter VB2005

Beitrag von dherr »

Hallo Thomas,
danke für die Antwort.
Ich habe das ganze auch ohne den Befehl .OptimalHeight getestet, mit dem gleichen Ergebnis.

Bei mir ist im Calc die Zeilenhöhe mit 4,5 festgelegt und die Checkbox 'Standard' angehakt.
Und zwar nur bei einer 'normalen' Zeile. Wenn ich mir das bei einer höheren Zeile anschaue, ist die richtige Höhe angezeigt und 'Standard' ist nicht angehakt.
Nur, wie kann ich das programmtechnisch verwerten?
Ich müsste ja, ehe ich die Zeile anspreche, erst irgendwie diese Standard-Checkbox 'ab'haken...?

OO 2.3.1.--- kann ich wohl nicht verwenden, weil der Kunde für den ich arbeite nur 2.0 hat.
Oder gibts da keine Probleme in der Kompatibilität?

Gruß-
Dietrich
Dietrich
dherr
*
Beiträge: 17
Registriert: Mi, 23.01.2008 17:02

Re: Calc-Programmierung; arbeiten unter VB2005

Beitrag von dherr »

Gleich noch was dazu:
Ich habe, um das zu testen Folgendes gemacht:
Habe ne Calc Tabelle geöffnet, die in den Anfangszeilen mit Daten gefüllt ist und die unterschiedlichsten Zeilenhöhen aufweist.
Dann:

Code: Alles auswählen

        For zz As Integer = 1 To 22
            oRow = oSheet.Rows(zz)
            Debug.Print(oRow.Height)
        Next
(ist VB2005, aber Prinzip ist klar)
Dabei schreibt er mir aber immer nur die 453 (1/100 mm) hin, aber nicht die verschiedenen Höhen... ??

Dietrich
Dietrich
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Calc-Programmierung; arbeiten unter VB2005

Beitrag von turtle47 »

Hi Dietrich,

versuche mal folgendes:

Code: Alles auswählen

Sub ZeilenhoehenAuslesen
	myDoc = thisComponent
	mySheet = myDoc.Sheets(0)
	Rowheight = 0
	for i = 1 to 10
	myheight=mysheet.Rows(Rowheight).height
	msgbox myheight
	Rowheight = Rowheight +1
	next i
End Sub
Hilft das weiter?

Viel Erfolg.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
dherr
*
Beiträge: 17
Registriert: Mi, 23.01.2008 17:02

Re: Calc-Programmierung; arbeiten unter VB2005

Beitrag von dherr »

Nein, leider nicht.

Habe mittlerweile mal OO 2.3. installiert, habe damit aber den gleichen Effekt...
Dietrich
Karolus
********
Beiträge: 7517
Registriert: Mo, 02.01.2006 19:48

Re: Calc-Programmierung; arbeiten unter VB2005

Beitrag von Karolus »

Hallo
Kann es sein das dein Makro im falschen Tabellenblatt werkelt:

Code: Alles auswählen

sub zeilenhoehe
osheet = thisComponent.sheets(0) '???    Index überprüfen
For zz = 1 To 10
            oRow = oSheet.Rows(zz)
            Print(oRow.Height)
        Next
end sub
Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
dherr
*
Beiträge: 17
Registriert: Mi, 23.01.2008 17:02

Re: Calc-Programmierung; arbeiten unter VB2005

Beitrag von dherr »

Das thisComponent.sheets(0) kann ich überhaupt nicht anwenden im VB2005, da kommt Fehlermeldung.
Allerdings kann ich bspw. Tabelle ausfüllen indem ich vorher mache:
oSheet = oDoc.getSheets().getByIndex(0)

Das Ausfüllen wird auch bestens in meinem Programm erledigt, also der Zugriff auf die Tabelle ist OK.
Nur eben die Bestimmung der Zeilenhöhen...

Dietrich
Dietrich
dherr
*
Beiträge: 17
Registriert: Mi, 23.01.2008 17:02

Re: Calc-Programmierung; arbeiten unter VB2005

Beitrag von dherr »

Kann es sein, dass es daran liegt, dass durch
oCell = oSheet.getCellByPosition(1, zz)
die entsprechende Zelle im Sheet nicht markiert wird?
Ich habe mir das mal schrittweise angesehen. zz wird zwar erhöht, aber in der Tabelle wird die aktuelle Zelle nicht markiert.
Vielleicht kann dann die Zeilenhöhe der Zeile, in der sich die akt. Zelle befindet, nicht ermittelt werden...

Dietrich
Dietrich
Karolus
********
Beiträge: 7517
Registriert: Mo, 02.01.2006 19:48

Re: Calc-Programmierung; arbeiten unter VB2005

Beitrag von Karolus »

Hallo
Du musst nicht unbedingt eine Zelle selektieren um sie auszulesen oder zu beschreiben, - falls trotzdem dann mit:

.....
thisComponent.CurrentController.Select(ocell)

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
dherr
*
Beiträge: 17
Registriert: Mi, 23.01.2008 17:02

Re: Calc-Programmierung; arbeiten unter VB2005

Beitrag von dherr »

danke für den tipp!

hatte es gerade selbst ausprobiert- no effect.

im moment weiß ich kein mittel mehr, wie ich das problem lösen könnte....

dietrich
Dietrich
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Calc-Programmierung; arbeiten unter VB2005

Beitrag von turtle47 »

Hi,
dherr hat geschrieben:Das thisComponent.sheets(0) kann ich überhaupt nicht anwenden im VB2005, da kommt Fehlermeldung.
Allerdings kann ich bspw. Tabelle ausfüllen indem ich vorher mache:
oSheet = oDoc.getSheets().getByIndex(0)
Dann sollte aber doch folgendes funktionieren:

Code: Alles auswählen

sub zeilenhoehe
odoc=thiscomponent
oSheet = oDoc.getSheets().getByIndex(0)
sumRH =0
For zz = 0 To 10
            oRow = oSheet.Rows(zz)
            Print(oRow.Height)
            sumRH=SumRH + (orow.Height)
        Next
        msgbox sumRH
end sub
Wenn nicht, könntest Du bitte mal etwas mehr zusammenhängenden Code posten?

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
dherr
*
Beiträge: 17
Registriert: Mi, 23.01.2008 17:02

Re: Calc-Programmierung; arbeiten unter VB2005

Beitrag von dherr »

Code: Alles auswählen

        Dim prozess1() As Process
        Dim prozess2() As Process
        Dim procId As Integer = 0
        Dim oSM As Object    'Hauptobjekt fuer den Zugriff auf OpenOffice von VB.Net aus (SM: ServiceManager)
        Dim oDesk, oDoc, oSheet, oRange, oCell, oNames, oRow As Object 'Objekte von der OpenOffice-Schnittstelle (API)
...
        prozess1 = Process.GetProcesses()   'Alle Prozesse VOR dem Erstellen der Calc-Mappe
        Try
            oSM = CreateObject("com.sun.star.ServiceManager")        'OpenOffice instanziieren: Zwingend notwenig fuer die Kommunikation von VB.Net mit der OpenOffice API
            oDesk = oSM.createInstance("com.sun.star.frame.Desktop") 'Erstelle den ersten & wichtigsten Dienst
        Catch ex As Exception
            MessageBox.Show(ex.Message, "FEHLER OO", MessageBoxButtons.OK, _
                    MessageBoxIcon.Warning)
            Clipboard.SetText(ex.Message)
            Exit Sub
        End Try
        prozess2 = Process.GetProcesses()   'Alle Prozesse NACH dem Erstellen der Calc-Mappe, inklusive der Prozess-ID der Calc-Mappe
...
        'Um Calc im Hintergrund zu halten
        Dim ladeZustand(0)
        ladeZustand(0) = oSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
        'ladeZustand(0).Name = "Hidden"
        ladeZustand(0).Value = True
...
        Dim str As String = pfad + fName + ".ods"
        str = str.Replace("\", "/")
        str = "file:///" + str.Replace(":", "|")     'der Dateiname inkl. Pfad für OOCalc
        oDoc = oDesk.loadComponentFromURL(str, "_blank", 0, ladeZustand)     'öffnen der Datei im Calc
...
        oSheet = oDoc.getSheets().getByIndex(0)     ' 1.Blatt der Mappe
        For zz As Integer = 0 To 22
            oCell = oSheet.getCellByPosition(1, zz)
            oRow = oSheet.Rows(zz)
            Debug.Print(oRow.Height)
        Next
...
Das ist die gesamte Vorgehensweise, um in VB2005 eine bestehende OO-Calc zu öffnen. Habe ich auch aus einem Beispielprogramm so zu sagen kopiert ;-).
Wie gesagt, in den ersten Zeilen (0...22) sind Daten enthalten und fast jede Zeile hat eine andere Höhe.
Nur das wird eben nicht ermittelt...??
Vielleicht ist der Vorspann bis zum Öffnen der Datei auch zu umfangreich/unnötig kompliziert...

Dietrich
Dietrich
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Calc-Programmierung; arbeiten unter VB2005

Beitrag von turtle47 »

Hallo Dietrich,

Code: Alles auswählen

oCell = oSheet.getCellByPosition(1, zz)
Warum nimmst Du zur Ermittlung der Zeilenhöhe

Code: Alles auswählen

getCellByPosition
Das brauchst Du nicht und funktioniert bei mir auch nicht.
Es sollte doch folgendes reichen:

Code: Alles auswählen

For zz = 0 To 10
            oRow = oSheet.Rows(zz)
         .....
Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
dherr
*
Beiträge: 17
Registriert: Mi, 23.01.2008 17:02

Re: Calc-Programmierung; arbeiten unter VB2005

Beitrag von dherr »

Gleicher Effekt: es wird immer nur 453 (in meinem Falle) als immer die gleiche Zeilenhöhe ausgegeben...
Dietrich
Antworten