当前位置: 首页 > 编程语言 > C#

在Open XML SDK中的单词书签后插入OpenXmlElement分享

时间:2023-04-11 03:41:22 C#

C#学习教程:在OpenXMLSDK中的Word书签后插入OpenXmlElementsharemainPart.Document.Body.Descendants()wherebm.Name=="BookmarkName"selectbm;现在我想在这个书签之后插入一个段落和一个表格。我该怎么做(示例代码将不胜感激)代码有了书签后,您可以访问其父元素并在其后添加其他项目。使用(WordprocessingDocument文档=WordprocessingDocument.Open(@"C:Pathfilename.docx",true)){varmainPart=document.MainDocumentPart;varres=frombminmainPart.Document.Body.Descendants()wherebm.Name=="BookmarkName"selectbm;varbookmark=res.SingleOrDefault();如果(书签!=null){varparent=bookmark.Parent;//书签的父元素//一个声明中的简单段落//ParagraphnewParagraph=newParagraph(newRun(newText("Hello,World!")));//逐段构建段落Texttext=newText("Hello,World!");运行run=newRun(newRunProperties(newBold()));运行。追加(文本);段落newParagraph=newParagraph(run);//在父书签之后插入parent.InsertAfterSelf(newParagraph);vartable=newTable(newTableProperties(newTableStyle(){Val="TableGrid"},newTableWidth(){Width=0,Type=TableWidthUnitValues.Auto}),newTableGrid(newGridColumn(){Width=(UInt32Value)1018U},新GridColumn(){Width=(UInt32Value)3544U}),newTableRow(newTableCell(newTableCellProperties(newTableCellWidth(){Width=0,Type=TableWidthUnitValues.Auto}),newParagraph(newRun(newText("Category名称")))),newTableCell(newTableCellProperties(newTableCellWidth(){Width=4788,Type=TableWidthUnitValues.Dxa}),newParagraph(newRun(newText("Value"))))),newTableRow(newTableCell(newTableCellProperties(newTableCellWidth(){Width=0,Type=TableWidthUnitValues.Auto}),newParagraph(newRun(newText("C1")))),newTableCell(newTableCellProperties(newTableCellWidth(){Width=0,Type=TableWidthUnitValues.Auto}),newParagraph(newRun(newText("V1"))))));//在新段落之后插入newParagraph.InsertAfterSelf(表格);}//close保存所有部分并关闭文档document.Close();上面的代码应该可以做到,但是我会解释一些特殊情况。请注意,它将尝试在书签的父元素之后插入。如果您的书签恰好是表格中段落的一部分,您会期待什么行为?它是否应该将新的段落和表格附加到该表格?还是应该在那张桌子之后?您可能想知道为什么上述问题很重要。这完全取决于插入的位置。目前,如果书签的父项在表中,上述代码将尝试将表放入表中。这很好,但由于无效的OpenXml结构可能会发生错误。原因是如果插入的表格是原表格的TableCell中的最后一个元素,则需要在结束TableCell标签后添加一个Paragraph元素。如果尝试在MSWord中打开文档时出现此问题,您会立即注意到此问题。解决方案是确定您是否实际执行了对表的插入。为此,我们可以添加上面的代码(在parent变量之后):varparent=bookmark.Parent;//书签的父元素//循环直到我们得到包含元素,以防书签在表格内等等//继续检查元素的父元素并更新它直到我们到达正文vartempParent=bookmark.Parent;boolisInTable=false;while(tempParent.Parent!=mainPart.Document.Body){tempParent=tempParent.Parent;if(tempParentisTable&&!isInTable)isInTable=true;}//...newParagraph.InsertAfterSelf(表);//从上面的示例中//如果书签在表格中,则在表格之后添加一个段落if(isInTable)table.InsertAfterSelf(newParagraph());这应该可以防止错误并为您提供有效的OpenXml。如果你对我之前的问题的回答是肯定的,并且想在父表之后而不是像上面的代码中那样在表内执行插入,你可以使用while循环的想法。如果是这种情况,上述问题不再是问题,您可以将循环和布尔值替换为:varparent=bookmark.Parent;//书签的父元素while(parent.Parent!=mainPart.Document.Body){parent=parent.Parent;这会不断重新分配父级,直到它成为Body级别的主要包含元素。因此,如果书签位于表格的一个段落中,它将从段落到TableCell,再到TableRow,再到Table,然后停在那里,因为Table的父级是Body。然后parent=Table元素,我们可以在它后面插入。这应该涵盖几种不同的方法,具体取决于您的初衷。如果您在试用后需要任何说明,请告诉我。文件反射器您可能想知道我是如何确定GridColumn.Width值的。我做了一个表格,用文档反射器工具搞定了。安装OpenXmlSDK时,生产力工具(如果已安装)将位于C:\ProgramFiles\OpenXMLFormatSDKV2.0tools(或类似目录)中。了解*.docx格式(或任何OpenXml格式文档)如何工作的最佳方法是使用文档反射器工具打开现有文件。浏览文档部分以查找要复制的项目。该工具显示了用于生成整个文档的实际代码。您可以将以下代码复制/粘贴到您的应用程序中以产生类似的结果。您通常可以忽略所有参考ID;您将不得不亲眼目睹并感受一下。正如我提到的,上面的表格代码改编自示例文档。我向docx添加了一个简单的表格,然后在工具中打开它并复制了工具生成的代码(我删除了一些额外的东西来清理它)。这给了我一个添加表格的工作示例。当您想知道如何编写生成某些内容(例如格式化表格、样式化段落等)的代码时特别有用。查看此链接以获取有关SDK中包含的其他工具的屏幕截图和信息:OpenXMLSDK2.0简介。代码片段您可能还对OpenXml代码片段感兴趣。有关代码片段列表,请查看此博客文章。您可以从此处下载它们:2007OfficeSystemSamples:OpenXMLFormatSDK2.0CodeSnippetsforVisualStudio2008。安装后,您可以从工具|添加它们。片段管理器菜单。选择C#作为语言,单击添加按钮,然后导航到PersonalFolderVisualStudio2008CodeSnippetsVisualC#OpenXMLSDK2.0forMicrosoftOffice以添加它们。在您的代码中,您可以右键单击并选择“插入代码片段”并选择所需的代码。以上就是C#学习教程:将OpenXmlElement分享的所有内容插入OpenXMLSDK中word书签后。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: