Seite 1 von 3
[gelöst ] Fragen zums Dispatcher ?
Verfasst: Do, 20.12.2012 14:48
von boser
Hallo,
ich habe folgendes Problem.
Gegeben eine Calc-Datei mit mehre Tabellen, aus dem nur jeweils ein Ausschnitt in eine PDF Datei exportiert werden soll, und das am besten dadurch , das ich noch mal eine Tabellenblatt anhänge und auf dem in einer Liste , die Tabellenblätter mit dem zu exportierenden Bereich steht.
Jetzt zu meiner Frage, ich würde gerne den Dispatcher verwenden, hab aber noch zu wenig Erfahrung.
1. Wo bekomme ich eine knappe Erklärung über das Teil her ?
2. Welche Parameter müssen wo , wie angegeben werden ? Gibt es dazu eine Liste ?
3. Gibt es irgendwo eine Beispielsammlung ?
Ich wäre für Tipps und Hinweise , sehr dankbar, da selbst Google meine Wissensdurst nicht befriedigt hat.
Re: Fragen zums Dispatcher ?
Verfasst: Fr, 21.12.2012 07:48
von boser
Hallo,
ich hab jetzt mal ein Makro geschrieben.
Es wäre nett, wenn es einige Leute bei sich ausprobieren können und mit ein Feedback geben können.
es ist erst mal nur der Erste Versuch.
Bitte die Hinweise aus dem Tabellenblatt "PDF" beachten.
Ich freue mich schon auf eure Hinweise und Tipps, so wie Anregungen.
Re: Fragen zums Dispatcher ?
Verfasst: Fr, 21.12.2012 14:29
von HHTiger
Hallo boser,
boser hat geschrieben:Bitte die Hinweise aus dem Tabellenblatt "PDF" beachten.
für das Problem slash oder backslash am Ende des Pfads habe ich Dir schnell mal eine kleine Funktion geschrieben, die das Problem löst:
Code: Alles auswählen
Function fncPathCorrected(sPath as String) as String 'Function to ensure slash or backslash at the end of string
Dim iPos as Integer
Dim sLastCharacter as String
sLastCharacter = Right(sPath,1)
iPos = InStr(sPath, "/")
If iPos = 0 Then 'it's a Windows path
If sLastCharacter <> "\" Then 'backslash is missing
sPath = sPath & "\"
End If
Else 'it's a Linux path
If sLastCharacter <> "/" Then 'slash is missing
sPath = sPath & "/"
End If
End If
fncPathCorrected = sPath
End Function
Aufgerufen wird sie z.B. so:
Code: Alles auswählen
sDirectory = fncPathCorrected(objBlatt.getCellRangeByName("N3").String)
Allerdings hast Du noch beim "speichern" im Code das Problem, dass es nur für Linux funzt. Du kannst allerdings meine Funktion ensprechend erweitern, oder eine weitere Funktion nach meinem Beispiel schreiben, die auch das löst.
Sowohl das Speichern, als auch das Zusammensetzen des Dateinamens liegen komplett in der FOR NEXT Schleife. Das macht nicht wirklich Sinn. Ausserdem würde ich Dir empfehlen, alle Befehle innerhalb der Schleife einzurücken, damit Du nicht den Überblick verlierst.
Gruß Klaus
Re: Fragen zums Dispatcher ?
Verfasst: Fr, 21.12.2012 15:35
von juetho
Die Frage slash/backslash bzw. Linux/Windows ist nebensächlich; darauf haben die Entwickler von OO schon geachtet. Zum Öffnen und Schließen von Dateien stehen Funktionen wie convertToUrl und loadComponentFromUrl zur Verfügung, mit denen das gesteuert wird (und die schon benutzt werden). Mehr Beispiele gibt es bei Andrew Pitonyak und Dannenhöfer (siehe die Links in den Hinweisen zur StarBasic-Programmierung).
Zu allem anderen kann ich nichts sagen; so tief bin ich in Calc nicht eingestiegen. Jürgen
Re: Fragen zums Dispatcher ?
Verfasst: Fr, 21.12.2012 16:01
von boser
@Klaus,
danke für deine function, ich hab sie erst mal übernommen und werde sie noch mal testen.
Zu deiner Anmerkung, warum ich das in einer For-Next-Schleife drin habe, ist zu sagen, das die Anforderung so war, das ich pro Tabellblatt ein PDF erzeugen sollte, deshalb auch der verzweifelte Versuch mit dem Zusammensetzten des PDF_Dateinamen aus einen Allg. Teil, den der Benutzer eintragen kann und einen Teil aus dem Tabellenblattname , damit man schon anhand des PDF-Dateiname sehen kann , um welches Tabellblatt es sich handelt.
Zum Speicherproblem kann ich mom. nichts sagen, da ich nur openSUSE 11.4 und 12.2 am Start habe.
@Jürgen,
danke für den Hinweis.
Das was ich da geschrieben haben sind meine ersten Gehversuche im OO-Basic , bzw. LO-Basic. Ich werde mir diese zwei Funktionen noch genauer anschauen.
Über Kritik , wie Verbesserungsvorschläge freue ich mich.
[Edit]
@Klaus,
Könntest du mal als Pfad folgendes eingeben : C\:\\........ , damit einam die Doppelpunkte und der eine Backslash maskiert ist.
[/EDIT]
Re: Fragen zums Dispatcher ?
Verfasst: Fr, 21.12.2012 16:20
von balu
Hallo bose,
ich weiß nicht ob dispatcher so gut ist. Besser ist es wenn Du dich mit richtiger Programmierug befasst, da kannst Du unter umständen einiges an Code-Zeilen einsparen. Und nein, ich kenne momentan keine Lektüre für den dispatcher.
Zu dem Slash. Das ganze geht auch bedeutend kürzer.
Code: Alles auswählen
Sub Slash_Backslash
REM 1 = Windows _ 3 = MacOS _ 4 = Unix
OS = GetGUIType()
if OS = 1 then sStrich = "\" REM Windows
if OS = 4 then sStrich = "/" REM Unix / MacOS
print sStrich
end sub
Gruß
balu
Re: Fragen zums Dispatcher ?
Verfasst: Fr, 21.12.2012 16:29
von boser
Hallo balu,
danke für den Programmschnipsel, werde ich mir anschauen.
Aber, was meinst du mit "richtiger" Programmierung ? Wie kann man sonst Teile eines Tabellenblattes in einem PDF konvertieren und die einzelene Blätter , einzeln Speichern ohne Dispatcher.
Hast du Beispiele oder eine Anleitung dazu ? ( richtigen Programmieren )
Ich hab früher mal mit VB und anderen Basic-Dialekt programmiert.
Re: Fragen zums Dispatcher ?
Verfasst: Fr, 21.12.2012 16:49
von turtle47
Hall Balu,
Das ganze geht auch bedeutend kürzer.
[Besserwissmodus on]
Code: Alles auswählen
Sub Main
print getpathseparator 'Pfadtrenner des aktiven Betriebssystems
End Sub
[Besserwissmodus off]
Gruß
Jürgen
Re: Fragen zums Dispatcher ?
Verfasst: Fr, 21.12.2012 16:53
von boser
An Alle,
eine Dispatcher- Anleitung ist hier zu finden.
http://de.scribd.com/doc/86875934/144/F ... h-commands
danach hab ich mehre Tage gesucht.

Re: Fragen zums Dispatcher ?
Verfasst: Fr, 21.12.2012 17:58
von lorbass
Andrew Pitonyak stellt fertige Teile der Version 3 seines von dir verlinkten Werkes
OpenOffice.org Macros Explained zum Download zur Verfügung. Eine deutsche Übersetzung von Teilen daraus ist bei
Volker Lenhardt erhältlich.
Gruß
lorbass
Re: Fragen zums Dispatcher ?
Verfasst: Fr, 21.12.2012 18:34
von HHTiger
Hi boser,
boser hat geschrieben:deshalb auch der verzweifelte Versuch mit dem Zusammensetzten des PDF_Dateinamen aus einen Allg. Teil, den der Benutzer eintragen kann und einen Teil aus dem
das ist ja auch ok, aber den allgemeinen Teil des Benutzers brauchst Du nur einmal vor der Schleife holen!
boser hat geschrieben:Zum Speicherproblem kann ich mom. nichts sagen, da ich nur openSUSE 11.4 und 12.2 am Start habe.
Könntest du mal als Pfad folgendes eingeben : C\:\\........ , damit einam die Doppelpunkte und der eine Backslash maskiert ist.
Ob maskiert oder unmaskiert .... es kommt die selbe Fehlermeldung. Leider kenne ich mich zu wenig mit openSUSE und OO aus, um Dir mit dem Problem weiterhelfen zu können. Vielleicht kann hierzu ja noch einmal einer der richtigen Spezies etwas sagen.
Gruss Klaus
Re: Fragen zums Dispatcher ?
Verfasst: Fr, 21.12.2012 19:00
von HHTiger
@balu:
balu hat geschrieben:
Zu dem Slash. Das ganze geht auch bedeutend kürzer.
Code: Alles auswählen
Sub Slash_Backslash
REM 1 = Windows _ 3 = MacOS _ 4 = Unix
OS = GetGUIType()
if OS = 1 then sStrich = "\" REM Windows
if OS = 4 then sStrich = "/" REM Unix / MacOS
print sStrich
end sub
Eleganter ist das auf jeden Fall, aber selbst dabei brauchst Du noch ein paar Zeilen Code mehr, um den vom Benutzer vorgegebenen Pfad zu korrigieren!
Es ging ja nicht darum, auf welchem System das Makro läuft, sondern darum den vom Benutzer eingegebenen Pfad zu korrigieren. Aber wenn man beide Codes zusammenbringt, dann kann man natürlich auch noch einen Fehler abfangen, falls ein Windows-Pfad auf einem Linux-System (oder umgekehrt) verwendet wird.
Gruss Klaus
Re: Fragen zums Dispatcher ?
Verfasst: Fr, 21.12.2012 19:16
von turtle47
Hallo,
Ob maskiert oder unmaskiert .... es kommt die selbe Fehlermeldung.
kontrolliere doch mal die Pfadangabe mit einer Printanweisung:

- Path.jpg (15.42 KiB) 7227 mal betrachtet
Gruß
Jürgen
Re: Fragen zums Dispatcher ?
Verfasst: Fr, 21.12.2012 19:33
von HHTiger
@Jürgen:
turtle47 hat geschrieben:kontrolliere doch mal die Pfadangabe mit einer Printanweisung:
wen sprichst Du damit gerade an? Falls Du mich meinst, dann würde ich fragen, wie dieser Paramater denn für den Dispatcher unter Windows aussehen müßte (wie er jetzt aussieht weiß ich).
Gruß Klaus
Re: Fragen zums Dispatcher ?
Verfasst: Fr, 21.12.2012 20:08
von F3K Total
Hallo Boser,
da ich die Dispatcher Befehle nicht leiden kann, habe ich dein Makro mal umgeschrieben.
Dieses arbeitet ohne Export mit dem Setzen von Druckbereichen. Funktioniert unter Windows und Linux.
Code: Alles auswählen
REM ***** BASIC *****
option explicit
REM XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
REM XX Macro : Zum erzeugen von PDF-Dateien XX
REM XX erstellt am : 21.12.2012 XX
REM XX Autoren : boser, F3K Total XX
REM XX XX
REM XX Hinweise auf dem Tabellblatt "PDF" beachten XX
REM XX XX
REM XX Version : 0.1? ( Testversion ) XX
REM XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Sub PDF_Dateien_erzeugen
Dim objDatei as Object
Dim objBlaetter as Object
Dim objBlatt as Object
Dim objZelle as Object
dim objCursor as Object
Dim objExportBlatt as Object
Dim sRangename as String
dim oRange as Object
dim oRanges(0) as Object
Dim sDirectory as String
Dim sZellwertN4 as String
Dim i as Integer
Dim j as integer rem Tabellblattnummer
Dim intZeilen as Integer
Dim strTab as String
Dim von as String
Dim bis as String
Dim sURL as String
Dim myProps(0) as New com.sun.star.beans.PropertyValue
objDatei = ThisComponent
objBlaetter = objDatei.Sheets
objBlatt = objBlaetter.getByName("PDF")
objZelle = objBlatt.getCellRangebyName("A1")
objCursor = objBlatt.createCursorByRange(objZelle)
objCursor.collapseToCurrentRegion()
intZeilen = objCursor.Rows.Count
For i = 2 to intZeilen-1
objZelle = objBlatt.getCellByPosition(0, i)
strTab = objZelle.String
objZelle = objBlatt.getCellByPosition(1, i)
von = objZelle.String
objZelle = objBlatt.getCellByPosition(3, i)
von = von & objZelle.VALUE
objZelle = objBlatt.getCellByPosition(2, i)
bis = objZelle.String
objZelle = objBlatt.getCellByPosition(4, i)
bis = bis & objZelle.VALUE
sRangename = von & ":" & bis
objExportBlatt = objBlaetter.getbyname(strTab)
oRange = objExportBlatt.getCellRangeByName(sRangename)
'Druckbereich setzen
oRanges(0) = oRange.RangeAddress
objExportBlatt.setprintAreas(oRanges())
sDirectory = objBlatt.getCellRangeByName("N3").String
sZellwertN4 = objBlatt.getCellRangeByName("N4").String
sURL = converttourl(sDirectory & sZellwertN4 & "_" & strTab & ".pdf")'passt den Pfad dem Betriebssystem an
'PDF exportieren
myProps(0).Name="FilterName"
myProps(0).Value = "calc_pdf_Export"
objDatei.storetoUrl(sURL,myProps())
objExportBlatt.setprintAreas(array())'Druckbereich löschen
next i
msgbox "Ende"
End Sub
Viel Spaß
Gruß R