Fußnoten und dazugehörigen Absatzinhalt per Makro auslesen

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

Moderator: Moderatoren

Benutzeravatar
Faol
****
Beiträge: 118
Registriert: Di, 26.01.2016 21:18

Fußnoten und dazugehörigen Absatzinhalt per Makro auslesen

Beitrag von Faol » Mi, 19.12.2018 16:57

Hallo,

im Beispieldokument habe ich ein Makro hinterlegt, welches mir alle
im Writer-Dokument vorhandenen Fußnoten mit Index in eine neu angelegte
Calc-Tabelle schreibt.

Trotz Suche im Netz, den verschiedenen Büchern und mittels MRI
ist es mir jedoch nicht gelungen, den Text des Absatzes der
jeweiligen Fußnote zu erfassen und diesen in Spalte C der Tabelle aufzulisten.

Im Prinzip so:
Enumeration über alle Absätze, wenn Fußnote vorhanden, dann
Inhalt des Absatzes in das Array (mArr(i)(2)) schreiben.

Als Platzhalter für Spalte C habe ich im Code dieses geschrieben:
mArr(i)(2) = "Hier fehlt der Text des Absatzes"
Fussnoten Liste.odt
Fußnoten und Absatzinhalt per Makro auslesen
(25.7 KiB) 65-mal heruntergeladen

Gibt es hierzu irgendeine Möglichkeit?
Gruß
Faol
⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒
Win.10 Prof. (x64) • AOO 4.1.6 • LibO 6.2.3.2 (x64)
⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐

Stephan
********
Beiträge: 11036
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Fußnoten und dazugehörigen Absatzinhalt per Makro auslesen

Beitrag von Stephan » Mi, 19.12.2018 17:25

Da Du den Anker der jeweiligen Fußnoten (genauer gesagt wohl den Anker (Anchor) des Fußnotenankers (ein Feld)) bereits kennst ist das einfach:

-erzeuge einen Textcursor
-Springe mit dem Textcursor zum jeweiligen Anker (ohne zu markieren)
-springe nun zum Anfang des aktuellen Absatzes ohne zu markieren
-springe zum Ende des aktuellen Absatzes (mit Markieren)

Der String des Textcursors ist nun jeweils der gesuchte Absatztext

Code: Alles auswählen

REM  *****  BASIC  *****
REM Auflistung aller im Dokument vorhandenen Fußnoten
REM 
Dim oDocC as Object
Dim oDocW as Object
Dim oSheet as Object
Dim oRange as Object

Sub GetFootnote
Dim mArr() as Variant
Dim oCol as Object
Dim i as Long

  oDocW = ThisComponent
  oFN=oDocW.Footnotes
  oFNSettings = oDocW.getFootnoteSettings()
  
  cur = ThisComponent.Text.CreateTextCursor

	' Öffnen eines Calc-Dokuments
	oDocC = StarDesktop.loadComponentFromURL("private:factory/scalc","_blank", 0, Array())
		' Referenzierung der "Tabelle 1"
		oSheet = oDocC.Sheets(0)
			' Zellbereich A2:B2001 zur Dinmensionierung des Array's in das Array schreiben
			mArr()=osheet.getcellrangebyposition(0,1,2,2001).getDataArray
			
	For i = 0 To oFN.Count-1
			' Spalte A
			mArr(i)(0) = oFN(i).Anchor.String
			Msgbox oFN(i).Anchor.String & CHR(13) &  oFN(i).String
			' Spalte B
			mArr(i)(1) = oFN(i).String
			' Spalte C
			cur.gotoRange(oFN(i).Anchor, False)
			cur.gotoStartofParagraph(False)
			cur.gotoEndofParagraph(True)
			mArr(i)(2) = cur.String '"Hier fehlt der Text des Absatzes"
	Next i

	' Referenz Range-Objekt (Zellbereich)
    oRange = osheet.getcellrangebyposition(0,1,2,2001)
	' Array in Zellbereich schreiben
    oRange.setDataArray(mArr)

	' Spaltenüberschrift einfügen und formatieren
    osheet.getCellRangeByName("A1").String="Index"
    osheet.getCellRangeByName("B1").String="Fußnoten"
    osheet.getCellRangeByName("C1").String="Absatzinhalt"
    osheet.getCellRangeByName("A1").CharWeight = com.sun.star.awt.FontWeight.BOLD
    osheet.getCellRangeByName("B1").CharWeight = com.sun.star.awt.FontWeight.BOLD
    osheet.getCellRangeByName("C1").CharWeight = com.sun.star.awt.FontWeight.BOLD
    osheet.getCellRangeByName("A1").charcolor = &HFF0000
    osheet.getCellRangeByName("B1").charcolor = &HFF0000 
    osheet.getCellRangeByName("C1").charcolor = &HFF0000 

	' Spaltenbreite anpassen
	oCol = oSheet.getColumns()
	oCol.optimalWidth = true

End Sub

Gruß
Stephan

F3K Total
********
Beiträge: 3356
Registriert: Mo, 28.02.2011 17:49

Re: Fußnoten und dazugehörigen Absatzinhalt per Makro auslesen

