"无法设置Window类的FreezePanes属性"Excel 2016(office 365)

Den*_*der 7 c# excel office365 excel-2016

我已经构建了一个excel插件,用数据库中的数据填充工作表.我还添加了一些样式并使用FreezePanes锁定一些行和列.

worksheet.Activate();
worksheet.Application.ActiveWindow.FreezePanes = false;
worksheet.Application.ActiveWindow.SplitRow = 4;
worksheet.Application.ActiveWindow.SplitColumn = 11;
worksheet.Application.ActiveWindow.FreezePanes = true;
Run Code Online (Sandbox Code Playgroud)

这一切都像excel 2010/2013中的魅力一样,但我最近切换到excel 2016(办公室365),从那时起,当我的excel工作表不在前台时,我遇到了FreezePanes的问题.我搜索了互联网,我遇到的唯一事情就是我只能在活动表上预制FreezePanes,我知道 - 我已经在设置FreezePanes之前激活了表单.这在excel 2010中有效,尽管物理上我的excel没有被发送到前台.

来自办公室365的Excel可能真的希望我的excel工作表在物理上处于前台但worksheet.Activate()没有帮助,我也尝试了以下代码:

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);    

[DllImport("user32.dll", SetLastError = true)]
static extern System.IntPtr FindWindow(string lpClassName, string lpWindowName); 

string caption = oExcel.Caption;
IntPtr handler = FindWindow(null, caption);
SetForegroundWindow(handler);
Run Code Online (Sandbox Code Playgroud)

但这也行不通.任何人都可以帮我这个吗?

需要说明的是:我的excel版本是2016版本1611(Build 7571.2109)

Xat*_*too 6

是否有可能worksheet.Application.ActiveWindow不是包含活动工作表的窗口?在以前的 Excel 版本中,所有工作簿都具有相同的窗口,但是由于 Microsoft 放弃了用于 Excel 的 MDI,您可能会突然拥有两个使用与以前相同的代码的不同窗口。混合这些窗口可能会导致您遇到的问题。

有关自 Excel 2013 以来的一些更改,请参阅此链接:https : //msdn.microsoft.com/en-us/library/office/dn251093.aspx

您可以尝试的另一件事是在调用 FreezePane 之前将窗口状态设置为正常:

Worksheet.Application.ActiveWindow.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlNormal;
Run Code Online (Sandbox Code Playgroud)

还有一种可能性是这实际上是 Excel 中的一个错误。我确实找到了有同样问题的其他人,但不清楚这个人是解决了问题还是填写了错误报告:

https://social.msdn.microsoft.com/Forums/office/en-US/7e6ff1ed-b4c6-4c75-82be-14175f44df55/freezepanes-throws-an-exception-when-excel-is-minimized?forum=exceldev

您可以向 Microsoft 提交错误报告,然后等待他们是否将其确认为错误。


Den*_*der 3

是的!我像 Xatoo 建议的那样修复了这个问题,添加了:

Worksheet.Application.ActiveWindow.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlNormal;
Run Code Online (Sandbox Code Playgroud)

重要的是要补充一点,此解决方案仅在窗口实际最小化时才有效,因此您需要检查这一点。

有趣的细节是,这仍然不会将窗口发送到前台。