using System; using System.Collections.Generic; using System.Text; using HH.WMS.Utils.NPOI.HSSF.Record.AutoFilter; using HH.WMS.Utils.NPOI.SS.Formula; using HH.WMS.Utils.NPOI.HSSF.Model; using HH.WMS.Utils.NPOI.HSSF.Record; using HH.WMS.Utils.NPOI.SS.Formula.PTG; using HH.WMS.Utils.NPOI.SS.UserModel; namespace HH.WMS.Utils.NPOI.HSSF.UserModel { public class HSSFAutoFilter : IAutoFilter { // fix warning CS0649: Field 'autofilterinfo' is never assigned to, and will always have its default value null // AutoFilterInfoRecord autofilterinfo; // fix warning CS0169 "never used": AutoFilterRecord autofilter; FilterModeRecord filtermode; private HSSFSheet _sheet; public HSSFAutoFilter(HSSFSheet sheet) { _sheet = sheet; } public HSSFAutoFilter(string formula,HSSFWorkbook workbook) { //this.workbook = workbook; Ptg[] ptgs = HSSFFormulaParser.Parse(formula, workbook); if (!(ptgs[0] is Area3DPtg)) throw new ArgumentException("incorrect formula"); Area3DPtg ptg = (Area3DPtg)ptgs[0]; HSSFSheet sheet = (HSSFSheet)workbook.GetSheetAt(ptg.ExternSheetIndex); //look for the prior record int loc = sheet.Sheet.FindFirstRecordLocBySid(DefaultColWidthRecord.sid) ; CreateFilterModeRecord(sheet, loc+1); CreateAutoFilterInfoRecord(sheet, loc + 2,ptg); //look for "_FilterDatabase" NameRecord of the sheet NameRecord name = workbook.Workbook.GetSpecificBuiltinRecord(NameRecord.BUILTIN_FILTER_DB, ptg.ExternSheetIndex+1); if (name == null) name = workbook.Workbook.CreateBuiltInName(NameRecord.BUILTIN_FILTER_DB, ptg.ExternSheetIndex + 1); name.IsHiddenName = true; name.NameDefinition = ptgs; } private void CreateFilterModeRecord(HSSFSheet sheet,int insertPos) { //look for the FilterModeRecord HH.WMS.Utils.NPOI.HSSF.Record.Record record = sheet.Sheet.FindFirstRecordBySid(FilterModeRecord.sid); // this local variable hides the class one: FilterModeRecord filtermode; //if not found, add a new one if (record == null) { filtermode = new FilterModeRecord(); sheet.Sheet.Records.Insert(insertPos, filtermode); } } private void CreateAutoFilterInfoRecord(HSSFSheet sheet, int insertPos, Area3DPtg ptg) { //look for the AutoFilterInfo Record HH.WMS.Utils.NPOI.HSSF.Record.Record record = sheet.Sheet.FindFirstRecordBySid(AutoFilterInfoRecord.sid); AutoFilterInfoRecord info; if (record == null) { info = new AutoFilterInfoRecord(); sheet.Sheet.Records.Insert(insertPos, info); } else { info = record as AutoFilterInfoRecord; } info.NumEntries = (short)(ptg.LastColumn - ptg.FirstColumn + 1); } private void RemoveFilterModeRecord(HSSFSheet sheet) { if(filtermode!=null) sheet.Sheet.Records.Remove(filtermode); } // fix warning autofilterinfo "is never assigned": //private void RemoveAutoFilterInfoRecord(HSSFSheet sheet) //{ // if (autofilterinfo != null) // sheet.Sheet.Records.Remove(autofilterinfo); //} } }