概要
エクセルファイルをオートフィルタ機能を掛けた状態で保存し、NPOIを用いて保存処理を実行すると
クラッシュする。
なぜクラッシュするのかは一旦置いといて、xls,xlsx形式の両方でオートフィルタが掛かっているかを
調べる方法を調査した。
調査結果
xlsx形式
オートフィルタを適用しているかどうかはCT_Worksheetクラス内のfilterColumn.Countで判断できる。
MethodInfo methodInfo = sheet.GetType().GetMethod("GetCTWorksheet", BindingFlags.NonPublic |
BindingFlags.Instance);
if (methodInfo != null)
{ //XSSFの場合
var ct = (CT_Worksheet)methodInfo.Invoke(sheet, new object[] { });
if (ct.autoFilter.filterColumn.Count != 0)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
xls形式
xlsx形式とは異なり、CT_Worksheetクラスが取得できない。
参考サイト:http://apache-poi.1045710.n5.nabble.com/Detect-or-remove-auto-filter-td5728276.html
代わりに、AutoFilterRecordクラスを用いて、オートフィルタが掛かっているかを判断する。
参考サイト:http://interoperability.blob.core.windows.net/files/MS-XLS/[MS-XLS].pdf
HSSFSheet hSheet = (HSSFSheet)sheet;
NPOI.HSSF.Record.Record record = hSheet.Sheet.FindFirstRecordBySid(AutoFilterRecord.sid);
if (record != null)
{
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AutoFilterRecordクラスにオートフィルタに関する情報が格納されるみたい。
皆さんの参考になれば幸いです