c# - OpenXml:工作表子元素的顺序更改导致文件损坏

标签 c# openxml openxml-sdk

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

例如:

workSheet.Append(sheetViews);
workSheet.Append(columns);
workSheet.Append(sheetData);
workSheet.Append(mergeCells);
workSheet.Append(drawing);

上面的顺序没有给出任何错误。

但是以下内容:

workSheet.Append(sheetViews);
workSheet.Append(columns);
workSheet.Append(sheetData);
workSheet.Append(drawing);
workSheet.Append(mergeCells);

报错

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

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

谢谢。

最佳答案

根据Standard ECMA-376 Office Open XML File Formats , CT_Worksheet 有一个必需的序列:

CT_Worksheet Schema Diagram

以下崩溃的原因:

workSheet.Append(sheetViews);
workSheet.Append(columns);
workSheet.Append(sheetData);
workSheet.Append(drawing);
workSheet.Append(mergeCells);

是因为你有drawing before mergeCells。只要您在mergeCells drawing 之后附加您的代码,您的代码就应该可以正常工作。

注意:您可以在 ECMA-376 3rd edition Part 1 (.zip) 中找到完整的 XSD -> OfficeOpenXML-XMLSchema-Strict -> sml.xsd。

关于c# - OpenXml:工作表子元素的顺序更改导致文件损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11786891/

相关文章:

c# - 在 ASP.NET MVC 3 中初始化一个空白的 dbSet

c# - 此代码会导致托管堆损坏吗?

c# - 未达到 await 语句后的代码

c# - OLE DB 与 OPEN XML SDK 与 Excel.interop

vba - DrawingML 颜色中的 lumMod/lumOff 和 Tint/shade 之间有什么区别?

asp.net - 无法在 OpenXMl Cell 样式中使用多种字体

excel-2007 - 如何通过 OpenXML sdk 将 excel 2007 文档方向更改为横向

c# - 在 C# 的 OpenXml SDK 中使用 MergeField FieldCodes 时,为什么字段代码会消失或碎片化?

c# - OpenXML - 行以错误的顺序写出,导致数据丢失

c# - 具有简单关系的 MVC 5 Code First 脚手架