com异常excel InteropServices.ComeException-c#
从com异常excel InteropServices.ComeException-c#,c#,excel,com,comexception,C#,Excel,Com,Comexception,从main() 如果在系统上打开excel,我希望获得true,然后访问该工作表。我确保excel已打开,并且sheet1在那里,但我得到false和上面的错误 使用Excel=Microsoft.Office.Interop.Excel public static bool IsExcelOpened(string sheet1) { bool isOpened = true; Excel.Application exApp;
main()
如果在系统上打开excel,我希望获得true
,然后访问该工作表。我确保excel已打开,并且sheet1
在那里,但我得到false
和上面的错误
使用Excel=Microsoft.Office.Interop.Excel代码>
public static bool IsExcelOpened(string sheet1)
{
bool isOpened = true;
Excel.Application exApp;
exApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
try
{
Excel.Worksheet xlWorksheet;
xlWorksheet = (Excel.Worksheet)exApp.Workbooks.get_Item(sheet1);
}
catch (Exception)
{
isOpened = false;
}
return isOpened;
}
编辑:当我以管理员身份运行VS2019时,我收到了更多关于错误的信息
操作不可用(HRESULT:0x800401E3(MK_E_不可用)中的异常情况)
我认为您的问题是Visual Studio在Excel中运行
我尝试了一个稍微修改过的代码版本,当以管理员身份运行VisualStudio时(与excel打开时使用的是同一个用户),它可以正常工作
可能值得检查您是否也使用了正确版本的互操作dll
public bool IsExcelOpened()
{
bool isOpened = false;
try
{
Excel.Application exApp;
Excel.Worksheet xlWorksheet;
exApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") as Excel.Application;
if(exApp != null)
{
xlWorksheet = (Excel.Worksheet)exApp.ActiveSheet;
isOpened = true;
}
}
catch { }
return isOpened;
}
这很有效。唯一的问题是,我必须关闭任务管理器中的excel
进程才能得到false。当我以管理员身份运行excel并运行我的代码版本时,原始错误消失了,但我收到了“System.InvalidCastException”
。你知道我为什么收到这个吗。IsxlWorksheet=(Excel.Worksheet)exApp.Workbooks.get_项(sheet1)错误的方式?我不认为你做的任何事情都是错误的。我倾向于使用“as”而不是直接强制转换,这样您就有机会进行空检查。如果不满意,直接播放将抛出错误。我无法使get_项正常工作,这就是我选择ActiveSheet的原因。关闭后,所有microsoft应用程序都可以在后台挂起一段时间,这有点烦人。我们周围没有工作。我们刚刚添加了一个“杀光所有的高手”,据我所知,它还没有被经常使用。