在OpenXML中编辑eastAsia属性

时间:2013-04-30 22:54:58

标签: c# xml openxml

我的公司的Normal.dotm与styles.xml中的eastAsia属性有关。如果您有兴趣,可以找到a history of the issue here。我们不能只在不覆盖自定义样式/宏等的情况下更换整个模板。我几乎没有使用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 个答案:

答案 0 :(得分: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";
      } 
    }               
  }      
}