如何使用C#中的OpenXml从word文档中删除两个书签中的数据或表

时间:2012-10-30 11:24:46

标签: c# openxml openxml-sdk

我正在使用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();
            }
        }
    }
}

任何人都可以帮助我。

1 个答案:

答案 0 :(得分:1)

我假设您要从word文档中删除一些表或数据。如果是这种情况,我建议您在Microsoft Word中启用开发人员选项卡。对于Microsoft Word 2007,如果单击Office按钮而不是转到位于下拉菜单底部的“Word选项”按钮。现在启用在功能区中显示“开发人员选项卡”。 现在,激活开发人员选项卡后,您可以在Microsoft Word中看到另一个选项卡“Developer”。如果您单击富文本图标(标有 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语句来从文档中获取标记。你可以根据你的理解改变它们。

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

此致