这是我的第一个问题,或者我应该在这个网站上说第一个帮助查询,以便我尽可能清晰和广泛,不要睡着了! ;)
我们正在重塑旧的应用程序"这是一个充满自动化,打印,菜单替换和数据库记录的Excel模板,以及所有其他的东西,使它成为一个巨大的模板(8MB)或至少是巨大的,以这种方式记录每个客户流程(我们有+每天200个新文件,存储空间失控)
所以我开发了一个WPF / C#应用程序,只使用模板作为空shell进行计算,这样我就可以存储每个模板版本的副本而不是每个客户的完整文件,并将数据存储到SQL中直。我使用Excel.Interop与此模板交互,当需要计算时,我打开模板,用数据提供模板,调用VBA宏来运行计算,然后获取包含结果数据的一些范围以在我的应用程序中检索。所有这些都需要/保持对用户隐藏(因为CEO这样说!!)因此我使用" Application.Visible = False"。
实际的问题是,无论我做什么,以及我与Excel交互的版本(至少2010年和2016年),我都会得到我称之为&#34;错误的行为&#34;。当我启动我的应用程序的多个实例时,每个实例都有自己的Excel实例隐藏在后台运行,每个隐藏工作簿的计算工作完美无缺。 但是,如果我先启动我的应用程序,然后从资源管理器,Excel&#34;窃取&#34;打开另一个excel文件我隐藏的实例打开这个新文件,然后我的工作簿变得可见 ...起初我认为使用Excel 2016和正确的注册表项将解决此问题(HKCU \ Software \ Microsoft \ Office \ 16.0 \ Excel \ Options \ DisableMergeInstance = 1),但它没有像我预期的那样工作(在新窗口中打开文件之前,它仍然窃取我的实例以显示它,如果我隐藏应用程序,它会隐藏所有内容)< / p>
我的问题(这里是)是否有一个&#34;最佳实践&#34;能够与隐藏的工作簿进行交互,并拥有excel流程&#34;专属&#34;我的应用程序实例使用?或者也许是注册表操作的解决方案......我已经没有想法......
提前感谢您的阅读时间,并祝福那个让我离开的人!
祝你好运!
PS:如果计算可以被驱逐到服务器上会有很大帮助,但据我所知,ExcelService不接受运行VBA,所以我坚持使用Interop[START Edit 1 - 2018/05/02] 在后台启动的Excel代码示例:
private void launchExcel()
{
if (xlsApp != null) return;
isReady = false;
try
{
xlsApp = new Excel.Application();
//Identification process Excel associé
GetWindowThreadProcessId(xlsApp.Hwnd, out excelProcessId);
("OSEP Excel process ID = " + excelProcessId).writeToConsole();
//Prevent Excel dialog
xlsApp.DisplayAlerts = false;
xlsApp.Visible = myApp.Configuration.mode_excel_visible;
//Attaches event on Application.Exit, Application.DispatcherUnhandledException, and CurrentDomain.UnhandledException
//On one of these event : dispose COM objects, and Kill Excel process
this.CloseWithApplication();
SheetSelectionChange((s, e) =>
{
WriteToConsole("SheetSelectionChange : " + e.Address);
});
AfterCalculate(() =>
{
WriteToConsole("AfterCalculate");
});
}
catch(Exception ex)
{
ex.writeToConsole();
}
finally
{
isReady = true;
}
}
[END编辑1 - 2018/05/02]