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
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,
Warum nimmst Du zur Ermittlung der Zeilenhöhe
Das brauchst Du nicht und funktioniert bei mir auch nicht.
Es sollte doch folgendes reichen:
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...