Wortzahl automatisch auslesen und eintragen

CALC ist die Tabellenkalkulation, die Sie immer wollten.
Cagliostro18
Beiträge: 4
Registriert: Di 7. Aug 2018, 09:54

Wortzahl automatisch auslesen und eintragen

Beitrag von Cagliostro18 » Di 7. Aug 2018, 10:17

Hallo,

ich bin auf der Suche nach einer Lösung für die folgende Aufgabenstellung: Ich möchte in einer Tabelle eine bestimmte Zelle markieren und durch das Betätigen einer Schaltfläche ("Wortzahl einlesen") automatisch die Anzahl der Wörter in einem bestimmten Dokument auslesen und eintragen. Die nachfolgende Abbildung zeigt schematisch wie das Ganze funktionieren soll.

Bild

Ich wäre für jede Hilfe sehr dankbar. Leider kann ich bisher keinen eigenen Lösungsansatz hierfür liefern.

Mit freundlichen Grüßen

Cagliostro

mikele
Beiträge: 479
Registriert: Sa 23. Jul 2011, 22:09

Re: Wortzahl automatisch auslesen und eintragen

Beitrag von mikele » Di 7. Aug 2018, 12:04

Hallo,
Anzahl der Wörter in einem bestimmten Dokument
Was für eine Art von Dokument ist das? Writer?
Gruß,
mikele

Cagliostro18
Beiträge: 4
Registriert: Di 7. Aug 2018, 09:54

Re: Wortzahl automatisch auslesen und eintragen

Beitrag von Cagliostro18 » Di 7. Aug 2018, 20:08

Hallo!

Ja, es handelt sich um ein Writer-Dokument mit der Endung *.odt

Gruß

Cagliostro

mikele
Beiträge: 479
Registriert: Sa 23. Jul 2011, 22:09

Re: Wortzahl automatisch auslesen und eintragen

Beitrag von mikele » Do 9. Aug 2018, 15:27

Hallo,
dazu müsstest du ein Makro schreiben, das die gewünschte Datei öffnet und aus den Dokumenteneigenschaften die Wortanzahl ausliest.
Gruß,
mikele

F3K Total
Beiträge: 793
Registriert: Mo 1. Aug 2011, 00:03

Re: Wortzahl automatisch auslesen und eintragen

Beitrag von F3K Total » Fr 10. Aug 2018, 18:24

Moin,
ich hatte Lust da mal was zu basteln.
Der folgende Code öffnet ein Dateiauswahlfenster mit dem die Datei gewählt werden kann.
Dann erzeugt der Code in der gewählten Calc-Zelle einen Hyperlink zu eben dieser ausgewählten Datei.
Schlußendlich trägt er die Wortzahl in die Zelle rechts von der gewählten ein.

Code: Alles auswählen

Sub Worte_zaehlen
    oSheet = Thiscomponent.currentController.activeSheet
    oSelection = thisComponent.currentSelection
    if oSelection.supportsService("com.sun.star.sheet.SheetCell") then
        oCell = oSelection
    else
        msgbox ("Bitte eine einzelne Zielzelle auswählen",16,"Fehler")
        exit sub
    endif
    arg = Array(com.sun.star.ui.dialogs.TemplateDescription.FILEOPEN_SIMPLE) 
    odialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
    odialog.Initialize(arg()) 
    odialog.appendFilter("ODT Writer (*.odt)", "*.odt")
    odialog.DefaultName = "Datei wählen"
    ok = odialog.execute()
    if ok = 1 Then   
        datei = odialog.getFiles() 
        sURL = datei(0) 
        Dim FileProperties(2) As New com.sun.star.beans.PropertyValue
        FileProperties(0).Name = "FilterName"
        FileProperties(0).Value ="scalc: Text - txt - csv (StarOffice Calc)"
        FileProperties(1).Name = "USE_CONFIG"
        FileProperties(1).Value ="3"
        FileProperties(2).Name = "Hidden"
        FileProperties(2).Value = True
        odocument = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, FileProperties())
        oCountCell = oSheet.getcellbyposition(oCell.Celladdress.column + 1,oCell.Celladdress.row)
        oCell.String = sURL
        oHyperField = Thiscomponent.createinstance("com.sun.star.text.TextField.URL")
        oHyperField.URL =  Convertfromurl(sUrl)
        oHyperField.Representation = Convertfromurl(sUrl)
        oTextCursor = ocell.CreateTextCursor
        ocell.insertTextContent(oTextCursor,oHyperField,True)
        oCountCell.value = Count_Words (odocument)
        odocument.close - 1
    end if
end sub

function Count_Words (odocument)as integer
    oText = odocument.Text
    oTextCursor = oText.createTextCursor
    oTextCursor.collapseToStart
    nCount = 0
    while oTextCursor.gotoNextWord(false)
        nCount = nCount + 1
    wend
        nCount = nCount + 1
    Count_Words = nCount
End function
Beispiel anbei.
Einfach auf "Dokument analysieren" klicken.
Gruß R
Dateianhänge
Wörter_in_Writerdokumenten_zaehlen.ods
(11.27 KiB) 6-mal heruntergeladen

Cagliostro18
Beiträge: 4
Registriert: Di 7. Aug 2018, 09:54

Re: Wortzahl automatisch auslesen und eintragen

Beitrag von Cagliostro18 » Sa 11. Aug 2018, 16:47

Hallo!

Vielen Dank für die Hilfe. Ich habe das Tool ein wenig getestet und musste feststellen, dass es ab einer gewissen Wortzahl eine Fehlermeldung gibt: "Unzulässiger Wert oder Datentyp. Überlauf." Dabei wird im Quelltext die Zeile: "Count_Words = nCount" markiert angezeigt. Das Dokument hat > 40 Seiten und > 30.000 Wörter.

Ist es möglich, dass nur eine bestimmte Anzahl an Wörter gezählt werden kann? Oder hängt es vielleicht mit Absätzen, Satz-/Sonderzeichen, Zahlen und leeren Zeilen zusammen?

Mit freundlichen Grüßen

Cagliostro

F3K Total
Beiträge: 793
Registriert: Mo 1. Aug 2011, 00:03

Re: Wortzahl automatisch auslesen und eintragen

Beitrag von F3K Total » So 12. Aug 2018, 11:51

Hi,
du hast Recht, das Zählen funktioniert nicht so gut. Selbst wenn ich den Hauptfehler, das eine INTEGER Variable nur maximal 32768 groß sein kann, ausmerze, zählt meine einfache Routine z.B. auch leere Absätze als Worte.
Darum habe ich mich nun eines Tricks bedient.
Die folgende Version öffnet das Writer Dokument im Hintergrund und fügt ganz am Anfang ein Wortzähl-Textfeld ein. Man kann es auch händisch eintragen:
Menü Einfügen/Feldbefehl/Andere... -> Reiter Dokument -> Feldtyp:Statistik -> Auswahl:Wörter
Dann liest die function Count_Words die Wortzahl aus dem Feld aus und das Dokument wird ohne es zu speichern wieder geschlossen.
Der ermittelte Wert wird ins Calc-Dokument übernommen.
Geht viel schneller und ist verlässlich.

Code: Alles auswählen

Sub Worte_zaehlen
    oSheet = Thiscomponent.currentController.activeSheet
    oSelection = thisComponent.currentSelection
    if oSelection.supportsService("com.sun.star.sheet.SheetCell") then
        oCell = oSelection
    else
        msgbox ("Bitte eine einzelne Zielzelle auswählen",16,"Fehler")
        exit sub
    endif
    arg = Array(com.sun.star.ui.dialogs.TemplateDescription.FILEOPEN_SIMPLE) 
    odialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
    odialog.Initialize(arg()) 
    odialog.appendFilter("ODT Writer (*.odt)", "*.odt")
    odialog.DefaultName = "Datei wählen"
    ok = odialog.execute()
    if ok = 1 Then   
        datei = odialog.getFiles() 
        sURL = datei(0) 
        Dim FileProperties(2) As New com.sun.star.beans.PropertyValue
        FileProperties(0).Name = "FilterName"
        FileProperties(0).Value ="scalc: Text - txt - csv (StarOffice Calc)"
        FileProperties(1).Name = "USE_CONFIG"
        FileProperties(1).Value ="3"
        FileProperties(2).Name = "Hidden"
        FileProperties(2).Value = True
        odocument = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, FileProperties())
        oCountCell = oSheet.getcellbyposition(oCell.Celladdress.column + 1,oCell.Celladdress.row)
        oCell.String = sURL
        oHyperField = Thiscomponent.createinstance("com.sun.star.text.TextField.URL")
        oHyperField.URL =  Convertfromurl(sUrl)
        oHyperField.Representation = Convertfromurl(sUrl)
        oTextCursor = ocell.CreateTextCursor
        ocell.insertTextContent(oTextCursor,oHyperField,True)
        oCountCell.value = Count_Words (odocument)
        odocument.close - 1
    end if
end sub

function Count_Words (odocument) as long
    oText = odocument.Text
    oTextCursor = oText.createTextCursor
    oTextCursor.collapseToStart
    owordcountfield = odocument.createInstance("com.sun.star.text.TextField.WordCount")
    otext.insertTextContent(oTextCursor, owordcountfield, false)
    oTextCursor.gotostart(true)
    Count_Words = oTextCursor.string
End function
Beispiel wieder anbei.
Gruß R
Dateianhänge
Wörter_in_Writerdokumenten_zaehlen.ods
(11.29 KiB) 2-mal heruntergeladen

mikele
Beiträge: 479
Registriert: Sa 23. Jul 2011, 22:09

Re: Wortzahl automatisch auslesen und eintragen

Beitrag von mikele » So 12. Aug 2018, 13:08

Hallo,
was haltet ihr davon, die Dokumentenstatistik (in der ja auch dei Wörter gezählt werden) auszulesen?

Code: Alles auswählen

Count_Words=odocument.getDocumentProperties().DocumentStatistics(5).value
Ich bin mir nur nicht sicher, ob die Wörterzahl immer die Eigenschaft Nr. 5 ist - käme auf einen Versuch an.
Gruß,
mikele

F3K Total
Beiträge: 793
Registriert: Mo 1. Aug 2011, 00:03

Re: Wortzahl automatisch auslesen und eintragen

Beitrag von F3K Total » So 12. Aug 2018, 13:45

Hallo Mikele,
mikele hat geschrieben:
So 12. Aug 2018, 13:08
Hallo,
was haltet ihr davon, die Dokumentenstatistik (in der ja auch dei Wörter gezählt werden) auszulesen?
Oje, logisch, das ist der richtige Weg! Danke.
Ich habe die function jetzt mit Prüfung auf "WordCount" geändert:

Code: Alles auswählen

Sub Worte_zaehlen
    oSheet = Thiscomponent.currentController.activeSheet
    oSelection = thisComponent.currentSelection
    if oSelection.supportsService("com.sun.star.sheet.SheetCell") then
        oCell = oSelection
    else
        msgbox ("Bitte eine einzelne Zielzelle auswählen",16,"Fehler")
        exit sub
    endif
    arg = Array(com.sun.star.ui.dialogs.TemplateDescription.FILEOPEN_SIMPLE) 
    odialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
    odialog.Initialize(arg()) 
    odialog.appendFilter("ODT Writer (*.odt)", "*.odt")
    odialog.DefaultName = "Datei wählen"
    ok = odialog.execute()
    if ok = 1 Then   
        datei = odialog.getFiles() 
        sURL = datei(0) 
        Dim FileProperties(2) As New com.sun.star.beans.PropertyValue
        FileProperties(0).Name = "FilterName"
        FileProperties(0).Value ="scalc: Text - txt - csv (StarOffice Calc)"
        FileProperties(1).Name = "USE_CONFIG"
        FileProperties(1).Value ="3"
        FileProperties(2).Name = "Hidden"
        FileProperties(2).Value = True
        odocument = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, FileProperties())
        oCountCell = oSheet.getcellbyposition(oCell.Celladdress.column + 1,oCell.Celladdress.row)
        oCell.String = sURL
        oHyperField = Thiscomponent.createinstance("com.sun.star.text.TextField.URL")
        oHyperField.URL =  Convertfromurl(sUrl)
        oHyperField.Representation = Convertfromurl(sUrl)
        oTextCursor = ocell.CreateTextCursor
        ocell.insertTextContent(oTextCursor,oHyperField,True)
        oCountCell.value = Count_Words (odocument)
        odocument.close - 1
    end if
end sub

function Count_Words (odocument) as long
    oDocumentStatistics = odocument.DocumentProperties.DocumentStatistics
    bfound = false
    for i = 0 to uBound (oDocumentStatistics)
        oNamedValue = oDocumentStatistics(i)
        if oNamedValue.Name = "WordCount" then
            nCount = oNamedValue.Value
            bFound = true
        endif
    next i
    if not bFound then
        msgbox ("In diesem Dokument fehlt die Eigenschaft Wortanzahl",16,"Fehler")
    endif
    Count_Words = nCount
End function
Gruß Rik
Dateianhänge
Wörter_in_Writerdokumenten_zaehlen.ods
(11.35 KiB) 2-mal heruntergeladen

mikele
Beiträge: 479
Registriert: Sa 23. Jul 2011, 22:09

Re: Wortzahl automatisch auslesen und eintragen

Beitrag von mikele » So 12. Aug 2018, 13:50

Hallo Rik,
cool.
Gruß,
mikele

Antworten