Laden...

[gelöst] Liste an Word-Textmarke einfügen Open XML SDK

Erstellt von PatchworkMember vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.593 Views
P
PatchworkMember Themenstarter:in
2 Beiträge seit 2019
vor 4 Jahren
[gelöst] Liste an Word-Textmarke einfügen Open XML SDK

Hallo,

ich greife per Open XML SDK auf ein Word Dokument zu.

Nach dem Öffnen sammele ich alle Textmarken im Dokument ein und lege sie in einem Dictionary ab.

Ich kann problemlos einzeiligen Text an der Textmarke einfügen.


private static bool SetTextValueToBookmark(Dictionary<string, BookmarkEnd> bmDict, string bmTextValue, string bmTitel)
        {
            if ((bmDict == null) || (string.IsNullOrEmpty(bmTitel)))
            {
                return false;
            }

            try
            {
                Text textElement = new Text(bmTextValue);
                Run runElement = new Run(textElement);
                BookmarkEnd end = bmDict[bmTitel];
                end.InsertAfterSelf(runElement);
            }
            catch 
            {
                return false;
            }
            return true;
        }

Allerdings scheitere ich am Zeilenumbruch wenn ich mehrere Zeilen an der Textmarke einfügen möchte. Die Listeneinträge werden ohne Zeilenumbruch hintereinander eingefügt.
Meiner Meinung nach hätte ich mit dem wechselnden RUN-Element einen Umbruch erreichen müssen ...


private static bool SetListValueToBookmark(Dictionary<string, BookmarkEnd> bmDict, List<string> bmTextValue, string bmTitel)
        {
            if ((bmDict == null) || (string.IsNullOrEmpty(bmTitel)))
            {
                return false;
            }

            try
            {
                BookmarkEnd end = bmDict[bmTitel];
                foreach (string textValue in bmTextValue)
                {
                    Text textElement = new Text(textValue);
                    Run runElement = new Run(textElement);
                    end.InsertAfterSelf(runElement);
                }
            }
            catch
            {
                return false;
            }
            return true;
        }

Vielleicht hat ja jemand einen Tipp für mich.
-> vorlaufender Dank.

Positiv denken ...

P
PatchworkMember Themenstarter:in
2 Beiträge seit 2019
vor 4 Jahren

Da ich weiterhin an den Umbrüchen gescheitert bin, habe ich alternativ jetzt eine Tabelle eingefügt.
Nicht die sauberste Lösung, aber sie löst mein Problem.
Hier der Code:


        private static bool SetListValueToBookmark(Dictionary<string, BookmarkEnd> bmDict, List<string> bmTextValue, string bmTitel)
        {
            if ((bmDict == null) || (string.IsNullOrEmpty(bmTitel)))
            {
                return false;
            }

            try
            {
                Table table01 = new Table();
                table01.AppendChild<TableProperties>(GetTablePropertiesForStdTable());

                BookmarkEnd end = bmDict[bmTitel];
                foreach (string textValue in bmTextValue)
                {
                    TableRow tr01 = new TableRow(GetTableRowPropertiesForStdCell());
                    AddCellToRow(tr01, textValue, 100);
                    table01.Append(tr01);
                }
                Run runElement = new Run(table01);
                end.InsertAfterSelf(runElement);
            }
            catch
            {
                return false;
            }
            return true;
        }

mit folgenden Assistenzfunktionen für den Tabellenbau


        private static TableProperties GetTablePropertiesForStdTable()
        {
            return new TableProperties(
                new TableBorders(
                    new TopBorder() { Val = new EnumValue<BorderValues>(BorderValues.None), Size = 0 },
                    new BottomBorder() { Val = new EnumValue<BorderValues>(BorderValues.None), Size = 0 },
                    new LeftBorder() { Val = new EnumValue<BorderValues>(BorderValues.None), Size = 0 },
                    new RightBorder() { Val = new EnumValue<BorderValues>(BorderValues.None), Size = 0 },
                    new InsideHorizontalBorder() { Val = new EnumValue<BorderValues>(BorderValues.None), Size = 0 },
                    new InsideVerticalBorder() { Val = new EnumValue<BorderValues>(BorderValues.None), Size = 0 }
                ),
                new TableStyle() { Val = "TableGrid" },
                new TableWidth() { Width = "5000", Type = TableWidthUnitValues.Pct }
                );
        }

        private static TableRowProperties GetTableRowPropertiesForStdCell()
        {
            return new TableRowProperties
                (
                new TableRowHeight() { Val = Convert.ToUInt32("300"), HeightType = HeightRuleValues.AtLeast }
                );
        }

        private static void AddCellToRow(TableRow row, string cellTextValue, int cellWidth)
        {
            Paragraph para = new Paragraph();
            Run run = para.AppendChild(new Run());
            run.RunProperties = GetRunProp_StdText(false);
            run.AppendChild(new Text(cellTextValue));

            TableCell tc = new TableCell();
            tc.Append(new TableCellProperties(new TableCellWidth() { Type = TableWidthUnitValues.Pct, Width = (cellWidth * 50).ToString() }));
            tc.Append(para);
            row.Append(tc);
        }

        private static RunProperties GetRunProp_StdText(bool bold)
        {
            if (bold)
            {
                return new RunProperties(
                    new RunFonts() { Ascii = "Calibri" },
                    new Bold(),
                    new FontSize() { Val = "20" }
                    );
            }

            return new RunProperties(
                new RunFonts() { Ascii = "Calibri" },
                new FontSize() { Val = "20" }
                );
        }



Positiv denken ...