如何在EPPlus中使用C#删除AutoFilter

Joe*_*ike 6 c# asp.net excel epplus

我试过下面的C#CODING:

wsDt.Cells["A10:G10"].AutoFilter = false;
Run Code Online (Sandbox Code Playgroud)

但是我的Excel中没有删除过滤器.

任何其他方式来删除它.

谢谢...

小智 6

在 Excel 中,当您使用“格式为表”选项时,它不仅会设置数据样式,还会创建一个命名范围 - Table1。此选项还会自动启用过滤器按钮。格式化为表格后,您可以在“表格工具”->“表格样式选项”中取消选中“过滤器按钮”。

对我有用的是以编程方式做同样的事情。

  1. LoadFromDataTable(DataTable, bool, TableStyles) 基本上
    • 从 ExcelRange 开始将数据粘贴到工作表
    • 应用表格格式
    • 使用 DataTable.TableName 来命名范围
    • 启用过滤器按钮
  2. 禁用过滤器按钮

    • 使用 DataTable.TableName 引用命名范围
    • 将 ShowFilter 设置为 false 在此处输入代码

      //imagine a table with 5 columns
      DataTable dt = new DataTable();
      dt.TableName = "UniqueTableName";
      
      //define the cells where the headers will appear
      int topRow = 1;
      int leftMostColumn = 1;
      int rightMostColumn = 5;
      
      //bind the DataTable using LoadFromDataTable()
      OfficeOpenXml.ExcelRange excelRange = worksheet.Cells[topRow, leftMostColumn, topRow, rightMostColumn];
      excelRange.LoadFromDataTable(dt, true, OfficeOpenXml.Table.TableStyles.Light8);
      
      //turn of the filtering
      OfficeOpenXml.Table.ExcelTable table = worksheet.Tables[dt.TableName];
      table.ShowFilter = false;
      
      Run Code Online (Sandbox Code Playgroud)


GDB*_*GDB 1

这似乎是一个 EPPlus 错误,我认为从最新版本(4.04)开始它还没有得到解决,至少我可以找到解决方案。我的解决方法是简单地使用循环一次加载电子表格值:

int sheetRow = 3;
for (int outer = 0; outer < outerSourceTable.Rows.Count; outer++)
{
    var outerThingId = Convert.ToInt32(outerSourceTable.Rows[outer]["OuterThingId"]);
    var outerThingName = Convert.ToString(outerSourceTable.Rows[outer]["OuterThing"]);
    var innerThingsTable = _repository.GetInnerThings(outerThingId);
    if (innerThingsTable.Rows.Count > 0)
    {
        myWorksheet.Cells[sheetRow, 1].Value = outerThingName;

        // Load the data into the worksheet. We need to load a row at a time
        // to avoid the auto-filter bug
        for (int inner = 0; inner < innerThingsTable.Rows.Count; inner++)
        {
            var innerName = Convert.ToString(innerThingsTable.Rows[inner]["Name"]);
            var innerDescr = Convert.ToString(innerThingsTable.Rows[inner]["Description"]);
            myWorksheet.Cells[sheetRow, 2].Value = innerName;
            myWorksheet.Cells[sheetRow, 3].Value = innerDescr;
            sheetRow++;
        }
        sheetRow++;
    }
}
Run Code Online (Sandbox Code Playgroud)