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 :wink:

Ich bin dankbar für jede Antwort!

crafty :D

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! :wink:

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 :D

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! :D

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..