Seite 1 von 2
Wortzahl automatisch auslesen und eintragen
Verfasst: Di 7. Aug 2018, 10:17
von Cagliostro18
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.
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
Re: Wortzahl automatisch auslesen und eintragen
Verfasst: Di 7. Aug 2018, 12:04
von mikele
Hallo,
Anzahl der Wörter in einem bestimmten Dokument
Was für eine Art von Dokument ist das? Writer?
Re: Wortzahl automatisch auslesen und eintragen
Verfasst: Di 7. Aug 2018, 20:08
von Cagliostro18
Hallo!
Ja, es handelt sich um ein Writer-Dokument mit der Endung *.odt
Gruß
Cagliostro
Re: Wortzahl automatisch auslesen und eintragen
Verfasst: Do 9. Aug 2018, 15:27
von mikele
Hallo,
dazu müsstest du ein Makro schreiben, das die gewünschte Datei öffnet und aus den Dokumenteneigenschaften die Wortanzahl ausliest.
Re: Wortzahl automatisch auslesen und eintragen
Verfasst: Fr 10. Aug 2018, 18:24
von F3K Total
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
Re: Wortzahl automatisch auslesen und eintragen
Verfasst: Sa 11. Aug 2018, 16:47
von Cagliostro18
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
Re: Wortzahl automatisch auslesen und eintragen
Verfasst: So 12. Aug 2018, 11:51
von F3K Total
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
Re: Wortzahl automatisch auslesen und eintragen
Verfasst: So 12. Aug 2018, 13:08
von mikele
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.
Re: Wortzahl automatisch auslesen und eintragen
Verfasst: So 12. Aug 2018, 13:45
von F3K Total
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
Re: Wortzahl automatisch auslesen und eintragen
Verfasst: So 12. Aug 2018, 13:50
von mikele
Hallo Rik,
cool.