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

时间:2017-11-03 20:53:29

标签: c# excel interop dllimport

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

这是我到目前为止所拥有的:

var excelApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
var c = excelApp.ActiveDialog;

不确定如何使用excelApp变量对YES执行click事件。 我也试过了

foreach (Process proc in Process.GetProcesses())
        {
            if (proc.MainWindowTitle.Contains("Excel"))
                ....
        }

十一月06 2017年: 这就是我现在所拥有的:

        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并显示错误消息,则会抛出异常,因为应用程序正忙于显示错误消息。

3 个答案:

答案 0 :(得分:0)

我不知道如何完成您所描述的操作 - 拦截应用程序中的对话框。

我认为您想要做的是首先让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;

答案 1 :(得分:0)

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

foreach (Process proc in Process.GetProcesses())
        {
            if (proc.MainWindowTitle.Contains("Excel"))
                ....
        }, 

所以不需要用户交互来关闭此警告框, 并且您可以在数据库中保存不同的警报消息,并检查此消息是否在警报框中,您可以关闭

答案 2 :(得分:0)

感谢大家的帮助。我能够绕过这个并使用REGEDIT禁用Microsoft Excel应用程序的所有警报。这是解决这种情况的唯一方法。只需在相同的情况下发布答案以帮助其他人:

REGEDIT Solution (Read near the bottom)