Beitrag von F3K Total » Mi, 19.12.2018 17:34

Moin,
Stephan war etwas schneller und hat eine etwas andere Lösung, meine sieht so aus:

Code: Alles auswählen

REM  *****  BASIC  *****
REM Auflistung aller im Dokument vorhandenen Fußnoten
Dim oDocC as Object
Dim oDocW as Object
Dim oSheet as Object
Dim oRange as Object

Sub GetFootnote
    Dim mArr() as Variant
    Dim oCol as Object
    Dim i as Long
    oDocW = ThisComponent
    oFN=oDocW.Footnotes
    oFNSettings = oDocW.getFootnoteSettings()
    'Öffnen eines Calc-Dokuments
    oDocC = StarDesktop.loadComponentFromURL("private:factory/scalc","_blank", 0, Array())
    'Referenzierung der "Tabelle 1"
    oSheet = oDocC.Sheets(0)
    'Zellbereich A2:B2001 zur Dinmensionierung des Array's in das Array schreiben
    mArr()=osheet.getcellrangebyposition(0,1,2,oFN.Count).getDataArray
    For i = 0 To oFN.Count-1
        'Spalte A
        mArr(i)(0) = oFN(i).Anchor.String
        'Spalte B
        mArr(i)(1) = oFN(i).String
        'Spalte C
        mArr(i)(2) = oFN(i).Anchor.CreateEnumeration.nextelement.String
    Next i
    'Referenz Range-Objekt (Zellbereich)
    oRange = osheet.getcellrangebyposition(0,1,2,oFN.Count)
    'Array in Zellbereich schreiben
    oRange.setDataArray(mArr)
    'Spaltenüberschrift einfügen und formatieren
    osheet.getCellRangeByName("A1").String="Index"
    osheet.getCellRangeByName("B1").String="Fußnoten"
    osheet.getCellRangeByName("C1").String="Absatzinhalt"
    osheet.getCellRangeByName("A1").CharWeight = com.sun.star.awt.FontWeight.BOLD
    osheet.getCellRangeByName("B1").CharWeight = com.sun.star.awt.FontWeight.BOLD
    osheet.getCellRangeByName("C1").CharWeight = com.sun.star.awt.FontWeight.BOLD
    osheet.getCellRangeByName("A1").charcolor = &HFF0000
    osheet.getCellRangeByName("B1").charcolor = &HFF0000 
    osheet.getCellRangeByName("C1").charcolor = &HFF0000 
    'Spaltenbreite anpassen
    oCol = oSheet.getColumns()
    oCol.optimalWidth = true
    oColC = oCol.getbyname("C")
    oColC.IsTextWrapped= True
End Sub

Gruß R

Stephan
********
Beiträge: 11036
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Fußnoten und dazugehörigen Absatzinhalt per Makro auslesen

Beitrag von Stephan » Mi, 19.12.2018 17:49

Stephan war etwas schneller und hat eine etwas andere Lösung,
Deine Lösung ist nicht nur einfacher, sondern auch interessanter.
Ich hatte nur nicht vermutet das es so gehen könnte und habe das deshalb garnicht probiert.


Gruß
Stephan

Benutzeravatar
Faol
****
Beiträge: 118
Registriert: Di, 26.01.2016 21:18

Re: Fußnoten und dazugehörigen Absatzinhalt per Makro auslesen

Beitrag von Faol » Mi, 19.12.2018 17:55

Hallo Stephan,
Hallo R,

vielen Dank an Euch.

Beide Codes funktionieren im Beispieldokument perfekt.

Wenn ich die Codes auf das Originaldokument mit 295 Fußnoten anwende,
dann erhalte ich beim Zählerstand i = 274 einen Runtimefehler.
Ursache z.Z. noch unbekannt.

Werde mir mal die 274 heraus fischen und nachsehen, warum dort ein Fehler produziert wird.

Sollte ich noch HIlfe benötigen, dann melde ich mich nochmal.

Vielen Dank.
Gruß
Faol
⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒
Win.10 Prof. (x64) • AOO 4.1.6 • LibO 6.2.3.2 (x64)
⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐

Benutzeravatar
Faol
****
Beiträge: 118
Registriert: Di, 26.01.2016 21:18

Re: Fußnoten und dazugehörigen Absatzinhalt per Makro auslesen

Beitrag von Faol » Mi, 19.12.2018 19:02

Hallo,

der/die Runtimefehler werden deshalb erzeugt, weil die Fußnoten 275-286 innerhalb einer Tabelle abgelegt sind.

Habe ein "Error Resume Next" in die Schleife eingefügt, um den Fehler zunächst auszuschalten.
Dabei werden die folgenden Arrayfelder für Spalte C mit den Texten aus Fußnote 274 beschrieben.
Das ist nicht korrekt.

Versuche nun eine IF-Anweisung zu schreiben, ob es sich um einen Fließtext oder um eine Tabelle handelt.
Dann muss ich noch die unterschiedlichen Methoden und Eigenschaften anpassen.
Gruß
Faol
⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒
Win.10 Prof. (x64) • AOO 4.1.6 • LibO 6.2.3.2 (x64)
⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐⇐

Antworten