Autor Beitrag
Marc Dirk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Di 22.09.15 23:26 
Hallo,

ich öffne mittels Interop eine Excel-Datei, die bei uns auf dem Server liegt. Solange die Datei nicht bereits von einem Kollegen geöffnet ist, funtioniert auch alles.
Sobald die Datei jedoch bereits schon anderweitig geöffnet ist, erscheint ein Dialogfenster, welches mich darüber informiert. Wenn der Anwender nun auf "Abbrechen" klickt, springt das Programm in meine "catch" - Routine, bei "Ok" übergeht sie diese.

Ich möchte erreichen, dass die Meldung von Interop nicht erscheint (excelApp.DisplayAlerts = false;) und meine "catch" - Routine immer anspringt, wenn das Excel-File schon anderweitig geöffnet ist. Da ich den Schreibzugriff auf die Datei benötige, starte ich hier einen Timer, welcher nach einer Minute den nächsten Versuch unternimmt die Datei exklusiv zu öffnen.

Nun zum Problem:
Unterdrücke ich die Interop-Meldung, dann wird scheinbar keine Exception geworfen und meine "catch" - Routine nie angesprungen.
Inzwische habe ich ein paar Stunden mit Recherche zugebracht und komme hier irgendwie nicht weiter. Kann mir hier jemand helfen?

Anbei mein Code und vielen Dank für Eure Hilfe im Voraus!

Gruß
Marc

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
public string InitExcelConnection(string ExcelFilePath, int intTabelNo)
{
    string GuiId = "";
    try
    {
        excelApp = new Excel.Application();
        //excelApp.DisplayAlerts = false;
        GuiId = System.Guid.NewGuid().ToString().ToUpper();
        excelApp.Caption = GuiId;
        excelWorkBook = excelApp.Workbooks.Open(ExcelFilePath, 0false5""""false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "t"falsefalse0true10);
        excelWorkSheet = (Excel.Worksheet)excelWorkBook.Worksheets.get_Item(intTabelNo); 
        range = excelWorkSheet.UsedRange;
    }
    catch (Exception ex)
    {
        some Code
    }
    return GuiId;
}
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 23.09.15 02:06 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: Marc Dirk
Marc Dirk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mi 23.09.15 06:57 
Danke Frühlingsrolle!

Hoffe Du konntest gut schlafen. Ich beschäftige mich mit Deinem Vorschlag heute nach der Arbeit.

Wenn ich so Deinen Code kurz überfliege, bin ich mir aber nicht sicher, ob das funktionieren wird.
Für mich sieht es im Moment so aus, als ob Du die Prozesse auf meinem PC abfragst. Die Datei ist aber, wenn sie schon geöffnet ist, auf einem Rechner meiner Kollegen geöffnet.
Die Tabelle liegt im Netz.

Deswegen mein Ansatz die Excel Exception irgendwie schon auslösen zu lassen, aber den Dialog den Interop wirf zu unterdrücken.
Aber eben da kam ich nicht weiter.

Gruß
Marc
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 23.09.15 20:57 
- Nachträglich durch die Entwickler-Ecke gelöscht -
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Mi 23.09.15 21:11 
Guck mal, ob bei deinem excelWorkBook Objekt die Property ReadOnly gesetzt ist.
Marc Dirk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mi 23.09.15 21:28 
Hallo Frühlingsrolle!

Ich möchte die Meldung, dass die Datei bereits geöffnet ist (kommt von Excel Interop) unterdrücken und trotzdem den Catch-Block anspringen, wenn die Excel-Datei auf einem anderen PC geöffnet ist.
Dein Vorschlag greift dann aber erst wenn die Meldung schon dargestellt wurde und nur dann, wenn auf "Abbrechen" geklickt wurde. Bei "OK" geht Excel davon aus die Datei schreibgeschützt zu öffnen und wirft keine Exception.

Mein Gedanke geht dahin diese Excel-Meldung abzufangen und selber eine Exception zu werfen. Hab aber keine Ahnung wie das geht.

Vielleicht kann da einer helfen?!

Marc
Marc Dirk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mi 23.09.15 21:34 
Hallo jfheins!

Wieso readonly? Ich kann ja ganz normal mit meiner Funktion arbeiten (lesen, schreiben kein Problem), solange die Datei nicht bereits von jemanden anderem auf einem anderen PC im Netzwerk geöffnet wurde. Excel merkt dann auf unter Nennung dieses Users und fragt ob ich abbrechen will oder die Datei schreibgeschütz öffnen will. Und eben diese Meldung will ich unterdrücken und stattdessen meinen catch-Block dafür anspringen.

Gruß
Marc
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Mi 23.09.15 21:41 
Ich vermute mal ganz stark, dass im Falle von DisplayAlerts = false diese Meldung ja unterdrückt wird und Excel (für dich) automatisch die Option "Schreibgeschützt" wählt.

Die Lösung wäre es daher, die Datei zu öffnen und danach zu gucken, ob die geöffnete Arbeitsmappe denn nun Schreibgeschützt ist. Falls sie das ist, dann ist diese Datei offenbar gerade von einem anderen Benutzer im Netzwerk geöffnet. Nun schließt du die Datei einfach wieder und macht das, was du in diesem Fall machen möchtest. Du kopierst quasi deinen Code aus dem catch-Block in einen If-Block :P

Du kannst auch dort eine Exception werfen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
try
    {
        excelApp = new Excel.Application();
        excelApp.DisplayAlerts = false;
        GuiId = System.Guid.NewGuid().ToString().ToUpper();
        excelApp.Caption = GuiId;
        excelWorkBook = excelApp.Workbooks.Open(ExcelFilePath, 0false5""""false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "t"falsefalse0true10);

        if(excelWorkBook.ReadOnly)
        {
            throw new IOException("Whatever");
        }

        excelWorkSheet = (Excel.Worksheet)excelWorkBook.Worksheets.get_Item(intTabelNo); 
        range = excelWorkSheet.UsedRange;
    }
    catch (Exception ex)
    {
        some Code
    }

Für diesen Beitrag haben gedankt: Marc Dirk
Marc Dirk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mi 23.09.15 21:45 
Um die Ecke gedacht. Das gefällt mir. Danke, probier ich aus. Manchmal steht man sich ja selber im Weg.

Gruß
Marc