Programmatische Dokumentenerstellung

  • VB.NET
  • .NET 4.5

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Programmatische Dokumentenerstellung

    Guten Morgen.

    Ich nutze derzeit Microsoft.Office.Interop um ein Word-Dokument programmatisch zu füllen. Einfach Bookmarks suchen und Text hereinschreiben. Das funktioniert soweit zuverlässig. Allerdings gibt es zwei Nachteile, über die ich nicht hinwegsehen kann: a) Ein Office muss installiert sein und b) die Performance ist unterirdisch. Um ein paar tausend Zeichen einzufügen braucht man auf einem alten Quadcore schon über 30 Sekunden...

    Deswegen möchte ich von der bisherigen methode weg. Für Excel nutze ich bereits EPPLUS von Jan Källmann. Das ist wahnsinnig schnell und intuitiv zu nutzen.

    Mein Ziel ist es, während der Laufzeit ein Dokument (Word oder PDF) entweder zu befüllen (Template mit Bookmarks) oder komplett zu erstellen (Viel Text, wenige Bilder, ein PDF als Object). Welche grundsätzlichen Möglichkeiten seht ihr? Ich habe mich mal mit OpenXML versucht, bin aber gescheitert (Der Text stand dann in der document.xml drin, aber wurde nicht angezeigt).

    Ich danke schon mal für Tipps! :thumbup:

    pts schrieb:

    Leider finde ich keine richtige Doku
    Manchmal verlangt Programmieren ingenieursmäßiges Vorgehen.
    Nicht immer fliegen die gebratenen Tauben freiwillig zu dir.
    Aber der Object-Explorer gibt sicher einiges her, was du brauchst.
    Und es gibt ein Tutorial.

    pts schrieb:

    einen Seitenumbruch
    stackoverflow.com/questions/28539760/apache-poi-page-breaks

    pts schrieb:

    ein Object (PDF)
    https://stackoverflow.com/questions/24324384/insert-pdf-file-into-msword-using-java-poi-api

    Und wenn du suchst, solltest du die vier Buchstaben schon in der richtigen Reihenfolge verwenden.
    Unter NPIO findest du wahrscheinlich nichts.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Neu

    Oki, danke dir erstmal. Ich habe schon erste Ergenbnisse und bin soweit zufrieden.

    Und wenn du suchst, solltest du die vier Buchstaben schon in der richtigen Reihenfolge verwenden.
    Unter NPIO findest du wahrscheinlich nichts.


    Ja, da hast du recht. Da hab ich wohl die Wechselstaben verbuchtelt.

    Probleme bereiten mir derzeit längere Strings. Wenn diese einen Zeilenumbruch enthalten (einfacher Zeilenwechsel, kein neuer Absatz), wird dieser schlicht ignoriert. Muss ich mich mal mit der Codierung rumschlagen... Bisher nutze ich Chr(10) oder vbNewLine, aber nichts davon wirkt.

    //EDIT

    Antwort auf letztes problem:
    run.AddCarriageReturn()

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „pts“ ()

    Neu

    Sooo... Jetzt bin ich gerade beim Header. Text einfügen klappt schon:

    Quellcode

    1. Dim header As CT_Hdr = New CT_Hdr()
    2. header.AddNewP().AddNewR().AddNewT.Value = "TEXT TEXT TEXT"
    3. Dim relation1 As XWPFRelation = XWPFRelation.HEADER
    4. Dim myHeader As XWPFHeader = CType(dokument.CreateRelationship(relation1, XWPFFactory.GetInstance(), dokument.HeaderList.Count + 1), XWPFHeader)
    5. myHeader.SetHeaderFooter(header)
    6. Dim myHeaderRef As CT_HdrFtrRef = secPr.AddNewHeaderReference()
    7. myHeaderRef.type = ST_HdrFtr.[default]
    8. myHeaderRef.id = myHeader.GetPackageRelationship().Id


    Kannst du mir sagen, wie ich diesen text formatiere?

    Neu

    Ich gehe mal davon aus, dass der Text im Header auch nicht anders formatiert wird als im Dokument.
    Aber du weißt wohl nicht worauf du die Format-Befehle anwenden sollst.
    Und wahrscheinlich weißt du es deshalb nicht, weil du nicht verstanden hast, was deine Fünferkette ​header.AddNewP().AddNewR().AddNewT.Value bewirkt.

    Die würde ich erst mal splitten und mir die Objekte einzeln abspeichern.
    Dann kommst du vermutlich selbst drauf, auf welches Objekt du die Formatregeln anwenden musst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Neu

    petaod schrieb:

    Ich gehe mal davon aus, dass der Text im Header auch nicht anders formatiert wird als im Dokument.


    Nein, so ist das leider nicht. Der Header wird via OpenXmlFormats.Wordprocessing formatiert.

    Mein akutes Problem ist, dass keinerlei Kommentare zu einer der Elemente ind header.AddNewP().AddNewR().AddNewT.Value gibt:



    Ich habe das auch schon auseinander gedröselt. Leider werde ich aus reinen Funktionsnamen nicht schlau. Gibt es wirklich keine Doku?

    Es gibt in allen 5 Ebenen nichts, was auf "Font", "Style" oder "Align" hindeutet, auch nicht vom Namen her.

    Neu

    Kein Ahnung, ob es eine Doku gibt.
    Aber Ich gehe mal davon aus, dass die Funktion AddNewP einen Paragraph zurück gibt.
    Auf diesen kannst du Formatierungen anwenden.
    Splitte die Kette in einzelne Objekte und schau im Object-Explorer, was du zurück kriegst und welche Methoden auf die jeweiligen Objekte angewendet werden können.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --