Druckbereich für aktuelles Sheet festlegen und löschen

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

Moderator: Moderatoren

UweSch
Beiträge: 3
Registriert: Fr, 10.02.2006 09:45

Druckbereich für aktuelles Sheet festlegen und löschen

Beitrag von UweSch »

Hallo Zusammen,

habe jetzt folgendes Script, welches auch soweit funktioniert:
Es werden im aktuellen Tabellenblatt ausgeblendete Zeilen für den Druck eingeblendet, das Blatt gedruckt und danach werden die Zeilen wieder ausgeblendet. Das Makro wird über eine Schaltfläche angesprochen, die auf jemde meiner Tabellenblätter verfügbar ist.

Sub Duckmakro
rem --------------------------------------------------
rem alle Makro ausfuehren
Einblenden
Drucken
Ausblenden

End Sub

Sub Einblenden
rem --------------------------------------
rem Zeilen einblenden
Dim oDocument As Object, oSheet As Object, oZeile as Object
oDocument=ThisComponent
oSheet=oDocument.currentSelection.getSpreadsheet()

For I = 0 To 8

oZeile=osheet.Rows(I)
oZeile.isvisible=true

Next I

End Sub

sub Drucken
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:PrintDefault", "", 0, Array())


end sub

Sub Ausblenden
rem ---------------------------------------
rem Zeilen ausblenden

Dim oDocument As Object, oSheet As Object, oZeile as Object
oDocument=ThisComponent
oSheet=oDocument.currentSelection.getSpreadsheet()

For I = 0 To 8

oZeile=osheet.Rows(I)
oZeile.isvisible=false

Next I

End Sub

Da ich nun nicht das komplette Tabellenblatt ausdrucken möchte, sondern nur einen gewählten Druckbereich stoße ich an meine Grenzen.
Der Druckbereich sollte also jedesmal für das aktuelle Tabellenblatt ausgewählt werden und nach dem Druck wieder gelöscht werden.

Es soll auch _nur_ das ausgewählte Blatt gedruckt werden.
Da fällt mir noch eine Frage ein. Kann ich per Makro festlegen, dass (wie unter Extras-->Optionen-->Openoffice.org Calc-->Drucken-->Nur ausgewählte Tabellen drucken eingeschaltet wird?

Kann mir hier jemand weiterhelfen?

Danke und gruß,
Uwe
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Hallo Uwe,

Das Folgende sollte gehen:

Code: Alles auswählen

Sub Main
oDoc = StarDesktop.CurrentComponent
oSheet = oDoc.CurrentController.getActiveSheet()
sichtbar(True, oSheet) 
Dim oRanges(0) As New com.sun.star.table.CellRangeAddress
Dim oRanges2() As New com.sun.star.table.CellRangeAddress
oRanges(0).Sheet = oSheet.Rangeaddress.sheet
oRanges(0).StartColumn = 0 : oRanges(0).StartRow = 0 
oRanges(0).EndColumn = 9 : oRanges(0).EndRow = 9 
oSheet.setPrintAreas(oRanges())
oDoc.Print(Array())
oSheet.setPrintAreas(oRanges2())
sichtbar(False, oSheet)
End Sub

Sub sichtbar (x As Boolean, y As Object)
For I = 0 To 8 
	oZeile = y.Rows(I) 
	oZeile.isvisible = x 
Next I 
End Sub
An der Stelle:

Code: Alles auswählen

oRanges(0).StartColumn = 0 : oRanges(0).StartRow = 0 
oRanges(0).EndColumn = 9 : oRanges(0).EndRow = 9


müßtest Du Deinen Druckbereich festlegen, mehrere getrennte gingen auch, wenn Du die Array-Definition änderst und die Einzelbereiche einträgst. Also als Beispiel einen zweiten dazu mittels:

Code: Alles auswählen

Dim oRanges(1) As New com.sun.star.table.CellRangeAddress 
...
oRanges(0).Sheet = oSheet.Rangeaddress.sheet
oRanges(0).StartColumn = 0 : oRanges(0).StartRow = 0 
oRanges(0).EndColumn = 9 : oRanges(0).EndRow = 9 
oRanges(1).Sheet = oSheet.Rangeaddress.sheet
oRanges(1).StartColumn = 20 : oRanges(1).StartRow = 0 
oRanges(1).EndColumn = 30 : oRanges(1).EndRow = 9 
...
oSheet.setPrintAreas(oRanges())
oDoc.Print(Array())
Da fällt mir noch eine Frage ein. Kann ich per Makro festlegen, dass (wie unter Extras-->Optionen-->Openoffice.org Calc-->Drucken-->Nur ausgewählte Tabellen drucken eingeschaltet wird?


Das weiß ich jetzt garnicht.
Falls es Dir nur darum geht das nur das aktive Blatt gedruckt wird und möglicherweise auf anderen Blättern vorhandene Druckbereiche erhalten bleiben, könnte man diese vor dem Drucken auslesen, dann löschen und nach dem Drucken wieder herstellen.



Gruß
Stephan
UweSch
Beiträge: 3
Registriert: Fr, 10.02.2006 09:45

Beitrag von UweSch »

Hallo Stephan,

erstmal vielen Dank für Deine Hilfe.
Ich hab im Dokument von Andrew Pitonyak ein Script gefunden, was ich dann auf meine Bedürfnisse zugeschnitten habe.

Code: Alles auswählen

REM Hier wird der Druckbereich festgelegt.
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sub Druckbereich_Ein (sSht$, nStC&, nStR&, nEndC&, nEndR&)
'------------------------------------------------------------------
  Dim selArea(0) as new com.sun.star.table.CellRangeAddress
  Dim oDoc as object
  Dim oSheet as object
  Dim oSheets
  Dim i%
  oDoc = Thiscomponent
  oSheets = ThisComponent.Sheets
      oSheet = ThisComponent.currentSelection.getSpreadsheet()
    oSheet.setPrintareas(array())
  
  selArea(0).StartColumn = 1
  selArea(0).StartRow = 0
  selArea(0).EndColumn = 12
  selArea(0).EndRow = 46
  oSheet=ThisComponent.currentSelection.getSpreadsheet()
  oSheet.setPrintareas(selArea())
  oDoc.Print(Array())
End Sub

REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
REM Hier wird der Druckbereich wieder gelöscht.
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub Druckbereich_aus
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:DeletePrintArea", "", 0, Array())


end sub
Trotzdem werde ich Deinen Code ebenfalls ausprobieren. Man kann ja immernoch dazu lernen. :D


Danke und Gruß,
Uwe
Antworten