C# 添加自动筛选和排序会导致Excel崩溃

C# 添加自动筛选和排序会导致Excel崩溃,c#,excel,openxml,C#,Excel,Openxml,我正在开发一个应用程序,您可以使用OpenXML将一些数据导出到Excel文件。除了自动过滤器外,一切正常。其想法是在数据主体中添加一个自动过滤器,以便用户自动拥有过滤和排序数据的控件。在代码中,我做了如下操作: var filter = new AutoFilter() { Reference = string.Format("{0}:{1}", topLeftCellReference, bottomRightCellReference ) }; worksheet.AppendChild(

我正在开发一个应用程序,您可以使用OpenXML将一些数据导出到Excel文件。除了自动过滤器外,一切正常。其想法是在数据主体中添加一个自动过滤器,以便用户自动拥有过滤和排序数据的控件。在代码中,我做了如下操作:

var filter = new AutoFilter() { Reference = string.Format("{0}:{1}", topLeftCellReference, bottomRightCellReference ) };
worksheet.AppendChild(filter);
<x:autoFilter ref="A4:L33" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main" />
var filter = new AutoFilter() { Reference = string.Format("{0}:{1}", topLeftCellReference, bottomRightCellReference ) };
worksheet.AppendChild(filter);

workbookPart.Wookbook.DefinedNames.AppendChild(new DefinedName(string.Format("'{0}'!$A${1}:${2}${3}",
    sheet.Name,
    leftColumnLetter,
    topRowIndex,
    rightColumnLetter,
    bottomRowIndex))
{
    Name = "_xlnm._FilterDatabase",
    LocalSheetId = sheet.SheetId - 1,
    Hidden = true
});
在导出的XLSX中,它显示如下所示:

var filter = new AutoFilter() { Reference = string.Format("{0}:{1}", topLeftCellReference, bottomRightCellReference ) };
worksheet.AppendChild(filter);
<x:autoFilter ref="A4:L33" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main" />
var filter = new AutoFilter() { Reference = string.Format("{0}:{1}", topLeftCellReference, bottomRightCellReference ) };
worksheet.AppendChild(filter);

workbookPart.Wookbook.DefinedNames.AppendChild(new DefinedName(string.Format("'{0}'!$A${1}:${2}${3}",
    sheet.Name,
    leftColumnLetter,
    topRowIndex,
    rightColumnLetter,
    bottomRowIndex))
{
    Name = "_xlnm._FilterDatabase",
    LocalSheetId = sheet.SheetId - 1,
    Hidden = true
});

不确定这是否是什么…

好的,所以这里的神奇公式似乎是按照我在编辑中的建议添加
DefinedNames
部分:

<x:definedName name="_xlnm._FilterDatabase" localSheetId="0" hidden="1">'Sheet 1'!$A$1:$E$11</x:definedName>

这看起来好像是在解决Excel中的一个bug。Excel应该在排序之前检查名称是否已定义,并在需要时自动创建它(如果您进行筛选而不是排序,它似乎会这样做)。

@mason:OpenXML允许您始终创建无效的Excel文件。因为有效Excel文件的规则比有效OpenXML文件的规则更严格(并且完全没有文档化)(例如,标准中没有任何内容规定
工作表
下的子项顺序,但Excel对某些子项的显示位置非常挑剔)。通常,当您第一次打开文件时,Excel会发出抱怨(带有一条毫无帮助的错误消息)。但是这个文件打开得很好,只有在尝试对列进行排序时,问题才会弹出。元素的顺序看起来是正确的(请参阅my以获取顺序文档)。生产力工具报告的唯一问题是
Font
上的
Color
元素之一不正确-我有关于
Color
s的信息,但我怀疑它是否有助于解决此问题。我会看一看,看看能不能找出什么来…@petelids:谢谢你看一看,谢谢你提醒我订单的具体位置。我没有意识到这一点,它可以帮我省去很多悲伤。@petelids:我解决了颜色问题(再次感谢您提醒),但正如您所怀疑的,它没有任何区别。如果您替换
工作表。AppendChild(过滤器)带有
工作表。追加(筛选),您有什么变化吗?非常感谢!在尝试增强ExcelBuilder库时,我在javascript中生成Excel时遇到了同样的问题。成功了!