Seite 1 von 2

Calc-Programmierung; arbeiten unter VB2005

Verfasst: Mi, 23.01.2008 17:26
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

Re: Calc-Programmierung; arbeiten unter VB2005

Verfasst: Do, 24.01.2008 17:54
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

Re: Calc-Programmierung; arbeiten unter VB2005

Verfasst: Fr, 25.01.2008 19:10
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

Re: Calc-Programmierung; arbeiten unter VB2005

Verfasst: Fr, 25.01.2008 19:21
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

Re: Calc-Programmierung; arbeiten unter VB2005

Verfasst: Fr, 25.01.2008 21:11
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

Re: Calc-Programmierung; arbeiten unter VB2005

Verfasst: Fr, 25.01.2008 23:54
von dherr
Nein, leider nicht.

Habe mittlerweile mal OO 2.3. installiert, habe damit aber den gleichen Effekt...

Re: Calc-Programmierung; arbeiten unter VB2005

Verfasst: Sa, 26.01.2008 00:20
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

Re: Calc-Programmierung; arbeiten unter VB2005

Verfasst: Sa, 26.01.2008 09:46
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

Re: Calc-Programmierung; arbeiten unter VB2005

Verfasst: Sa, 26.01.2008 11:34
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

Re: Calc-Programmierung; arbeiten unter VB2005

Verfasst: Sa, 26.01.2008 12:39
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

Re: Calc-Programmierung; arbeiten unter VB2005

Verfasst: Sa, 26.01.2008 15:00
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

Re: Calc-Programmierung; arbeiten unter VB2005

Verfasst: Sa, 26.01.2008 16:29
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

Re: Calc-Programmierung; arbeiten unter VB2005

Verfasst: Sa, 26.01.2008 17:53
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

Re: Calc-Programmierung; arbeiten unter VB2005

Verfasst: Sa, 26.01.2008 18:15
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

Re: Calc-Programmierung; arbeiten unter VB2005

Verfasst: Sa, 26.01.2008 18:24
von dherr
Gleicher Effekt: es wird immer nur 453 (in meinem Falle) als immer die gleiche Zeilenhöhe ausgegeben...