c#Excel应用程序文件格式问题

c#Excel应用程序文件格式问题,c#,excel,interop,dllimport,C#,Excel,Interop,Dllimport,我有一个小问题,我无法找到任何关于StackOverFlow的解决方案。 情况: 我有一个自动打开EXCEL应用程序的应用程序。当它立即打开时,会出现一个对话框,显示“xxx的文件格式和扩展名不匹配。该文件可能已损坏或不安全…” 我正在尝试创建一个专注于此运行的EXCEL应用程序的应用程序,并点击“是”,然后用2007版重新保存EXCEL,这样就不会再次出现此错误消息 以下是我到目前为止的情况: var excelApp = (Excel.Application)Marshal.GetActiv

我有一个小问题,我无法找到任何关于StackOverFlow的解决方案。 情况: 我有一个自动打开EXCEL应用程序的应用程序。当它立即打开时,会出现一个对话框,显示“xxx的文件格式和扩展名不匹配。该文件可能已损坏或不安全…” 我正在尝试创建一个专注于此运行的EXCEL应用程序的应用程序,并点击“是”,然后用2007版重新保存EXCEL,这样就不会再次出现此错误消息

以下是我到目前为止的情况:

var excelApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
var c = excelApp.ActiveDialog;
不确定如何使用excelApp变量在YES上执行单击事件。 我也试过了

foreach (Process proc in Process.GetProcesses())
        {
            if (proc.MainWindowTitle.Contains("Excel"))
                ....
        }
2017年11月6日: 到目前为止,我已经做到了:

        var oExcelApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");

        Process[] processlist = Process.GetProcessesByName("Excel"); //Shows number of running Excel apps
        foreach (Process theprocess in processlist) //foreach Excel app running
        {

            if (oExcelApp.Workbooks.Count >= 0) //for worbooks in each Excel app
            {
                foreach (Excel.Workbook wkb in oExcelApp.Application.Workbooks)
                {                        
                    wkb.SaveAs(filePath, Excel.XlFileFormat.xlExcel8);
                    wkb.Close(true, null, null);
                    Marshal.FinalReleaseComObject(wkb);
                }
                oExcelApp.Workbooks.Close();
            }

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
            GC.WaitForPendingFinalizers();

            oExcelApp.Quit();
            Marshal.ReleaseComObject(oExcelApp);
        }

只有在开始时没有错误消息时,此操作才有效。如果进程自动打开excel并显示错误消息,则会引发异常,因为应用程序正在处理错误消息。

我不知道有什么方法可以准确地执行您所描述的操作—在应用程序中截取对话框

我认为您首先要做的是让Excel挂起警告。您可以通过将
DisplayAlerts
属性修改为false来完成此操作

var excelApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
excelApp.DisplayAlerts = false;

// This should not give you any warnings
excelApp.Workbooks.Open("c:/cdh/test.xls");
完成后,将事情恢复原状:

excelApp.DisplayAlerts = true;

我不知道有什么方法可以精确地完成您所描述的——在应用程序中拦截对话框

我认为您首先要做的是让Excel挂起警告。您可以通过将
DisplayAlerts
属性修改为false来完成此操作

var excelApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
excelApp.DisplayAlerts = false;

// This should not give you any warnings
excelApp.Workbooks.Open("c:/cdh/test.xls");
完成后,将事情恢复原状:

excelApp.DisplayAlerts = true;

您好,您可以创建另一个应用程序,您可以在其中编写Excel关闭警报框的逻辑,并从主应用程序执行

foreach (Process proc in Process.GetProcesses())
        {
            if (proc.MainWindowTitle.Contains("Excel"))
                ....
        }, 
因此,关闭此警报框无需用户交互,
您可以在数据库中保存不同的警报消息,并检查该消息是否出现在警报框中。您可以关闭

嗨,您可以创建另一个应用程序,在该应用程序中,您可以编写Excel关闭警报框的逻辑,并从主应用程序执行

foreach (Process proc in Process.GetProcesses())
        {
            if (proc.MainWindowTitle.Contains("Excel"))
                ....
        }, 
因此,关闭此警报框无需用户交互,
您可以在数据库中保存不同的警报消息,并检查此消息是否出现在警报框中。您可以关闭

谢谢大家的帮助。我能够绕过这个问题,并使用REGEDIT禁用Microsoft Excel应用程序的所有警报。这是扭转这种局面的唯一办法。只是发布一个答案来帮助处于相同情况的其他人:


谢谢大家的帮助。我能够绕过这个问题,并使用REGEDIT禁用Microsoft Excel应用程序的所有警报。这是扭转这种局面的唯一办法。只是发布一个答案来帮助处于相同情况的其他人:


我在尝试您的代码时出错,但当我将其更改为以下内容时,我没有收到错误,也没有对话框
var excelApp=new Microsoft.Office.Interop.Excel.Application();var x=excelApp.ActiveDialog哦,很抱歉,我正在使用
使用Excel=Microsoft.Office.Interop.Excel
当您使用XlFileFormat.xlExcel8时,必须使用.xls扩展名保存文件。Crystal ball说您使用的是.xlsx,一种非常不同的格式。不,我想将其另存为XLS扩展名。。。唯一的问题是我甚至没有进入内部foreach循环。它直接进入
oExcelApp.Workbooks.Close()
并引发异常--消息为“消息筛选器指示应用程序正忙。(HRESULT中的异常:0x8001010A(RPC_E_SERVERCALL_RETRYLATER)),因为它卡在警报消息“文件格式和扩展名…”上。我在尝试代码时出错,但是当我将其更改为以下内容时,我没有得到错误,也没有对话框
var excelApp=new Microsoft.Office.Interop.Excel.Application();var x=excelApp.ActiveDialog哦,很抱歉,我正在使用
使用Excel=Microsoft.Office.Interop.Excel
当您使用XlFileFormat.xlExcel8时,必须使用.xls扩展名保存文件。Crystal ball说您使用的是.xlsx,一种非常不同的格式。不,我想将其另存为XLS扩展名。。。唯一的问题是我甚至没有进入内部foreach循环。它直接进入
oExcelApp.Workbooks.Close()
并引发异常--消息是“消息筛选器指示应用程序正忙。(HRESULT中的异常:0x8001010A(RPC_E_SERVERCALL_RETRYLATER)),因为它卡在警报消息“文件格式和扩展名…”上,似乎不起作用。仅因为其他应用程序在完成某个过程后自动打开EXCEL应用程序。我可以在运行此程序之前关闭所有正在运行的EXCEL应用程序,但似乎无法关闭警报,因为只有在完成某个进程后才会触发此进程,到那时关闭警报已为时过晚。它似乎不起作用。仅因为其他应用程序在完成某个过程后自动打开EXCEL应用程序。我可以在运行此程序之前关闭所有正在运行的EXCEL应用程序,但似乎无法关闭警报,因为只有在完成某个进程后才会触发此进程,到那时关闭警报已经太晚了。