简体   繁体   English

Excel OpenXml Workbook类中xmlelements的特定顺序

[英]Specific order of xmlelements in Excel OpenXml Workbook class

I create PowerPoint presentations via OpenXml. 我通过OpenXml创建PowerPoint演示文稿。 The slides of the presentations are enriched with embedded objects. 演示的幻灯片中充斥着嵌入式对象。 Typically Excel documents are embedded. 通常,Excel文档是嵌入的。 Beside having the image and the document prepared for embedding, Excel needs another information which area shall be shown to the user when the document is opened in PowerPoint. 除了准备好要嵌入的图像和文档之外,Excel还需要其他信息,以便在PowerPoint中打开文档时应向用户显示哪个区域。

This information can be added to the Excel workbook by adding OleSize class to the workbook part. 通过将OleSize类添加到工作簿部件,可以将该信息添加到Excel工作簿。 Please ignore that this code doesn't check for existance of that fragment which would certainly lead to an issue. 请忽略此代码不检查该片段是否存在,这肯定会导致问题。 This is just a simple example. 这只是一个简单的例子。

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

When just added to the end of the list of OpenXmlElements of the workbook class, Excel will show an error message dialog saying that the file is corrupt, it is not repairable. 当仅将其添加到工作簿类的OpenXmlElements列表的末尾时,Excel将显示错误消息对话框,指出文件已损坏,无法修复。 Putting this element directly after PivotCache OpenXmlElement does work as a workaround. 将这个元素直接放在PivotCache OpenXmlElement之后确实可以解决。 Now I experienced that Excel also raises that message when the OpenXmlElement is available before OleSize. 现在我体验到,当OpenXmlElement在OleSize之前可用时,Excel也会引发该消息。

I cannot find any information about the necessity of an order of OpenXmlElements for that specific class. 我找不到有关该特定类需要订购OpenXmlElements的任何信息。

Any hint is highly appreciated. 任何提示高度赞赏。

You're right about the order you list in your answer. 您对答案中列出的顺序是正确的。 In the OpenXML Specification document that you refer to there is an XSD (page 3936) for the Workbook which shows that the order is indeed mandatory as it's defined as a Sequence : 在您参考的OpenXML规范文档中, Workbook有一个XSD(第3936页),其中显示该订单确实是强制性的,因为它被定义为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>

If you're interested, I have an answer here which shows one way of adding items into the correct place in the file. 如果您有兴趣,我在这里有一个答案它显示了一种将项目添加到文件中正确位置的方法。

After digging deep into OpenXml specification, 4th edition, I found this information: 在深入研究第4版OpenXml规范之后,我发现了以下信息:

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 }?

There is no information if this is the garantueed or expected order, but with just a few tests it looks promising (workbook openxml fragment from one of the test workbooks I checked for that order) 没有信息表明这是授权订单还是预期订单,但是仅进行了几次测试就显得很有希望(我为该订单检查的测试工作簿之一的工作簿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>

So I'll give the best guess a try. 因此,我将尝试最好的猜测。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM