如何使用C#自动化在Excel中冻结顶部行并应用筛选器

49

我有自动化程序,可以在C#中创建Excel文档。 我正在尝试冻结工作表的顶部行并应用筛选器。 这与Excel 2010中选择“查看>冻结窗格>冻结顶部行”,然后在选择顶部行后选择“数据>筛选器”相同。 我不知道如何应用筛选器,但以下是我尝试冻结顶部行的方法,它只是冻结了整个工作表。 有没有人能解决我的问题? 数据筛选问题是我需要更多帮助的地方,如果有人有解决方案,请告诉我。

非常感谢, KBP

        workSheet.Activate();
        Excel.Range firstRow = (Excel.Range)workSheet.Rows[1];
        firstRow.Activate();
        firstRow.Select();
        firstRow.Application.ActiveWindow.FreezePanes = true;
5个回答

74

我想通了!

@Jaime的冻结顶部行的解决方案完美地运行。以下是我的解决方案,用于应用筛选器:

谢谢, KBP

// Fix first row
workSheet.Activate();
workSheet.Application.ActiveWindow.SplitRow = 1;
workSheet.Application.ActiveWindow.FreezePanes = true;
// Now apply autofilter
Excel.Range firstRow = (Excel.Range)workSheet.Rows[1];
firstRow.AutoFilter(1, 
                    Type.Missing, 
                    Excel.XlAutoFilterOperator.xlAnd, 
                    Type.Missing, 
                    true);

1
我后来发现这个操作不需要使用 firstRow.Activate(); 和 firstRow.Select();。 - KBP
1
太好了。不要忘记接受一个答案。即使是你自己的答案 ;-) 这样其他人在遇到这个问题时就更清楚了。 - Koen
我一直在寻找一种以编程方式打开自动筛选的方法,并且不向AutoFilter()方法传递参数...使用以下内容可以正常工作。谢谢 worksheet.UsedRange.AutoFilter(1, Type.Missing, Excel.XlAutoFilterOperator.xlAnd, Type.Missing, true); - user2163049

38

尝试这个...

workSheet.Activate();
workSheet.Application.ActiveWindow.SplitRow = 1;
workSheet.Application.ActiveWindow.FreezePanes = true;

那个可以用于冻结顶部行,但我仍然不知道如何应用过滤器。谢谢,Jaime。 - KBP
1
不知道怎么做,抱歉。也许在Excel中录制宏并手动操作会有所帮助... - Jaime Oro

7
workSheet.EnableAutoFilter = true; 
workSheet.Cells.AutoFilter(1); 

//Set the header-row bold
workSheet.Range["A1", "A1"].EntireRow.Font.Bold = true;  

//Adjust all columns
workSheet.Columns.AutoFit(); 

在参数中可能需要传递一些System.Reflection.Missing.Value,但这是我从VB.Net代码中转换出来的。


1
你的解决方案正是我所需要的。谢谢。 要为每一列添加筛选器,您可以使用与设置标题文本为粗体相同的语法:worksheet.Range["A1","A1"].EntireRow.AutoFilter(1); - Smitty-Werben-Jager-Manjenson

3
以下解决方案运行良好,但会冻结当前可见快照的第一行。例如:如果您当前的工作表可见快照来自第43行,则冻结行将应用于第43行。
如果您只想冻结工作表的第一行(标题行),无论Excel滚动位置如何,以下解决方案适用于我。此代码将Excel表格向上滚动到第1行。如果您想在冻结之前返回到以前的位置,则必须存储该位置。
worksheet.Application.ActiveWindow.ScrollRow = 1;
worksheet.Application.ActiveWindow.SplitRow = 1;
worksheet.Application.ActiveWindow.FreezePanes = true; 

1
ScrollRow提示最终非常有用。否则,即使您将SplitRow指定为1,它也会按照可见的第一行进行拆分,这是一个很大的问题。滚动到位置1,然后再按1拆分就可以解决了!谢谢啦! - Onur Omer

2

//Excel文件所在路径 string ResultsFilePath = @"C:\Users\krakhil\Desktop\FolderName\FileNameWithoutExtension";

注:此代码段是用于指定Excel文件的路径。请确保文件路径正确,否则代码将无法找到该文件。
        Excel.Application ExcelApp = new Excel.Application();
        Excel.Workbook ExcelWorkbook = ExcelApp.Workbooks.Open(ResultsFilePath);
        ExcelApp.Visible = true;

        //Looping through all available sheets
        foreach (Excel.Worksheet ExcelWorksheet in ExcelWorkbook.Sheets)
        {                
            //Selecting the worksheet where we want to perform action
            ExcelWorksheet.Select(Type.Missing);

            //Making sure first row is selected - else split and freeze will happen
            //On the visible part and not from the top
            Excel.Range activeCell = ExcelWorksheet.Cells[1, 1];
            activeCell.Select();

            //Applying auto filter to Row 10
            activeCell = (Excel.Range)ExcelWorksheet.Rows[10];
            activeCell.AutoFilter(1,
                Type.Missing,
                Excel.XlAutoFilterOperator.xlAnd,
                Type.Missing,
                true);

            //Split the pane and freeze it
            ExcelWorksheet.Application.ActiveWindow.SplitRow = 10;
            ExcelWorksheet.Application.ActiveWindow.FreezePanes = true;

            //Auto fit all columns
            ExcelWorksheet.Columns.AutoFit();

            //Releasing range object
            Marshal.FinalReleaseComObject(activeCell);
        }

        //saving excel file using Interop
        ExcelWorkbook.Save();

        //closing file and releasing resources
        ExcelWorkbook.Close(Type.Missing, Type.Missing, Type.Missing);
        Marshal.FinalReleaseComObject(ExcelWorkbook);
        ExcelApp.Quit();
        Marshal.FinalReleaseComObject(ExcelApp);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接