Seite 1 von 1
html2doc mittels python
Verfasst: Freitag 29. April 2005, 13:39
von crafty
Tagchen,
ich bin leider noch nicht sonderlich erfahren in Python und bin daher gerade auf ein (für mich) recht hartnäckiges Problem gestossen.
Ich müsste bestehende HTML-Seiten in Word, also .doc konvertieren.
Hab nen paar Zeilen geschrieben in dem ich die Inhalte der HTML-Dateien nehme und einfach ganz plump mit:
file('doku.doc').write(neuerText)
in eine .doc-datei rein'klatsche'.
Alles schön und gut, aber wie kann ich denn mit Python Word quasi beeinflussen?
Also, dass ich sagen kann, wenn er beim Lesen der HTML-Datei auf <h2> oder so stösst, dann ne neue Seite anzufangen oder ähnliches.
Leider finde ich dazu im Web gar nix, hab mich schon bald weg-ge-google-t
Ich bin dankbar für jede Antwort!
crafty

html2doc mittels python
Verfasst: Freitag 29. April 2005, 16:05
von N317V
Am besten ist es, wenn Du Dich in VBA auskennst, denn dann lässt sich mit dem Python-Modul win32com so ziemlich alles in Office ansteuern. Z.B.:
Code: Alles auswählen
from win32com.client import Dispatch
word = Dispatch('Word.Application') # erzeugt Word-Instanz
word.Visible = 1 # macht Word sichtbar
worddoc = word.Documents.Add() # öffnet ein neues Dokument
worddoc.Content.InsertAfter('\n\n dein Text hier \n') # fügt Deinen Text am Ende des Dokuments ein.
Für alle möglichen Funktionen verweise ich auf die Word-VBA-Hilfe z.B. VBAWRD8.HLP bei Word 97 oder eine andere VBA-Doku. Die sind IMHO übrigens furchtbar, weil unlogisch und wirr. Viel Spaß damit! :-/ Für Excel und Powerpoint hab ich mir eine Layer-Klasse geschrieben um die von mir häufig benutzten Funktionen leichter handhaben zu können.
HTH
Edit: code in python-tags gesetzt
Verfasst: Freitag 29. April 2005, 16:33
von CM
Hi
mal dumm gefragt: Mein Word kann html importieren und sogar ziemlich gut und richtig darstellen. Sogar Style Sheets aus css-Dateien werden berücksichtigt. Wozu braucht es da Python?
Ansonsten schau mal in der Buchhandlung Deines Vertrauens, ob es da nicht ein Buch zum Thema VBA gibt, das Dein Problem abdeckt. VAB ist da wohl das Mittel der Wahl und die Bücher die es dazu gibt sind meist besser als die Dokus von MS. Aber Vorsicht: von Word 97 zum heutigen Word gibt es einen gewissen Sprung in der VBA Programmierung, insb. wenn Du nicht nur für amerikanische Nutzer schreiben willst (aber das nur, weil gerade 97 angesprochen wurde).
Gruß,
Christian
Verfasst: Sonntag 1. Mai 2005, 20:45
von crafty
Vielen Dank für die Antworten!
Das mit VBA hilft mir erstmal weiter.
Zu der Frage warum ich Python benötige oder das mit Python machen will.
Ich habe mehrere HTML-Seiten, die ich zu einem Word-Dok zusammenfügen muss und das auch in einer bestimmten Reihenfolge.
Da ansonsten bei demjenigten für den ich das mache alles mit Python zu tun hat, soll das ein Pythonskript werden. Dies wird dann einmal angestossen und dann sollen die entsprechenden HTML-Seiten zu einem Word-Dok (incl. Seitenumbrüche bei neuem Kapitel und Inhaltsverzeichnis usw.) zusammengefasst werden.
Also, danke für die Anregungen. Werde mich mal daran versuchen!
Gruß,
Heike
Verfasst: Montag 2. Mai 2005, 11:20
von Gast
Und zack... da hab ich wieder eine Frage...
Was ich nun leider trotzdem nicht hinbekomme ist das aktive Dokument anzusprechen und darin etwas zu ändern, z.b. Seitenzahlen hinzufügen o.ä.
Ich hab versucht Teile des Makro-Codes von Word umzuarbeiten, sodass ich sie in Python nutzen kann, nur leider gelingt mir das ganz und gar nicht.
Im Makro selber steht z.b. "With ActiveDocument
.TablesOfContents.Add Range:=Selection.Range"
wie setze ich das jetzt in Python um? *verzweifel
Verfasst: Montag 2. Mai 2005, 12:19
von N317V
Anonymous hat geschrieben:
Im Makro selber steht z.b. "With ActiveDocument
.TablesOfContents.Add Range:=Selection.Range"
wie setze ich das jetzt in Python um? *verzweifel
Mal so aus dem Ärmel geschüttelt und nur halbwegs getestet:
Code: Alles auswählen
word.Documents(word.ActiveDocument()).TablesOfContents.Add(word.Selection.Range)
Verfasst: Montag 2. Mai 2005, 12:26
von crafty
Super vielen Dank
Jetzt hab ich auch ne Vorstellung davon wie ich mit dem Makro-Kram umzugehen habe.
Super cool

Verfasst: Montag 2. Mai 2005, 12:43
von Leonidas
Aus meinem alten Script:
Code: Alles auswählen
import win32com.client
def writetext(text):
"""Writes a text at the current cursor position into Word"""
word = win32com.client.Dispatch('Word.Application')
sel = word.Selection
sel.TypeText(text)
nochmal ne frage
Verfasst: Montag 9. Mai 2005, 13:43
von crafty
Ich hätte da doch noch mal ne Frage.
Und zwar möchte ich noch ein paar Formatierungen durch das Laden einer Dokumentvorlage in das erstellte Dokument einbringen.
Der text des Makros lautet:
With ActiveDocument
.UpdateStylesOnOpen = True
.AttachedTemplate = "C:\s4m.dot"
End With
doch das zuweisen klappt bei mir nicht.
Müsste doch sowas sein wie
word.Documents(word.ActiveDocument()).AttachedTemplate = "C:\s4m.dot"
oder nicht?
Verfasst: Montag 9. Mai 2005, 14:00
von Leonidas
Ich hatte es ja eher so gemacht:
Code: Alles auswählen
ActiveDocument = word.Documents(word.ActiveDocument())
ActiveDocument.UpdateStylesOnOpen = True
ActiveDocument.AttachedTemplate = r"C:\s4m.dot"
Das ist aber ungetestet, ich habe auf dieser Kiste zum Glück kein Word.
Verfasst: Dienstag 10. Mai 2005, 10:24
von crafty
Leider schmiert mir bei dieser ganzen Aktion fast jedes Mal Word direkt ab.
Außerdem wird die Seitennummerierung und das was sonst noch so in der Fußzeile der Formatvorlage vorhanden ist gar nicht übernommen.
Vielleicht noch ne Idee??

Verfasst: Dienstag 10. Mai 2005, 10:44
von crafty
habe gerade gesehen, dass der Code des Makros noch etwas mehr beinhaltet und zwar:
Code: Alles auswählen
AddIns.Add FileName:="C:\s4manage.dot", Install:=True
With ActiveDocument
.UpdateStylesOnOpen = True
.AttachedTemplate = "C:\s4manage.dot"
End With
trotzdem funktioniert es irgendwie nicht

