OpenXml:工作表子元素在排序中更改导致损坏的文件

mar*_*ner 7 c# openxml openxml-sdk

我正在尝试使用openxml来生成自动excel文件.我面临的一个问题是使用excel的开放式xml对象模型来容纳我的对象模型.我必须明白我为工作表添加子元素的顺序很重要.

例如:

workSheet.Append(sheetViews);
workSheet.Append(columns);
workSheet.Append(sheetData);
workSheet.Append(mergeCells);
workSheet.Append(drawing);
Run Code Online (Sandbox Code Playgroud)

上面的排序不会给出任何错误.

但是以下内容:

workSheet.Append(sheetViews);
workSheet.Append(columns);
workSheet.Append(sheetData);
workSheet.Append(drawing);
workSheet.Append(mergeCells);
Run Code Online (Sandbox Code Playgroud)

给出错误

所以这不允许我随时创建一个绘图对象并将其附加到工作表中.这迫使我在使用它们之前创建这些元素.

谁能告诉我,我是否正确理解了这个问题?因为我相信我们应该能够打开任何excel文件,必要时为工作表创建一个新的子元素并附加它.但现在这可能会破坏这些元素应该被追加的顺序.

谢谢.

Joe*_*tti 8

根据标准ECMA-376 Office Open XML文件格式,CT_Worksheet具有所需的顺序:

CT_Worksheet架构图

以下是崩溃的原因:

workSheet.Append(sheetViews);
workSheet.Append(columns);
workSheet.Append(sheetData);
workSheet.Append(drawing);
workSheet.Append(mergeCells);
Run Code Online (Sandbox Code Playgroud)

是因为你drawing 以前 mergeCells.只要你追加你的mergeCells 后代 drawing,你的代码应该可以正常工作.

注意:您可以在ECMA-376第3版第1部分(.zip) - > OfficeOpenXML-XMLSchema-Strict - > sml.xsd中找到完整的XSD .