Programmatische Dokumentenerstellung

  • VB.NET
  • .NET 4.5

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von pts.

    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
    --
    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“ ()

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

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

    petaod schrieb:

    Kein Ahnung, ob es eine Doku gibt.

    Schade, ich hatte gehofft, da du es hier empfiehlst kennst du dich damit aus.
    Aber Ich gehe mal davon aus, dass die Funktion AddNewP einen Paragraph zurück gibt.

    Nein, ein CT_P. Da ist keine Methode oder eigenschaft drin, die für mich nach Styling aussieht...

    Beim Rest sieht es nicht besser aus...

    (AddNewR vom Typ CT_R)

    (AddNewT vom Typ CT_T)

    Die Apache POI Wiki ist auch echt mager. Und von Java auf VB zu schließen ist nicht immer so einfach möglich...
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Danke dir erstmal. Leider ist das alles für Java bzw. Apache POI statt NPOI und die Klassen heißen da anders (oft ähnlich, z.B. CTR statt C_TR) und Java hat oft .SetXYZ und .GetXYZ statt nur .XYZ das R/W ist. Sehr verwirrend.

    Naja ich versuche mich durchzuwurschteln. Mittlerweile schaffe ich es meinen Text reinzuprügeln, Bilder einzubauen, Tabellen zu erzeugen und sogar ein Inhaltsverzeichnis (ohne Seitenangaben) ist machbar. Nicht übel. Vor allem schöööön schnell.

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

    Okay, also ich bin jetzt auf iTextSharp umgestiegen. Damit bekomme ich alles ordnetlich hin. Ich kann direkt pdf-Seiten einfügen - super. Etwas tricky war die Sache mit Kopf- und Fusszeilen. Da muss man mit Templates arbeiten und das hab ich erstmal lernen müssen.

    Aber: Läuft soweit. Einziges "Problem": Ein Template braucht eine base-Font und da gibbets nur so einen Times Roman Abklatsch... Und das sieht Kacke aus... Aber da find ich noch ne Lösung.