Excel OpenXml 工作簿类中 xml 元素的特定顺序

本文关键字:元素 定顺序 xml OpenXml 工作簿 Excel | 更新日期: 2023-09-27 17:55:20

我通过OpenXml创建PowerPoint演示文稿。演示文稿的幻灯片中充斥着嵌入的对象。通常,Excel 文档是嵌入的。除了准备要嵌入的图像和文档之外,Excel 还需要另一个信息,在 PowerPoint 中打开文档时应向用户显示该区域。

通过将 OleSize 类添加到工作簿部件,可以将此信息添加到 Excel 工作簿中。请忽略此代码不会检查该片段是否存在,这肯定会导致问题。这只是一个简单的例子。

    var oleSize = new OleSize() {Reference = "A1:H12"};
    var workbook = document.WorkbookPart.Workbook;
    workbook.Append(oleSize);

当刚刚添加到工作簿类的 OpenXmlElements 列表的末尾时,Excel 将显示一个错误消息对话框,指出该文件已损坏,无法修复。将此元素直接放在 PivotCache OpenXmlElement 之后确实是一种解决方法。现在我体验到,当OpenXmlElement在OleSize之前可用时,Excel也会引发该消息。

我找不到任何关于该特定类的OpenXmlElements订单的必要性的信息。

任何提示都受到高度赞赏。

Excel OpenXml 工作簿类中 xml 元素的特定顺序

您对答案中列出的顺序是正确的。在您引用的 OpenXML 规范文档中,有一个 XSD(第 3936 页)用于Workbook,它表明该顺序确实是强制性的,因为它被定义为Sequence

<xsd:complexType name="CT_Workbook">
    <xsd:sequence>
        <xsd:element name="fileVersion" type="CT_FileVersion" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="fileSharing" type="CT_FileSharing" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="workbookPr" type="CT_WorkbookPr" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="workbookProtection" type="CT_WorkbookProtection" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="bookViews" type="CT_BookViews" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="sheets" type="CT_Sheets" minOccurs="1" maxOccurs="1"/>
        <xsd:element name="functionGroups" type="CT_FunctionGroups" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="externalReferences" type="CT_ExternalReferences" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="definedNames" type="CT_DefinedNames" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="calcPr" type="CT_CalcPr" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="oleSize" type="CT_OleSize" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="customWorkbookViews" type="CT_CustomWorkbookViews" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="pivotCaches" type="CT_PivotCaches" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="smartTagPr" type="CT_SmartTagPr" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="smartTagTypes" type="CT_SmartTagTypes" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="webPublishing" type="CT_WebPublishing" minOccurs="4129 0" maxOccurs="1"/>
        <xsd:element name="fileRecoveryPr" type="CT_FileRecoveryPr" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="webPublishObjects" type="CT_WebPublishObjects" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/>
    </xsd:sequence>
    <xsd:attribute name="conformance" type="s:ST_ConformanceClass"/>
</xsd:complexType>

如果您有兴趣,我在这里有一个答案,它显示了将项目添加到文件中正确位置的一种方法。

在深入研究OpenXml规范,第4版之后,我发现了以下信息:

sml_CT_Workbook =
     4261 attribute conformance { s_ST_ConformanceClass }?,
     4262 element fileVersion { sml_CT_FileVersion }?,
     4263 element fileSharing { sml_CT_FileSharing }?,
     4264 element workbookPr { sml_CT_WorkbookPr }?,
     4265 element workbookProtection { sml_CT_WorkbookProtection }?,
     4266 element bookViews { sml_CT_BookViews }?,
     4267 element sheets { sml_CT_Sheets },
     4268 element functionGroups { sml_CT_FunctionGroups }?,
     4269 element externalReferences { sml_CT_ExternalReferences }?,
     4270 element definedNames { sml_CT_DefinedNames }?,
     4271 element calcPr { sml_CT_CalcPr }?,
     4272 element oleSize { sml_CT_OleSize }?,
     4273 element customWorkbookViews { sml_CT_CustomWorkbookViews }?,
     4274 element pivotCaches { sml_CT_PivotCaches }?,
     4275 element smartTagPr { sml_CT_SmartTagPr }?,
     4276 element smartTagTypes { sml_CT_SmartTagTypes }?,
     4277 element webPublishing { sml_CT_WebPublishing }?,
     4278 element fileRecoveryPr { sml_CT_FileRecoveryPr }*,
     4279 element webPublishObjects { sml_CT_WebPublishObjects }?,
     4280 element extLst { sml_CT_ExtensionList }?

没有信息这是保证的还是预期的顺序,但只需几个测试,它看起来很有希望(来自我检查该顺序的测试工作簿之一的工作簿 openxml 片段)

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<x:workbook xmlns:x15ac="http://schemas.microsoft.com/office/spreadsheetml/2010/11/ac" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main" mc:Ignorable="x15" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <x:fileVersion appName="xl" lastEdited="6" lowestEdited="5" rupBuild="14420" />
    <x:workbookPr defaultThemeVersion="124226" />
    <mc:AlternateContent xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
        <mc:Choice Requires="x15">
            <x15ac:absPath xmlns:x15ac="http://schemas.microsoft.com/office/spreadsheetml/2010/11/ac" url="{path}" />
        </mc:Choice>
    </mc:AlternateContent>
    <x:bookViews>
        <x:workbookView xWindow="240" yWindow="90" windowWidth="23580"  windowHeight="10110" />
    </x:bookViews>
    <x:sheets>
        <x:sheet name="PRINT" sheetId="1" r:id="rId1" />
        <x:sheet name="PRINT2" sheetId="4" r:id="rId2" />
        <x:sheet name="Data" sheetId="5" state="veryHidden" r:id="rId3" />
        <x:sheet name="PRINT3" sheetId="6" r:id="rId4" />
    </x:sheets>
    <x:definedNames>
        <x:definedName name="Measures">Books!$C$4</x:definedName>
        <x:definedName name="_xlnm.Print_Area" localSheetId="0">PRINT!$A$1:$G$25</x:definedName>
    </x:definedNames>
    <x:calcPr calcId="152511" calcMode="manual" calcOnSave="0" />
    <x:oleSize ref="A1:G25" />
</x:workbook>

所以我会尝试最好的猜测。