Verfasst: Dienstag 10. Mai 2005, 15:25
von crafty
oder könnte mir evtl. jemand sagen wie ich diesen code
Code: Alles auswählen
Selection.GoTo What:=wdGoToPage, Which:=wdGoToNext, Name:="1"
des word-makros 'übersetze'?? *verzweifel
Verfasst: Donnerstag 12. Mai 2005, 12:44
von crafty
äähm, ich möchte ja nicht nerven, aber hätte evtl. jemand bitte eine Idee wie man
Code: Alles auswählen
With Selection.Find
.Text = _"<win32com.gen_py.Microsoft Word 10.0 Object Library.TableOfContents instance at 0x22080808>"
.Replacement.Text = ""
das übersetzen kann?
Das wäre echt wichtig für mich...
Danke!
Verfasst: Donnerstag 12. Mai 2005, 13:21
von N317V
crafty hat geschrieben:äähm, ich möchte ja nicht nerven,
Ich möchte ja echt nicht patzig sein, aber: hast Du eigentlich für Deine anderen Fragen Antworten gefunden? Da ich auch nur mit Office arbeite, wenn ich muss und eigentlich keine Ahnung von VB hab, kann ich die Antworten leider auch nicht so einfach aus dem Ärmel schütteln, sondern muss wohl wie Du per Versuch und Irrtum rumtüfteln.
Code: Alles auswählen
With Selection.Find
.Text = _"<win32com.gen_py.Microsoft Word 10.0 Object Library.TableOfContents instance at 0x22080808>"
.Replacement.Text = ""
So wie ich das sehe ist ja das with-Statement nur eine Abkürzung. Die ausführliche Version müsste also, etwa so aussehen:
Code: Alles auswählen
Selection.Find.Text = _"<win32com.gen_py.Microsoft Word 10.0 Object Library.TableOfContents instance at 0x22080808>"
Selection.Find.Replacement.Text = ""
Ja und genau so würd ich das auch übersetzten. Der Unterstrich vor dem String ist mir zwar vollkommen unklar und den würd ich jetzt in Python einfach mal weglassen. Ebenso rätselhaft ist für mich auch, warum Du ausgerechnet diesen String suchen willst und wie es kommt, dass Du dafür VBA-Code hast, aber ... *schulterzuck* ... {siehe meine Signatur}
edit: typo im code beseitigt
Edit (Leonidas): Python Code in Python-Tags gesetzt.
Verfasst: Donnerstag 12. Mai 2005, 17:59
von Leonidas
Hier hast du mal was zum spielen (hat zumindest mit Word 2002 funktioniert):
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: latin-1 -*-
import win32com.client
def replacetext(replace, by):
"""Replaces a text by another.
Returns True if there was something replaced and False if not.
Needs _static_ dispatch"""
word = win32com.client.Dispatch('Word.Application')
sel = word.Selection
sel.Find.ClearFormatting()
sel.Find.Replacement.ClearFormatting()
sel.Find.Text = replace
sel.Find.Replacement.Text = by
sel.Find.Forward = True
sel.Find.Wrap = win32com.client.constants.wdFindContinue
#sel.Find.Wrap = 1
sel.Find.Format = False
sel.Find.MatchCase = False
sel.Find.MatchWholeWord = False
sel.Find.MatchSoundsLike = False
sel.Find.MatchAllWordForms = False
return sel.Find.Execute(Replace=win32com.client.constants.wdReplaceAll)
#return sel.Find.Execute(Replace=2)
Verfasst: Montag 23. Mai 2005, 08:23
von crafty
Danke Leonidas!

Verfasst: Montag 23. Mai 2005, 11:24
von crafty
Kennt evtl. zufälliger Weise jemand einen Trick, um den Cursor dazu zu bewegen an das Ende des Dokumentes zu gehen und dort zu bleiben?
Ich müsste am Ende eines bestehenden Dokumentes eine Datei einfügen.
Am Ende einer Datei Text einzufügen ist kein Problem. Auch kann ich in ein Dokument eine Datei einfügen, aber die wird am Anfang und nicht am Ende eingefügt.
Mal wieder besten Dank!
Verfasst: Samstag 28. Mai 2005, 06:08
von Leonidas
Ich vermute mal, dass das sel Objekt (aus meinem Vorherigen Beispiel) dir helfen kann, es dazu Methoden bereitstellt. EIne große Hilfe für sowas ist meiner Meinung nach
vbawd10, ist manchmal echt nützlich..