【问题标题】:EPPlus autofilter only working on last cellEPPlus 自动过滤器仅适用于最后一个单元格
【发布时间】:2022-01-19 17:45:42
【问题描述】:

我希望标题中的每个单元格都包含一个自动过滤器。下面是我尝试使用的代码,但是 autofilter 仅在指定的最后一个单元格上设置。

例如,如果我注释掉K1autofilter 命令,则会创建电子表格,其中C1 是唯一具有自动过滤器的单元格。

        //Headers
        ws.Cells["A1"].Value = "ChannelCode";
        ws.Cells["A1"].AutoFilter = true;
        ws.Cells["B1"].Value = "DrmTerrDesc";
        ws.Cells["B1"].AutoFilter = true;
        ws.Cells["C1"].Value = "IndDistrnId";
        ws.Cells["C1"].AutoFilter = true;
        ws.Cells["D1"].Value = "StateCode";
        ws.Cells["D1"].AutoFilter = true;
        ws.Cells["E1"].Value = "ZipCode";
        ws.Cells["E1"].AutoFilter = true;
        ws.Cells["F1"].Value = "EndDate";
        ws.Cells["F1"].AutoFilter = true;
        ws.Cells["G1"].Value = "EffectiveDate";
        ws.Cells["G1"].AutoFilter = true;
        ws.Cells["H1"].Value = "LastUpdateId";
        ws.Cells["H1"].AutoFilter = true;
        ws.Cells["I1"].Value = "ErrorCodes";
        ws.Cells["I1"].AutoFilter = true;
        ws.Cells["J1"].Value = "Status";
        ws.Cells["J1"].AutoFilter = true;
        ws.Cells["K1"].Value = "Id";
        ws.Cells["K1"].AutoFilter = true;

【问题讨论】:

    标签: c# .net excel epplus


    【解决方案1】:

    EPPlus .AutoFilter 有点问题...我建议使用这样的范围:

    ws.Cells["A1:K1"].AutoFilter = true;
    

    【讨论】:

      【解决方案2】:

      对于所有工作表数据范围

      worksheet.Cells[worksheet.Dimension.Address].AutoFilter=true;
      

      【讨论】:

        【解决方案3】:

        如果您有一组动态的列,或者它们是在数组或列表中定义的:

        string[] columns = new string[] { "Name", "City", "Street" };
        
        worksheet.Cells[1, 1, 1, columns.Length].AutoFilter = true;
        

        使用的重载如下:

        public ExcelRange this[int FromRow, int FromCol, int ToRow, int ToCol] { get; }
        

        我个人更喜欢这样,而不是将整数 (columns.Length) 转换为带有字符的 Excel 范围(例如“A1:C1”)。

        【讨论】:

          【解决方案4】:

          如果你尝试做这样的事情:

          var colNames = new List<string>() { "MyCol1", "MyCol2", "MyCol3" };
          var row = 3;
          var startCol = 5;
          var lastCol = startCol + colNames.Count - 1;
           var i = startCol; // col index
          
          foreach (var colName in colNames)
          {
             sheetObj.Cells[row, i].Value = colName;
             sheetObj.Cells[row, i++].AutoFilter= true;
          }
          

          ...它不会起作用,因为在我看来,.AutoFilter 的实现中存在错误行为。 即使这样也行不通:

          foreach (var colName in colNames)
             sheetObj.Cells[row, i++].Value = colName;
          
          using ExcelRange range = sheetObj.Cells[row, startCol, row, lastCol];
          range.AutoFilter = true;
          

          所以我发现它对我有用的是:

          foreach (var colName in colNames)
              sheetObj.Cells[row, i++].Value = colName;
          
          sheetObj.Cells[row, startCol, row, lastCol].AutoFilter = true;
          

          如果您想对单元格进行其他设置,您可以这样做:

          var colNames = new List<string>() { "MyCol1", "MyCol2", "MyCol3" };
          var row = 3;
          var startCol = 5;
          var lastCol = startCol + colNames.Count - 1;
          var i = startCol; // col index
          
          foreach (var colName in colNames)
              sheetObj.Cells[row, i++].Value = colName;
          
          using ExcelRange range = sheetObj.Cells[row, startCol, row, lastCol];
          range.Style.Font.Size = 16;
          range.Style.Font.Color.SetColor(Color.Red);
          range.AutoFitColumns();
          range.Style.Font.Bold = true;
          range.Style.Fill.PatternType = ExcelFillStyle.Solid;
          range.Style.Fill.BackgroundColor.SetColor(Color.LightBlue);
          
          sheetObj.Cells[row, startCol, row, lastCol].AutoFilter = true;
          

          【讨论】:

            猜你喜欢
            • 2014-02-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多