【问题标题】:Change document's font using Open XML使用 Open XML 更改文档的字体
【发布时间】:2016-09-12 00:13:34
【问题描述】:

我无法使用 Open XML 更改文档的字体。我尝试使用 PrependChild 将新字体应用于段落。但是,它抛出了异常“无法插入 OpenXmlElement “newChild”,因为它是树的一部分。”。经过一番研究,我发现我需要将该元素克隆到一个单独的对象中并在那里进行更改,所以我采用了这种方法

clonedRun = (Run)runList[j].CloneNode(true);                      
clonedRun.PrependChild(runProp);
runList[j] = clonedRun;

但该异常消息仍然出现。我试图删除该运行的父元素以使其不再是树的一部分,但是,它的父元素为空(当然)。

static void Main(string[] args)
{
    using (var doc = WordprocessingDocument.Open(@"mydoc.docx", true))
    {
        RunProperties runProp = new RunProperties(); // Create run properties.
        RunFonts runFont = new RunFonts();           // Create font
        runFont.Ascii = "Arial";                     // Specify font family
        FontSize size = new FontSize();
        size.Val = new StringValue("48");  // 48 half-point font size
        runProp.Append(runFont);
        runProp.Append(size);

        var clonedParagraph = new Paragraph();
        var clonedRun = new Run();

        var paragraphList = doc.MainDocumentPart.RootElement.Descendants<Paragraph>()
            .ToList<Paragraph>();
        for (int i = 0; i < paragraphList.Count; i++)
        {
            clonedParagraph = (Paragraph)paragraphList[i].CloneNode(true);
            var runList = clonedParagraph.Elements<Run>().ToList();

            for (int j = 0; j < runList.ToList().Count; j++)
            {
                clonedRun = (Run)runList[j].CloneNode(true);                      
                clonedRun.PrependChild(runProp);
                runList[j] = clonedRun;
            }
            paragraphList[i] = clonedParagraph;
        }
        doc.MainDocumentPart.Document.Save();
    }
}

这是 clonedNode 的内部 XML

<w:r w:rsidRPr="00E474DB" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
    <w:rPr>
        <w:rFonts w:ascii="Calibri" w:hAnsi="Calibri" w:eastAsia="MS Pゴシック" w:cs="Calibri" />
        <w:sz w:val="48" />
        <w:szCs w:val="48" />
        <w:lang w:eastAsia="ja-JP" />       
    </w:rPr>
    <w:t>Curriculum Vitae</w:t>
</w:r>

【问题讨论】:

    标签: java fonts ms-word openxml document


    【解决方案1】:

    我发现了我的代码问题。我需要做的是更改 RunPropeties 元素,而不是 Run。以下是我的新工作代码

    using (var doc = WordprocessingDocument.Open(@"D:\FSoft_CV - ThangPQ.docx", true))
            {               
                Body body = doc.MainDocumentPart.Document.Body;
                //Get all paragraphs
                var lstParagrahps = body.Descendants<Paragraph>().ToList();
                foreach (var para in lstParagrahps)
                {
                    var subRuns = para.Descendants<Run>().ToList();
                    foreach (var run in subRuns)
                    {
                        var subRunProp = run.Descendants<RunProperties>().ToList().FirstOrDefault();
    
                        var newFont = new RunFonts();
                        newFont.Ascii = "Algerian";
                        newFont.EastAsia = "Algerian";
    
                        if (subRunProp != null)
                        {
                            var font = subRunProp.Descendants<RunFonts>().FirstOrDefault();
                            subRunProp.ReplaceChild<RunFonts>(newFont, font);
                        }
                        else
                        {
                            var tmpSubRunProp = new RunProperties();
                            tmpSubRunProp.AppendChild<RunFonts>(newFont);
                            run.AppendChild<RunProperties>(tmpSubRunProp);
                        }
    
                    }        
                }
                doc.MainDocumentPart.Document.Save();
                doc.Close();
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      相关资源
      最近更新 更多