5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

NPOIを使用したExcelのオートフィルタ機能のバグ

Last updated at Posted at 2018-08-01

概要

 エクセルファイルをオートフィルタ機能を掛けた状態で保存し、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)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

参考サイト:https://stackoverflow.com/questions/38178326/how-to-convert-isheet-to-ct-worksheet-in-c-sharp-using-npoi-xssf

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クラスにオートフィルタに関する情報が格納されるみたい。

皆さんの参考になれば幸いです

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?