我正在开发一个应用程序,可以使用OpenXML将一些数据导出到Excel文件中。除了自动筛选器之外,一切都运作正常。我的想法是在数据的主体部分添加自动筛选器,以便用户自动具有控制来过滤和排序数据。因此,在代码中,我要这样做:
var filter = new AutoFilter() { Reference = string.Format("{0}:{1}", topLeftCellReference, bottomRightCellReference ) };
worksheet.AppendChild(filter);
在导出的XLSX文件中,看起来大致如下:
<x:autoFilter ref="A4:L33" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main" />
它会被添加到工作表的sheetData
和mergeCells
之间。
然后我可以在Excel中打开这个筛选器,而且它也能正常工作。但是如果您尝试对一个列进行排序,该列将被排序,然后Excel会崩溃。保存并重新加载文件(这会强制Excel清理所有内容)无法解决问题。但是,如果您先应用筛选器(比如对某列进行筛选以选择大于10的值),然后再删除该筛选器,您现在就可以进行排序而不会崩溃。我在应用筛选器并删除它后保存了一个文件,现在那个文件很好用,但是查看“修复”后的文件的XML时,我没有看到任何明显的区别。
是否有人知道可能导致这个问题的原因呢?除了将其添加到工作表中之外,还有其他需要执行的操作吗?
注意:我们使用的是Excel 2010(版本14.0.7153.5000)
这里有一个文件示例(单击下载,它将下载为.zip文件。将其重命名为.xlsx以在Excel中打开。启用编辑,选择其中一列并尝试排序)。
编辑:继续尝试,如果您在Excel中重新保存该文件,则仍然无法正常工作。但是,如果您先应用筛选器(然后清除它),然后再在Excel中重新保存,您将获得一个有效的文件。仔细查看两个文件(仍然无法正常工作的重新保存的文件和现在有效的文件),我确实注意到在应用(并清除)筛选器后添加了这个额外的部分:
<x:definedNames>
<x:definedName name="_xlnm._FilterDatabase" localSheetId="0" hidden="1">'Sheet 1'!$A$1:$E$11</x:definedName>
</x:definedNames>
不确定那是否是什么重要的事情...
Font
上的一个Color
元素不正确 - 我有另一个答案提供了关于Color
的信息,但我怀疑它对这个问题没有帮助。我会看一下并尝试找出解决方法... - petelids