【问题标题】:c# Excel Application File Format issuec# Excel 应用程序文件格式问题
【发布时间】:2025-12-20 17:05:13
【问题描述】:

我有一个小问题,我无法在 * 上找到任何解决方案。 情况: 我有一个自动打开 EXCEL 应用程序的应用程序。当它立即打开时,会出现一个对话框,上面写着“xxx的文件格式和扩展名不匹配。文件可能已损坏或不安全......” 我正在尝试创建一个专注于这个正在运行的 EXCEL 应用程序的应用程序,然后点击“是”并使用 VERSION 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 年 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 并有错误消息显示这将引发异常,因为应用程序正忙于错误消息。

【问题讨论】:

  • 我在尝试您的代码时遇到错误,但是当我将其更改为以下代码时,我没有收到错误,也没有对话框。 var excelApp = new Microsoft.Office.Interop.Excel.Application(); var x = excelApp.ActiveDialog;
  • 抱歉,我使用的是using Excel = Microsoft.Office.Interop.Excel
  • 当您使用 XlFileFormat.xlExcel8 时,您必须使用 .xls 扩展名保存文件。水晶球说你使用 .xlsx,一种非常不同的格式。
  • 不,我想将其保存为 XLS 扩展...唯一的问题是我什至没有进入内部 foreach 循环。它直接到oExcelApp.Workbooks.Close(); 并引发异常 - 消息是“消息过滤器指示应用程序正忙。(来自 HRESULT 的异常:0x8001010A (RPC_E_SERVERCALL_RETRYLATER))”因为它停留在警报消息“文件格式和..."的扩展名

标签: c# excel interop dllimport


【解决方案1】:

我不知道有什么方法可以完全按照您的描述进行 - 拦截应用程序中的对话框。

我认为您首先要做的是让 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 应用程序。我可以在运行它之前杀死所有正在运行的 EXCEL 应用程序,但似乎无法关闭警报,因为只有在完成特定过程后才会触发此过程,到那时关闭警报为时已晚。
【解决方案2】:

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

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

因此无需用户交互即可关闭此警报框, 您可以在数据库中保存不同的警报消息并检查此消息是否出现在您可以关闭的警报框中

【讨论】:

    【解决方案3】:

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

    REGEDIT Solution (Read near the bottom)

    【讨论】: