使用 Open XML 更改文档的字体
Change document's font using Open XML
我在使用 Open XML 更改文档字体时遇到问题。我尝试使用 PrependChild 将新字体应用于段落。但是,它抛出了异常 "Cannot insert the 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>
我发现了我的代码的问题。我需要做的是更改 运行Propeties 元素,而不是 运行。下面是我的新工作代码
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();
}
我在使用 Open XML 更改文档字体时遇到问题。我尝试使用 PrependChild 将新字体应用于段落。但是,它抛出了异常 "Cannot insert the 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>
我发现了我的代码的问题。我需要做的是更改 运行Propeties 元素,而不是 运行。下面是我的新工作代码
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();
}