C#。擅长。需要以编程方式在控制台应用程序中打开的电子表格上重新应用筛选器
我有一个使用Microsoft.Office.Interop.Excel引用的C#console应用程序。应用程序将打开Excel电子表格,写入其中,保护工作表,保存并关闭Excel。这一切都有效 电子表格在一张工作表的某个部分上有一个过滤器。我需要应用程序在写入数据后自动重新应用过滤器 我尝试使用C#。擅长。需要以编程方式在控制台应用程序中打开的电子表格上重新应用筛选器,c#,excel,console,autofilter,C#,Excel,Console,Autofilter,我有一个使用Microsoft.Office.Interop.Excel引用的C#console应用程序。应用程序将打开Excel电子表格,写入其中,保护工作表,保存并关闭Excel。这一切都有效 电子表格在一张工作表的某个部分上有一个过滤器。我需要应用程序在写入数据后自动重新应用过滤器 我尝试使用工作表.AutoFilter.ApplyFilter()。这会导致 未处理的异常 …但它确实以某种形式起作用 // The two lines of code below cause the unha
工作表.AutoFilter.ApplyFilter()
。这会导致
未处理的异常
…但它确实以某种形式起作用
// The two lines of code below cause the unhandled exception
// in a console app but not in a form app.
// Refresh the filter programmatically
Excel.Worksheet ceSheet = Globals.xlApp.Worksheets["FAW Summary"];
ceSheet.AutoFilter.ApplyFilter();
我还尝试使用SendKeys.Send
和ApplicationContext
类来发送执行重新应用的Ctrl-Alt-L组合键。这不会给我一个错误,但在控制台应用程序中运行时,它也不会做任何事情
// Refresh the filter with SendKeys
if (!Globals.interactiveMode) Application.Run(new AGMDataExtractConsoleContext());
AGMDataExtractConsoleContext
是一个类型为ApplicationContext
的类。它应该从控制台运行应用程序,然后使用SendKeys向其传递击键。从MSDN文档中发送,工作表
界面没有AutoFilter属性。您需要迭代工作簿中的所有工作表
,并调用。
请注意,如果工作表中不存在筛选器,AutoFilter
将具有null
值
我为此创建了一个简单的扩展:
public static class WorksheetExtensions
{
public static void ReapplyFilters(this Sheets sheets)
{
if (sheets == null) return;
var c = sheets.Count;
for (var i = 1; i <= c; i++)
{
try
{
var sh = sheets[i];
if (sh.AutoFilter != null)
sh.AutoFilter.ApplyFilter();
}
catch (Exception e)
{
// some log
}
}
}
}
公共静态类工作表文本
{
公共静态无效过滤器(本页)
{
如果(张数==null)返回;
var c=张数;
对于(var i=1;i)什么导致了未处理的异常?您的帖子中不清楚哪些有效,哪些无效。我在代码块中添加了更多注释以显示错误发生的位置。我希望这能有所帮助。