3

我想从 Word 文档中删除 XMLSchemaReference。运行 VBA 代码时,这很简单:

ActiveDocument.XMLSchemaReferences("ActionsPane3").Delete

在 VSTO 中使用 ThisDocument 类时,使用 C# 也很简单:

Globals.ThisDocument.XMLSchemaReferences["ActionsPane3"].Delete();

但是,当使用 WordProcessingDocument 的实例(在普通的 Windows 应用程序中)时,我不知道如何执行相同的操作。知道我应该如何编写我的 C# 代码吗?

4

1 回答 1

1

对于此类问题,您可以做的最好的事情是下载Open XML SDK 生产力工具,并比较您在进行更改之前和之后创建的文档。当我使用 VSTO 添加操作窗格并在工具中探索包时,我注意到这一点:

在此处输入图像描述

然后我使用您提供的代码删除操作窗格:

Globals.ThisDocument.XMLSchemaReferences["ActionsPane3"].Delete();
this.Save();

如果我们现在查看工具中的包,我们会看到以下内容(请注意令人敬畏的手绘):

在此处输入图像描述

现在我们已经确定了需要删除的内容,我们可以开始使用 open xml sdk(using DocumentFormat.OpenXml.Packaging打开文件并using DocumentFormat.OpenXml.Wordprocessing对其进行修改)。在工具中保持文档打开总是很方便,以便能够使用树结构来构建代码。首先我编写代码来打开和保存文档:

byte[] byteArray = File.ReadAllBytes(@"C:\WorkSpace\test\WordTest.docx");

using (var stream = new MemoryStream())
{
   stream.Write(byteArray, 0, byteArray.Length);
   using (WordprocessingDocument doc = WordprocessingDocument.Open(stream, true))
   {
       //Logic here
   }

   using (FileStream fs = new FileStream(@"C:\WorkSpace\test\WordTest_modified.docx", 
          FileMode.Create))
   {
      stream.WriteTo(fs);
   }
}

要删除AttachedSchema您需要以下代码:

doc.MainDocumentPart.DocumentSettingsPart
                    .Settings
                    .GetFirstChild<AttachedSchema>()
                    .Remove();

如您所见,使用您旁边的树结构编写此内容非常方便。要删除,SchemaReference您将需要以下代码:

doc.MainDocumentPart.CustomXmlParts.First()
                    .CustomXmlPropertiesPart
                    .DataStoreItem
                    .SchemaReferences
                    .FirstChild
                    .Remove();

就这样,就像您在 VSTO 应用程序中删除它一样。

编辑:如果我执行以下行以删除所有/docProps/custom.xml操作窗格,则消失:

doc.CustomFilePropertiesPart.Properties.RemoveAllChildren();

我无法真正测试这是否是您的预期行为,因为我使用了测试文档(大小没有显着变化),但现在看到我的操作窗格不见了,它可能是您正在寻找的(属性包含参考我的本地 vsto 文件)。我希望微软能更好地记录这种东西。

于 2016-03-09T09:53:40.303 回答