2016-03-01 7 views
3

Я хочу удалить XMLSchemaReference из документа Word. При запуске VBA код, это просто:Как удалить XMLSchemaReference при использовании WordProcessingDocument?

ActiveDocument.XMLSchemaReferences("ActionsPane3").Delete 

При использовании ThisDocument класса в VSTO, это также просто с C#:

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

Однако при использовании экземпляра WordProcessingDocument (в нормальное приложение Windows), я не знаю, как выполнить одно и то же действие. Любая идея о том, как я должен писать свой код на C#?

+0

Обычный способ обнаружить это - иметь документ как с, так и без ActionPane. Используйте функцию сравнения в инструменте Open XML SDK Productivity Tool, чтобы узнать разницу в базовом XML, а также код, необходимый для создания второго документа с первого. –

ответ

1

Для решения таких проблем лучше всего загрузить Open XML SDK productivity tool и сравнить документы, которые вы сделали до и после внесения изменений. Когда я использую VSTO добавить ActionsPane и я изучить пакет в инструменте я заметил это:

enter image description here

Тогда я удалить ActionsPane с кодом вы дали:

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

Если мы посмотрим на упаковке в инструменте теперь мы имеем следующее (пожалуйста замечают удивительный свободный почерк):

enter image description here

Теперь, когда мы определили, что нужно удалить, мы можем начать работу с открытым 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.

Edit: Если я выполнить следующую строку, чтобы удалить все /docProps/custom.xml панель действий исчезла:

doc.CustomFilePropertiesPart.Properties.RemoveAllChildren(); 

я не могу проверить, если это ожидаемое поведение для вас, потому что я использую тест документ (никаких заметных изменений в размере), но теперь, когда моя панель действий исчезла, возможно, это то, что вы ищете (свойства содержат ссылку на мой локальный файл vsto). Я бы хотел, чтобы Microsoft немного документировала этот материал.

+0

Спасибо. Этот ответ помог мне немного дальше, но пока не является полным решением. Я вижу, что мой .docx сжал 1 КБ вместо 105 КБ (что происходит при запуске кода VBA или приложения VSTO).После открытия документа панель действий все еще существует. Есть ли что-то дополнительное, что нужно сделать? Это, вероятно, почти полное решение. – Daan

+0

@Daan Вот что я нашел странным, когда я использовал ваш код, чтобы удалить ссылку на actionpane, у меня также все еще было это. Может ли быть больше кода в приложении vsto? Вероятно, пользовательская часть xml должна быть удалена вместе. –

+0

Нет, больше нет. К тому же. При запуске одной строки VBA-кода (см. Выше) я также получаю необходимый эффект. Тем не менее, я не получаю правильный эффект в своем обычном приложении Windows, используя WordprocessingDocument. Ваш код выглядит неплохо, и ожидается, что он будет работать, но, к сожалению, этого не происходит. – Daan

 Смежные вопросы

  • Нет связанных вопросов^_^