2015-10-12 6 views
14

OpenXMLを使用してExcelファイルにデータを書き出すことができるアプリケーションを開発しています。オートフィルタ以外はすべて正常に動作しています。この考え方は、データの本体にオートフィルタを追加して、ユーザが自動的にデータをフィルタリングおよびソートするコントロールを持つようにすることです。だから、コードの中で、私はこのような何か:エクスポートXLSXでオートフィルタと並べ替えを追加すると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" /> 

をそして、それはsheetDatamergeCells間のワークシートに追加されます。

このフィルタをExcelで開いても問題ありません。列をソートしようとすると、列がソートされ、Excelがクラッシュすることが予想されます。ファイルを保存して再ロードすると(Excelにすべてのファイルがクリーンアップされます)、問題は解決されません。しかし、最初にフィルタを適用した場合(たとえば、カラムを> 10にフィルタリングしてフィルタを削除しても、クラッシュせずに並べ替えることができます)フィルタを適用して削除したファイルを保存しました。

問題を引き起こす可能性のあることは誰でも知っていますか?他にも、自動フィルタを適用したときに行うべきことはありますか?ワークシートに追加

注:?私たちは、エクセル2010を使用している。(バージョン14.0.7153.5000)ここで

する例fileます(ダウンロードをクリックして、それはとしてダウンロードします。 .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> 

わからない:近い二つのファイル(まだ壊れて保存し直したファイルと、今作業ファイル)を見て、私は、フィルタが適用される(およびクリア)された後、この余分なビットは、ブックに追加気づくん...

+0

@mason:OpenXMLでは、無効なExcelファイルを常に作成できます。有効なExcelファイルのルールは、有効なOpenXMLファイルのルールよりも厳しく(完全に文書化されていない)ため(例えば、標準では 'worksheet'の子の順序は決まっていませんが、Excelは特定の子表示されるはずです)。通常Excelはファイルを最初に開いたときに(非常に役に立たないエラーメッセージで)苦情を言います。しかし、このファイルは正常に開き、列をソートしようとすると問題が表示されるだけです。 –

+0

要素の順序が正しいように見えます(注文ドキュメントについては、my [autoFilter answer here](http://stackoverflow.com/a/25410242/3791802)を参照してください)。 Productivityツールで報告される唯一の問題は、 'Font'の' Color'要素の1つが間違っていることです - 私は[別の答え]を持っています(http://stackoverflow.com/questions/29989234/change-sheet-tab-color -of-excel-file-using-open-xml/29991215#29991215)は 'Color'sに関する情報を持っていますが、この問題に役立つかどうかは疑問です。私は見て、何かを見つけ出すことができるかどうかを見てみましょう... – petelids

+0

@petelids:注文を実際に指定した場所を見ていただきありがとうございます。私はそれがそこにあることを認識していなかったし、それは私に多くの悲しみを救うことができた。 –

答えて

4

[OK]を何かかではないこと、私が私の編集で示唆されているように、ここで魔法の公式はDefinedNamesパーツを追加することであると思われるかもしれません:

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

どうやら_xlmn._FilterDatabaseがにオートフィルタのために必要とされています仕事(少なくともソートのために)。私はあなたがフィルタリングするときにそこにないと思う、それは作成されますが、あなたが並べ替えるときにそこになければ、Excelを吹き飛ばします。

だから、あなたはそれを埋めるためにシート名とセル参照を必要とする

オープンXML標準を通じて見ると、definedNameのセクション18.2.5で、私はこれを参照してください。

フィルター&高度をフィルタ

_xlnm .Criteria:この定義された名前は、範囲のデータに高度なフィルタを適用する際に使用される基準値 を含む範囲を参照します。

_xlnmは._FilterDatabase:以下

のいずれかになります。この定義された名前は、高度なフィルタが適用された範囲を指します が適用されます。これはフィルタリングされていないソースデータ範囲を表します。

B。この定義された名前は、オートフィルタが適用された範囲を指します 。

だから、あなたが(1枚の用紙に複数のフィルタを持ってする方法はありません表示されます)フィルタを持つすべてのシートのため_xlnm._FilterDatabaseを追加する必要があると思われます。私は名前とlocalSheetIdの組み合わせだけが一意である必要があると思うので、名前は同じくらい_xlmn_FilterDatabaseです。それはExcelでバグを中心に働いているようにこれは思えない

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 
}); 

だから最後に、私はこのような何かを持っています。 Excelでは、ソート前に名前が定義されているかどうかをチェックし、必要に応じて自動的に名前を作成する必要があります(ソートではなくフィルタリングすると表示されます)。

+0

ありがとう!私はExcelBuilderライブラリを拡張しようとしているときにJavaScriptをExcelに生成する際に同じ問題がありました。それはトリックでした! – nbeuchat

関連する問題