2017-11-03 5 views
1

Ich habe ein kleines Problem, das ich keine Lösung auf StackOverFlow finden konnte. Die Situation: Ich habe eine Anwendung, die EXCEL-Anwendung automatisch öffnet. Wenn es sofort geöffnet wird, erscheint ein Dialogfeld mit der Meldung "Das Dateiformat und die Erweiterung von xxx stimmen nicht überein. Die Datei könnte beschädigt oder unsicher sein." Ich versuche eine Anwendung zu erstellen, die sich auf diesen laufenden EXCEL konzentriert Anwendung und drücken Sie die "JA" und speichern Sie die Excel mit VERSION 2007, so dass diese Fehlermeldung nicht wieder auftauchen wird. HierC# Excel-Anwendungsdatei Format Problem

ist das, was ich bisher:

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

Nicht sicher, wie ein Click-Ereignis auf der JA zu tun, um die excelApp Variable. Ich habe auch versucht

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

6. November 2017: Dies ist, was ich bisher jetzt haben:

 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); 
     } 

Dies funktioniert nur, wenn es keine Fehlermeldung am Anfang war. Wenn der Prozess automatisch Excel öffnet und eine Fehlermeldung anzeigt, wird dies eine Ausnahme auslösen, da die Anwendung mit der Fehlermeldung beschäftigt ist.

+0

Ich habe einen Fehler, wenn ich den Code versuchen, aber wenn ich es auf die folgende Änderung ich nicht den Fehler und auch keinen Dialog. 'var excelApp = new Microsoft.Office.Interop.Excel.Application(); var x = ExcelApp.ActiveDialog; ' – Sjips

+0

Oh sorry, ich verwende ' mit Excel = Microsoft.Office.Interop.Excel' –

+0

Wenn Sie XlFileFormat.xlExcel8 verwenden, müssen Sie die Datei mit einer .xls-Erweiterung speichern. Crystal Ball sagt, dass Sie .xlsx verwenden, ein sehr anderes Format. –

Antwort

0

Vielen Dank für Ihre Hilfe. Ich war in der Lage, dies zu umgehen und alle Warnungen für Microsoft Excel-Anwendung mit der REGEDIT deaktivieren. Dies war der einzige Weg, um diese Situation zu umgehen. Nur veröffentlichen eine Antwort andere in der gleichen Situation zu helfen:

REGEDIT Solution (Read near the bottom)

0

Ich kenne keine Möglichkeit, genau das zu tun, was Sie beschreiben - ein Dialogfeld innerhalb der Anwendung abzufangen.

Was ich glaube, dass Sie tun möchten, ist Excel-Aussetzung Warnungen an erster Stelle. Sie können dies tun, indem Sie die Eigenschaft DisplayAlerts auf false ändern.

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"); 

Und wenn Sie fertig sind, setzen die Dinge wieder, wie sie waren:

excelApp.DisplayAlerts = true; 
+0

Es scheint nicht zu funktionieren. Nur weil die andere Anwendung automatisch eine EXCEL-Anwendung nach einem öffnet Ich habe die Möglichkeit, alle EXCEL-Anwendungen zu beenden, bevor sie ausgeführt werden, kann aber anscheinend keine Warnungen abstellen, da dieser Prozess erst ausgelöst wird, wenn ein bestimmter Prozess ausgeführt wurde und es zu spät ist, Warnungen zu deaktivieren. –

0

hallo Sie eine andere Anwendung erstellen können, in dem Sie Logik der Nähe Alert-Box von Excel und führen Sie von Ihrem Haupt schreiben

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

so keine Notwendigkeit, Benutzer-Interaktion für eine enge diese Alert-Box, und können Sie verschiedene Alarmmeldung in der Datenbank speichern und überprüfen, ob diese Meldung kommt In Alarmbox können Sie schließen