簡體   English   中英

如何在 EPPlus 中使用 C# 刪除自動過濾器

[英]How to remove AutoFilter Using C# in EPPlus

我嘗試了以下C# 編碼:

wsDt.Cells["A10:G10"].AutoFilter = false;

但過濾器並沒有從我的 excel 中刪除。

任何其他方式來刪除它。

謝謝...

在Excel中,當您使用Format as Table選項時,它不僅會設置數據樣式,還會創建命名范圍 - 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; 

這似乎是一個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++;
    }
}

如果使用LoadFromCollection()調用填充Excel數據。 然后,您可以使用默認的Excel表名“表1”來引用它。

這與Patricks的回答相同,但演示了沒有DataTable的用法。

excelWorksheet.Cells.LoadFromCollection(myCollection);
ExcelTable table = excelWorksheet.Tables["Table1"];
table.ShowFilter = false;

有時 excel 將表創建為命名范圍。 在我的例子中,表格是第一個工作表中唯一的東西,所以以下幫助了我:

var ws = wb.Worksheets.First();
ws.NamedRanges.FirstOrDefault()?.Ranges.FirstOrDefault()?.SetAutoFilter(false);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM