html2doc mittels python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
crafty
User
Beiträge: 12
Registriert: Freitag 29. April 2005, 12:56

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
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

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
Zuletzt geändert von N317V am Dienstag 3. Mai 2005, 08:47, insgesamt 1-mal geändert.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
crafty
User
Beiträge: 12
Registriert: Freitag 29. April 2005, 12:56

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
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
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

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)
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
crafty
User
Beiträge: 12
Registriert: Freitag 29. April 2005, 12:56

Super vielen Dank :!:

Jetzt hab ich auch ne Vorstellung davon wie ich mit dem Makro-Kram umzugehen habe.
Super cool :D
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
crafty
User
Beiträge: 12
Registriert: Freitag 29. April 2005, 12:56

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?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
crafty
User
Beiträge: 12
Registriert: Freitag 29. April 2005, 12:56

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?? :(
crafty
User
Beiträge: 12
Registriert: Freitag 29. April 2005, 12:56

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 :?:
crafty
User
Beiträge: 12
Registriert: Freitag 29. April 2005, 12:56

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
crafty
User
Beiträge: 12
Registriert: Freitag 29. April 2005, 12:56

ää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!
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

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.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
crafty
User
Beiträge: 12
Registriert: Freitag 29. April 2005, 12:56

Danke Leonidas! :D
crafty
User
Beiträge: 12
Registriert: Freitag 29. April 2005, 12:56

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!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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..
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten