2013-04-30 2 views
1

У меня проблема с нашей нормальным.dotm нашей фирмы, связанная с атрибутом eastAsia в styles.xml. Если вам интересно, вы можете найти a history of the issue here. Мы не можем просто заменить шаблон по всей стране, не перезаписывая пользовательские стили/макросы и т. Д. У меня почти нет опыта работы с OpenXML, но я думал, что это может решить проблему. Тем не менее, все статьи и учебные пособия, которые я нашел, не помогли. Все они ссылаются на часть «Документ» и направлены на изменение контента, а не на элементы и атрибуты.Изменить атрибут eastAsia в OpenXML

В принципе, мне нужно Переберите каждого <w:rFonts> элемента и изменить атрибут w:eastAsia от "Times New Roman" до "MS Mincho." Это единственная часть я чувствую себя уверенно:

using DocumentFormat.OpenXml; 
using DocumentFormat.OpenXml.Packaging; 
using DocumentFormat.OpenXml.Wordprocessing; 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.IO.Packaging; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace eastAsiaFix 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     using (WordprocessingDocument myDocument = WordprocessingDocument.Open(@"C:\users\" + Environment.UserName + @"\Desktop\eastAsiaFix.dotm", true)) 
     { 
      StyleDefinitionsPart styles = myDocument.MainDocumentPart.StyleDefinitionsPart; 

      if (styles == null) 
      { 
       return; 
      } 
     } 

    } 
    } 
} 

Я думаю, что мне нужно что-то вроде следующего :

foreach (OpenXMLElement theStyle in styles.Styles.ChildElements) 
{ 
    if (theStyle.LocalName = "style") 
    { 
     theStyle.StyleRunProperties.RunFonts.EastAsia.Value = "MS Mincho"; //faking this 
    } 
} 

Как добраться до w:rFonts узла и изменить атрибут eastAsia?

ответ

1

Я могу придумать два разных решения для изменения Восточно-азиатский шрифт значение. Первое решение просто изменяет Восточно-азиатский шрифт значение для всех RunFonts под коллекцией Styles. Это решение также изменит значение Восточноазиатское значение . Значение для параметра по умолчанию для документа и свойств запуска (DocDefaults класс, w: docDefaults).

using (WordprocessingDocument myDocument = WordprocessingDocument.Open(@"C:\users\" + Environment.UserName + @"\Desktop\eastAsiaFix.dotm", true)) 
{ 
    StyleDefinitionsPart stylesPart = myDocument.MainDocumentPart.StyleDefinitionsPart; 

    if (stylesPart == null) 
    { 
    Console.Out.WriteLine("No styles part found."); 
    return; 
    } 

    foreach(var rf in stylesPart.Styles.Descendants<RunFonts>()) 
    {   
    if(rf.EastAsia != null) 
    { 
     Console.Out.WriteLine("Found: {0}", rf.EastAsia.Value); 
     rf.EastAsia.Value = "MS Mincho"; 
    }   
    }  
} 

Второе решение было бы изменить значениеВосточной Азии шрифта только для определения стиля (а не для пункта и запуск свойств документа по умолчанию):

using (WordprocessingDocument myDocument = WordprocessingDocument.Open(@"C:\users\" + Environment.UserName + @"\Desktop\eastAsiaFix.dotm", true)) 
{ 
    StyleDefinitionsPart stylesPart = myDocument.MainDocumentPart.StyleDefinitionsPart; 

    if (stylesPart == null) 
    { 
    Console.Out.WriteLine("No styles part found."); 
    return; 
    } 

    foreach(var style in stylesPart.Styles.Descendants<Style>()) 
    {   
    foreach(var rf in style.Descendants<RunFonts>()) 
    { 
     if(rf.EastAsia != null) 
     { 
     Console.Out.WriteLine("Found: {0}", rf.EastAsia.Value); 
     rf.EastAsia.Value = "MS Mincho"; 
     } 
    }    
    }  
} 
+0

Спасибо, @Hans ! Я использовал второе решение, чтобы избежать изменения значений по умолчанию, которые не являются проблемой. Это здорово! Если вы не возражаете против моего вопроса, почему вы используете «var Style» и «var rf» вместо «Style style» и «RunFonts rf?»? Это одна из вещей, которую я повесил, когда я экспериментировал с различными заявлениями 'foreach'. – tmoore82

+0

@ tmoore82: О, это только мои личные предпочтения. Вы также можете явно ввести переменные. – Hans

+0

Cool. Еще раз спасибо! – tmoore82

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