我在C# .NET
开发了一个操作Excel工作表的小应用程序,我不知道为什么有些用户会告诉我,当他们打开excel文件时,窗口不会出现在前面/顶部,尽管我将visible设置为true,窗口状态设置为maximumized。
这是读取 excel 文件的函数:
public static void OpenExcel(string fileName, bool visibility, FunctionToExecute fn = null)
{
string addInPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Microsoft\\AddIns\\mDF_XLcalendar.xla");
deleg = fn;
app = new Excel.Application();
app.Workbooks.Open(addInPath);
app.Workbooks.Open(fileName);
app.ScreenUpdating = true;
app.DisplayAlerts = true;
app.Visible = visibility;
app.UserControl = true;
app.WindowState = Excel.XlWindowState.xlMaximized;
EventDel_BeforeBookClose = new Excel.AppEvents_WorkbookBeforeCloseEventHandler(application_WorkbookBeforeClose);
EventSave_BeforeBookClose = new Excel.AppEvents_WorkbookBeforeSaveEventHandler(Open_ExcelApp_WorkbookBeforeSave);
app.WorkbookBeforeClose += EventDel_BeforeBookClose;
app.WorkbookBeforeSave += EventSave_BeforeBookClose;
}
有什么想法吗?
答案 0 :(得分:4)
我会尝试通过
激活excel窗口app.ActiveWindow.Activate();
如果这不起作用,您可以在this thread at http://social.msdn.microsoft.com/找到其他解决方案(涉及原生WinAPI调用)
答案 1 :(得分:4)
我发现这个有效。 How to bring an Excel app to the front
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
public static void BringExcelWindowToFront(Application xlApp)
{
string caption = xlApp.Caption;
IntPtr handler = FindWindow(null, caption);
SetForegroundWindow(handler);
}
答案 2 :(得分:3)
有时,如果在Excel中同时打开多个文件,ActiveWindow.Activate()
将无效。
成功的诀窍是尽量减少然后最大化命令。
答案 3 :(得分:3)
一些魔法,对我有用:
app.WindowState = XlWindowState.xlMinimized; // -4140
app.WindowState = XlWindowState.xlMaximized; // -4137
答案 4 :(得分:2)
我知道有点晚了,但为什么需要使用FindWindow,可以通过应用程序访问Windows句柄:
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
public static void BringExcelWindowToFront(Application xlApp)
{
SetForegroundWindow((IntPtr)xlApp.Hwnd); // Note Hwnd is declared as int
}
如果多个窗口具有相同的标题,则不会出现问题。
答案 5 :(得分:0)
要激活特定的工作簿,请执行以下操作:
{{1}}