0

我正在使用 OpenXML 在 C# 中创建 word 文档。我可以在指定书签之后插入我的文本,但是如何删除两个书签中的数据。

以下是在指定书签之后插入文本的代码。

 string fileName = @"C:\Users\sharepointadmin\Desktop\volc.docx";

            TableValues ObjTableValues = new TableValues();
            List<TableValues> allValues = new System.Collections.Generic.List<TableValues>();

            for (int i = 1; i <= 5; i++)
            {
                ObjTableValues = new TableValues();
                ObjTableValues.EmpID = i.ToString();
                ObjTableValues.EmpName = "Emp" + i.ToString();
                ObjTableValues.EmpDesig = "SE";
                ObjTableValues.EmpDept = "Software";

                allValues.Add(ObjTableValues);
                //ConvertMailMergeEscape(fileName);

            }

            AddTable(fileName, allValues);

        }
            using (var document = WordprocessingDocument.Open(fileName, true))
            {
                IDictionary<String, BookmarkStart> bookmarkMap = new Dictionary<String, BookmarkStart>();               

                var doc = document.MainDocumentPart.Document;
                var mainpart = document.MainDocumentPart;
                var res = from ObjTableValues in mainpart.Document.Body.Descendants<BookmarkStart>() where ObjTableValues.Name == "testbookmark" select ObjTableValues;                
                var bookmark = res.SingleOrDefault();
                if (bookmark != null)
                {
                    var parent = bookmark.Parent;
 run.Append(text);
                    Paragraph newParagraph = new Paragraph(run);

                    // insert after bookmark parent
                    parent.InsertAfterSelf(newParagraph);
  foreach (BookmarkStart bookmarkStart in document.MainDocumentPart.RootElement.Descendants<BookmarkStart>())
                {
                    bookmarkMap[bookmarkStart.Name] = bookmarkStart;
                }

                MoveToRangeStart ranstart = new MoveToRangeStart();


                foreach (BookmarkStart bookmarkStart in bookmarkMap.Values)
                {
                    Run bookmarkText = bookmarkStart.NextSibling<Run>();
                    if (bookmarkText != null)
                    {
                        //bookmarkText.GetFirstChild<Text>().Text = "blah";
                    }
                }

                DocumentFormat.OpenXml.Wordprocessing.Table table = new DocumentFormat.OpenXml.Wordprocessing.Table();

                TableProperties props = new TableProperties(
                    new TableBorders(
                    new TopBorder
                    {
                        Val = new EnumValue<BorderValues>(BorderValues.Single),
                        Size = 12
                    },
                    new BottomBorder
                    {
                        Val = new EnumValue<BorderValues>(BorderValues.Single),
                        Size = 12
                    },
                    new LeftBorder
                    {
                        Val = new EnumValue<BorderValues>(BorderValues.Single),
                        Size = 12
                    },
                    new RightBorder
                    {
                        Val = new EnumValue<BorderValues>(BorderValues.Single),
                        Size = 12
                    },
                    new InsideHorizontalBorder
                    {
                        Val = new EnumValue<BorderValues>(BorderValues.Single),
                        Size = 12
                    },
                    new InsideVerticalBorder
                    {
                        Val = new EnumValue<BorderValues>(BorderValues.Single),
                        Size = 12
                    }));

                table.AppendChild<TableProperties>(props);

                foreach (TableValues Tableitem in allValues)
                {
                    var tr = new DocumentFormat.OpenXml.Wordprocessing.TableRow();

                    var tc = new DocumentFormat.OpenXml.Wordprocessing.TableCell();

                    tc.Append(new Paragraph(new Run(new Text(Tableitem.EmpID))));
                    tr.Append(tc);

                    tc = new DocumentFormat.OpenXml.Wordprocessing.TableCell();
                    tc.Append(new Paragraph(new Run(new Text(Tableitem.EmpName))));
                    tr.Append(tc);

                    tc = new DocumentFormat.OpenXml.Wordprocessing.TableCell();
                    tc.Append(new Paragraph(new Run(new Text(Tableitem.EmpDesig))));
                    tr.Append(tc);

                    tc = new DocumentFormat.OpenXml.Wordprocessing.TableCell();
                    tc.Append(new Paragraph(new Run(new Text(Tableitem.EmpDept))));
                    tr.Append(tc);

                    table.Append(tr);

                }
                doc.Body.Append(table);
                doc.Save();
            }
        }
    }
}

任何人都可以帮助我。

4

1 回答 1

1

我假设您想从 word 文档中删除一些表格或数据。如果是这种情况,我建议您在 Microsoft Word 中启用开发人员选项卡。对于 Microsoft Word 2007,如果您单击 Office 按钮,然后转到下拉菜单底部的“Word 选项”按钮。现在启用显示“功能区中的开发人员选项卡”。现在,一旦您激活了开发人员选项卡,您就可以在 Microsoft Word 中看到一个附加选项卡“开发人员”。如果您在此选项卡中单击富文本图标(标记为Aa),则会在您的 Word 文档中插入一个标签。现在,如果你右击标签,你可以给这个标签一个名字和ID。

现在您可以在 C# 中通过其 id 或名称访问此标签。例如,您给出的标签名称是“测试标签”

    MainDocumentPart mainPart = doc.MainDocumentPart;
    List<SdtBlock> taggedContentControls = mainPart.Document.Descendants<SdtBlock>().ToList();
    foreach (var tagControl in taggedContentControls)
                    {
                        string tagName = tagControl.Descendants<SdtAlias>().First().Val.Value;
                        if(tagName== "Test Tag")
                        {
// you can insert any data in this tag over here
}

现在,使用类似的方法,假设您要删除此标签中的表格和其他一些数据

foreach (var tagControl in taggedContentControls)
                {
                    string tagName = tagControl.Descendants<SdtAlias>().First().Val.Value;
                    if (tagName.Contains("Test Tag"))
                    {
// If we want to delete table only
                        //tagControl.SdtContentBlock.Descendants<Table>().First().Remov();       
// If you want to remove everything in this tag                        
tagControl.SdtContentBlock.Remove();
                    }
                }

不要忘记在此操作结束时保存您的文档,我的意思是 mainpart.Document.Save();

为简单起见,我编写了多个 LINQ 语句来从文档中获取标签。您可以根据自己的理解进行更改。

我希望它可以帮助您解决问题。

问候

于 2012-10-30T16:53:39.537 回答