Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 'Basic Script für Zwischensummen in OpenOffice/LibreOffice Tabellen
- Option Explicit
- ' Konstanten
- Const LABEL_FUER_ZWSUMME = "Zwischensumme: "
- Const LABEL_FUER_UEBERTRAG = "Übertrag von vorheriger Seite:"
- Const SUMMEN_SPALTE = "F" ' Feste Summenspalte F (6. Spalte)
- Const SUMMEN_SPALTE_INDEX = 5 ' Index für Spalte F (0-basiert, also 5)
- Const MAX_ZEILEN_PRO_SEITE = 20 ' Maximale Anzahl Zeilen pro Seite
- Const RESERVE_ZEILEN = 2 ' Anzahl Zeilen vor Seitenende für den Umbruch (-2)
- Sub Main
- On Error GoTo ErrorHandler
- Dim oDoc As Object
- Dim oTables As Object
- Dim oItemTabelle As Object
- Dim oMeinViewCursor As Object
- oDoc = ThisComponent
- If IsNull(oDoc) Then
- MsgBox "Kein aktives Dokument gefunden.", 16
- Exit Sub
- End If
- oTables = oDoc.getTextTables()
- If Not oTables.hasByName("Table_Items") Then
- MsgBox "Die Tabelle 'Table_Items' wurde nicht gefunden.", 16
- Exit Sub
- End If
- oItemTabelle = oTables.getByName("Table_Items")
- oMeinViewCursor = oDoc.getCurrentController().getViewCursor()
- If IstDokumentMehrseitig(oDoc) Then
- If IstTabelleMehrseitig(oItemTabelle, oMeinViewCursor) Then
- BearbeiteTabelle oDoc, oItemTabelle, oMeinViewCursor
- End If
- End If
- Exit Sub
- ErrorHandler:
- MsgBox "Ein Fehler ist aufgetreten: " & Err.Description, 16
- Exit Sub
- End Sub
- Sub BearbeiteTabelle(oDoc As Object, oItemTabelle As Object, oMeinViewCursor As Object)
- Dim letzteSpalte As Long
- Dim letzteSpalteAlsIndex As Long
- Dim letzteSpalteAlsBuchst As String
- Dim oTabellenZeilen As Object
- Dim letzteZeile As Long
- letzteSpalte = oItemTabelle.getColumns().getCount()
- letzteSpalteAlsIndex = letzteSpalte - 1
- letzteSpalteAlsBuchst = Chr(letzteSpalteAlsIndex + 65)
- oTabellenZeilen = oItemTabelle.getRows()
- letzteZeile = oTabellenZeilen.getCount()
- Dim kopfzeilen As Long
- Dim ersteDatenZeile As Long
- kopfzeilen = oItemTabelle.HeaderRowCount
- ersteDatenZeile = kopfzeilen + 1
- ' Locale mit Language und Country initialisieren
- Dim aLocale As New com.sun.star.lang.Locale
- aLocale.Language = "de"
- aLocale.Country = "DE"
- Dim oAlleZahlenFormate As Object
- Dim formatCode As String
- Dim formatNummer As Long
- oAlleZahlenFormate = oDoc.getNumberFormats()
- formatCode = "#.##0,00" ' Deutsches Zahlenformat
- formatNummer = oAlleZahlenFormate.queryKey(formatCode, aLocale, True)
- If formatNummer = -1 Then
- formatNummer = oAlleZahlenFormate.addNew(formatCode, aLocale)
- End If
- ' Berechne dynamische Umbruchzeile mit Reserve
- Dim dynamischeUmbruchzeile As Long
- dynamischeUmbruchzeile = BerechneDynamischeUmbruchzeile(oItemTabelle, ersteDatenZeile)
- ' Füge Summenzeile ein und schneide Tabelle ab
- SummenzeileEinfuegen oDoc, oItemTabelle, oMeinViewCursor, dynamischeUmbruchzeile, _
- ersteDatenZeile, SUMMEN_SPALTE, SUMMEN_SPALTE_INDEX, formatNummer
- ' Erstelle neue Tabelle mit Übertragszeile und Restdaten
- ErstelleFortsetzungstabelle oDoc, oItemTabelle, dynamischeUmbruchzeile, _
- formatNummer, SUMMEN_SPALTE, SUMMEN_SPALTE_INDEX
- End Sub
- Function IstDokumentMehrseitig(oDoc As Object) As Boolean
- IstDokumentMehrseitig = oDoc.getCurrentController().PageCount > 1
- End Function
- Function IstTabelleMehrseitig(oItemTabelle As Object, oMeinViewCursor As Object) As Boolean
- On Error GoTo ErrorHandler
- Dim oErsteZelle As Object
- Dim anfangsSeite As Long
- Dim endeSeite As Long
- Dim oOriginalRange As Object
- ' Speichere aktuelle Cursor-Position
- oOriginalRange = oMeinViewCursor.getStart()
- ' Prüfe ob die Tabelle überhaupt Zellen hat
- If oItemTabelle.Rows.Count < 1 Then
- IstTabelleMehrseitig = False
- Exit Function
- End If
- oErsteZelle = oItemTabelle.getCellByName("A1")
- If IsNull(oErsteZelle) Then
- IstTabelleMehrseitig = False
- Exit Function
- End If
- ' Gehe zur ersten Zelle
- oMeinViewCursor.gotoRange(oErsteZelle.getAnchor(), False)
- anfangsSeite = oMeinViewCursor.getPage()
- ' Gehe zur letzten Zelle der Tabelle
- oErsteZelle = oItemTabelle.getCellByPosition(0, oItemTabelle.Rows.Count - 1)
- oMeinViewCursor.gotoRange(oErsteZelle.getAnchor(), False)
- endeSeite = oMeinViewCursor.getPage()
- ' Stelle ursprüngliche Position wieder her
- oMeinViewCursor.gotoRange(oOriginalRange, False)
- IstTabelleMehrseitig = (endeSeite > anfangsSeite)
- Exit Function
- ErrorHandler:
- On Error Resume Next
- ' Versuche zur Original-Position zurückzukehren
- If Not IsNull(oOriginalRange) Then
- oMeinViewCursor.gotoRange(oOriginalRange, False)
- End If
- IstTabelleMehrseitig = False
- End Function
- Function BerechneDynamischeUmbruchzeile(oItemTabelle As Object, ersteDatenZeile As Long) As Long
- Dim oRows As Object
- Dim zeilenAnzahl As Long
- Dim kopfzeilen As Long
- Dim umbruchZeile As Long
- oRows = oItemTabelle.getRows()
- zeilenAnzahl = oRows.getCount()
- kopfzeilen = oItemTabelle.HeaderRowCount
- ' Berechne die Umbruchzeile:
- ' Bei kleinen Tabellen: die Hälfte der Tabelle
- ' Bei großen Tabellen: MaxZeilenProSeite - ReserveZeilen
- If zeilenAnzahl <= MAX_ZEILEN_PRO_SEITE Then
- umbruchZeile = zeilenAnzahl \ 2
- Else
- umbruchZeile = MAX_ZEILEN_PRO_SEITE - RESERVE_ZEILEN
- End If
- ' Stelle sicher, dass die Umbruchzeile nach den Kopfzeilen liegt
- If umbruchZeile <= kopfzeilen Then
- umbruchZeile = kopfzeilen + 1
- End If
- BerechneDynamischeUmbruchzeile = umbruchZeile
- End Function
- Sub SummenzeileEinfuegen(oDoc As Object, oItemTabelle As Object, oMeinViewCursor As Object, _
- umbruchZeile As Long, ersteDatenZeile As Long, _
- summenSpalte As String, summenSpalteIndex As Long, formatNummer As Long)
- On Error GoTo ErrorHandler
- Dim oTabellenZeilen As Object
- Dim oTextCursor As Object
- Dim summenFormel As String
- Dim oCell As Object
- Dim oText As Object
- Dim oCursor As Object
- Dim oTextContent As Object
- Dim oRange As Object
- oTabellenZeilen = oItemTabelle.getRows()
- ' Füge Zeile an der dynamischen Position ein
- oTabellenZeilen.insertByIndex(umbruchZeile, 1)
- ' Setze die Übertragsbeschriftung
- oItemTabelle.getCellByPosition(1, umbruchZeile).setString(LABEL_FUER_ZWSUMME)
- ' Formatierung für die Zwischensumme
- oTextCursor = oItemTabelle.createCursorByCellName("B" & (umbruchZeile + 1))
- oTextCursor.CharWeight = com.sun.star.awt.FontWeight.BOLD
- oTextCursor.CharPosture = com.sun.star.awt.FontSlant.ITALIC
- oTextCursor.ParaAdjust = com.sun.star.style.ParagraphAdjust.RIGHT
- ' Erstelle die Summenformel (korrigierte Syntax)
- summenFormel = "=SUM(" & summenSpalte & ersteDatenZeile & ":" & summenSpalte & umbruchZeile & ")"
- ' Setze die Summenformel in die Zelle
- oCell = oItemTabelle.getCellByPosition(summenSpalteIndex, umbruchZeile)
- oCell.setFormula(summenFormel)
- oCell.NumberFormat = formatNummer
- ' Entferne alle restlichen Zeilen nach der Summenzeile
- EntferneRestzeilen oItemTabelle, umbruchZeile
- ' Erzwinge einen Seitenumbruch nach dieser Tabelle
- oText = oDoc.getText()
- oCursor = oText.createTextCursor()
- ' Gehe zur Position direkt nach der Tabelle
- oTextContent = oItemTabelle
- oRange = oTextContent.getAnchor()
- oCursor.gotoRange(oRange.getEnd(), False)
- ' Füge einen Absatz und einen harten Seitenumbruch ein
- oText.insertControlCharacter(oCursor, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK)
- oText.insertControlCharacter(oCursor, com.sun.star.text.ControlCharacter.HARD_PAGE_BREAK)
- Exit Sub
- ErrorHandler:
- MsgBox "Fehler beim Einfügen der Summenzeile: " & Err.Description, 16
- Exit Sub
- End Sub
- Sub EntferneRestzeilen(oItemTabelle As Object, umbruchZeile As Long)
- Dim oRows As Object
- Dim zeilenAnzahl As Long
- Dim i As Long
- oRows = oItemTabelle.getRows()
- zeilenAnzahl = oRows.getCount()
- ' Die Zeilen von unten nach oben löschen, damit die Indizes stimmen
- For i = zeilenAnzahl - 1 To umbruchZeile + 1 Step -1
- oRows.removeByIndex(i, 1)
- Next i
- End Sub
- Sub ErstelleFortsetzungstabelle(oDoc As Object, oItemTabelle As Object, umbruchZeile As Long, _
- formatNummer As Long, summenSpalte As String, summenSpalteIndex As Long)
- Dim oText As Object
- Dim oCursor As Object
- Dim neueTabName As String
- Dim oTables As Object
- Dim spaltenAnzahl As Long
- Dim oNeueTabelle As Object
- oText = oDoc.getText()
- oCursor = oText.createTextCursor()
- ' Gehe ans Ende des Dokuments
- oCursor.gotoEnd(False)
- ' Erzeuge Zeilenumbruch vor der neuen Tabelle
- oText.insertControlCharacter(oCursor, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK)
- ' Erstelle eindeutigen Namen für die neue Tabelle
- neueTabName = "Table_Items_Continued"
- oTables = oDoc.getTextTables()
- ' Lösche alte Fortsetzungstabelle, falls vorhanden
- If oTables.hasByName(neueTabName) Then
- oText.removeTextContent(oTables.getByName(neueTabName))
- End If
- ' Ermittle die Anzahl der Spalten in der Originaltabelle
- spaltenAnzahl = oItemTabelle.getColumns().getCount()
- ' Erstelle neue Tabelle mit Kopfzeile und Übertragszeile
- oNeueTabelle = oDoc.createInstance("com.sun.star.text.TextTable")
- oNeueTabelle.initialize(2, spaltenAnzahl)
- ' Füge die Tabelle ins Dokument ein
- oText.insertTextContent(oCursor, oNeueTabelle, False)
- ' Benenne die Tabelle
- oNeueTabelle.setName(neueTabName)
- ' Kopiere Kopfzeile
- If oItemTabelle.HeaderRowCount > 0 Then
- KopiereKopfzeile oItemTabelle, oNeueTabelle, spaltenAnzahl
- End If
- ' Füge Übertragszeile hinzu
- FuegeUebertragszeileHinzu oNeueTabelle, umbruchZeile, formatNummer, summenSpalte, summenSpalteIndex
- ' Übernehme Spaltenbreiten
- UebernehmeSpaltentbreiten oItemTabelle, oNeueTabelle
- End Sub
- Sub KopiereKopfzeile(oItemTabelle As Object, oNeueTabelle As Object, spaltenAnzahl As Long)
- Dim i As Long
- Dim headerText As String
- For i = 0 To spaltenAnzahl - 1
- headerText = oItemTabelle.getCellByPosition(i, 0).getString()
- oNeueTabelle.getCellByPosition(i, 0).setString(headerText)
- Next i
- oNeueTabelle.HeaderRowCount = 1
- oNeueTabelle.RepeatHeadline = True
- End Sub
- Sub FuegeUebertragszeileHinzu(oNeueTabelle As Object, umbruchZeile As Long, _
- formatNummer As Long, summenSpalte As String, summenSpalteIndex As Long)
- Dim oTextCursor As Object
- Dim oZelle As Object
- oNeueTabelle.getCellByPosition(1, 1).setString(LABEL_FUER_UEBERTRAG)
- ' Formatierung für die Übertragsbeschriftung
- oTextCursor = oNeueTabelle.createCursorByCellName("B2")
- oTextCursor.CharWeight = com.sun.star.awt.FontWeight.BOLD
- oTextCursor.CharPosture = com.sun.star.awt.FontSlant.ITALIC
- ' Formel für den Übertragswert
- oZelle = oNeueTabelle.getCellByPosition(summenSpalteIndex, 1)
- oZelle.setFormula("=" & summenSpalte & (umbruchZeile + 1))
- oZelle.NumberFormat = formatNummer
- End Sub
- Sub UebernehmeSpaltentbreiten(oOriginalTabelle As Object, oNeueTabelle As Object)
- On Error Resume Next
- Dim spaltenAnzahl As Long
- Dim i As Long
- Dim breite As Long
- spaltenAnzahl = oOriginalTabelle.getColumns().getCount()
- oNeueTabelle.Width = oOriginalTabelle.Width
- For i = 0 To spaltenAnzahl - 1
- breite = oOriginalTabelle.getColumns().getByIndex(i).Width
- If breite > 0 Then
- oNeueTabelle.getColumns().getByIndex(i).Width = breite
- End If
- Next i
- End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement