C#-Projekt: Zugriff auf Excel-Dateien

URL dieses Beitrags: http://blog.stefan-macke.com/2006/06/28/c-projekt-zugriff-auf-excel-dateien/

Der Zugriff auf Excel-Dateien und -Funktionen mit C# ist eigentlich recht einfach. Zunächst muss ein Verweis auf die COM-Bibliothek Microsoft Excel 11.0 Object Library hinzugefügt und dann noch der entsprechende Namespace inkludiert werden mittels:

  1. using Microsoft.Office.Interop.Excel;

Änderungen bei Excel 2007: Es muss die COM-Bibliothek Microsoft Excel 12.0 Object Library verwendet werden.

Änderungen bei Excel 2010: Es muss die COM-Bibliothek Microsoft Excel 14.0 Object Library verwendet werden.

Dann kann man munter drauflos programmieren, vielleicht wie folgt:

  1. // benötigte Objekte vorbereiten
  2. Microsoft.Office.Interop.Excel.Application excel = null;
  3. Workbook wb = null;
  4. try
  5. {
  6.     // Excel starten
  7.     excel = new Microsoft.Office.Interop.Excel.Application();
  8.     excel.Visible = false;
  9.  
  10.     // Datei öffnen
  11.     wb = excel.Workbooks.Open(
  12.         @"C:\test.xlsx",
  13.         ExcelKonstanten.UpdateLinks.DontUpdate,
  14.         ExcelKonstanten.ReadOnly,
  15.         ExcelKonstanten.Format.Nothing,
  16.         "", // Passwort
  17.         "", // WriteResPasswort
  18.         ExcelKonstanten.IgnoreReadOnlyRecommended,
  19.         XlPlatform.xlWindows,
  20.         "", // Trennzeichen
  21.         ExcelKonstanten.Editable,
  22.         ExcelKonstanten.DontNotifiy,
  23.         ExcelKonstanten.Converter.Default,
  24.         ExcelKonstanten.DontAddToMru,
  25.         ExcelKonstanten.Local,
  26.         ExcelKonstanten.CorruptLoad.NormalLoad);
  27.  
  28.     // Arbeitsblätter lesen
  29.     Sheets sheets = wb.Worksheets;
  30.  
  31.     // ein Arbeitsblatt auswählen…
  32.     Worksheet ws = (Worksheet)sheets.get_Item("Tabelle1");
  33.     // …oder eine Zelle
  34.     Range range = (Range)ws.get_Range("A1", "A1");
  35.     // deren Wert auslesen
  36.     string zellwert = range.Value2.ToString();
  37.     Console.WriteLine(zellwert);
  38. }
  39. catch (Exception e)
  40. {
  41.     Console.WriteLine(e.Message);
  42. }
  43. finally
  44. {
  45.     wb.Close(false, null, null);
  46.     excel.Quit();
  47. }

Ich habe mir der Einfachheit halber die Werte, die als Parameter für die Methode Worbook.Workbooks.Open benötigt werden, in eine kleine Hilfsklasse geschrieben. Die Werte habe ich von der Microsoft-Seite.

  1. /// <summary>
  2. /// Diese Klasse enthält alle Konstanten, die beim Zugriff auf Excel
  3. /// benötigt werden. Die Beschreibungen sind von Microsoft übernommen
  4. /// und daher noch auf Englisch.
  5. /// </summary>
  6. private static class ExcelKonstanten
  7. {
  8.     /// <summary>
  9.     /// Specifies the way links in the file are updated. If this
  10.     /// argument is omitted, the user is prompted to specify how
  11.     /// links will be updated. Otherwise, this argument is one of
  12.     /// the values listed in the following table.
  13.     /// </summary>
  14.     public enum UpdateLinks
  15.     {
  16.         DontUpdate = 0,
  17.         ExternalOnly = 1,
  18.         RemoteOnly = 2,
  19.         ExternalAndRemote = 3
  20.     };
  21.  
  22.     /// <summary>
  23.     /// True to open the workbook in read-only mode.
  24.     /// </summary>
  25.     public const bool ReadOnly = true;
  26.     public const bool ReadWrite = false;
  27.  
  28.     /// <summary>
  29.     /// If Microsoft Excel is opening a text file, this argument
  30.     /// specifies the delimiter character, as shown in the following
  31.     /// table. If this argument is omitted, the current delimiter
  32.     /// is used.
  33.     /// </summary>
  34.     public enum Format
  35.     {
  36.         Tabs = 1,
  37.         Commas = 2,
  38.         Spaces = 3,
  39.         Semicolons = 4,
  40.         Nothing = 5,
  41.         CustomCharacter = 6
  42.     };
  43.  
  44.     /// <summary>
  45.     /// True to have Microsoft Excel not display the read-only
  46.     /// recommended message (if the workbook was saved with the
  47.     /// Read-Only Recommended option).
  48.     /// </summary>
  49.     public const bool IgnoreReadOnlyRecommended = true;
  50.     public const bool DontIgnoreReadOnlyRecommended = false;
  51.  
  52.     /// <summary>
  53.     /// If the file is a Microsoft Excel 4.0 add-in, this argument
  54.     /// is True to open the add-in so that its a visible window.
  55.     /// If this argument is False or omitted, the add-in is opened
  56.     /// as hidden, and it cannot be unhidden. This option doesn’t
  57.     /// apply to add-ins created in Microsoft Excel 5.0 or later.
  58.     /// If the file is an Excel template, True to open the specified
  59.     /// template for editing. False to open a new workbook based on
  60.     /// the specified template. The default value is False.
  61.     /// </summary>
  62.     public const bool Editable = true;
  63.     public const bool NotEditable = false;
  64.  
  65.     /// <summary>
  66.     /// If the file cannot be opened in read/write mode, this
  67.     /// argument is True to add the file to the file notification
  68.     /// list. Microsoft Excel will open the file as read-only, poll
  69.     /// the file notification list, and then notify the user when
  70.     /// the file becomes available. If this argument is False or
  71.     /// omitted, no notification is requested, and any attempts to
  72.     /// open an unavailable file will fail.
  73.     /// </summary>
  74.     public const bool Notify = true;
  75.     public const bool DontNotifiy = false;
  76.  
  77.     /// <summary>
  78.     /// The index of the first file converter to try when opening
  79.     /// the file. The specified file converter is tried first; if
  80.     /// this converter doesnt recognize the file, all other converters
  81.     /// are tried. The converter index consists of the row numbers
  82.     /// of the converters returned by the FileConverters property.
  83.     /// </summary>
  84.     public enum Converter
  85.     {
  86.         Default = 0
  87.     };
  88.  
  89.     /// <summary>
  90.     /// True to add this workbook to the list of recently used files.
  91.     /// The default value is False.
  92.     /// </summary>
  93.     public const bool AddToMru = true;
  94.     public const bool DontAddToMru = false;
  95.  
  96.     /// <summary>
  97.     /// True saves files against the language of Microsoft Excel
  98.     /// (including control panel settings). False (default) saves
  99.     /// files against the language of Visual Basic for Applications
  100.     /// (VBA) (which is typically US English unless the VBA project
  101.     /// where Workbooks.Open is run from is an old internationalized
  102.     /// XL5/95 VBA project).
  103.     /// </summary>
  104.     public const bool Local = true;
  105.     public const bool NotLocal = false;
  106.  
  107.     public enum CorruptLoad
  108.     {
  109.         NormalLoad = 0,
  110.         RepairFile = 1,
  111.         ExtractData = 2
  112.     };
  113. }

Kommentare zu diesem Beitrag

  1. Gravatar Suter
    Am 30. Oktober 2007 um 09:30 Uhr

    Wiso kann man das den zweiten Codeteil nicht kopieren??
    Ansonsten gut:)
    Grüsse

  2. Gravatar Stefan
    Am 30. Oktober 2007 um 11:26 Uhr

    Also ich kann alles kopieren!?

  3. Gravatar Suter
    Am 30. Oktober 2007 um 12:15 Uhr

    Ich kann den zweiten Teil mit der Maus nicht mal markieren…Benutze IE 6.0

  4. Gravatar Nico
    Am 15. November 2007 um 15:07 Uhr

    Super! funktioniert alles…
    bis, dass beim Aufruf nicht das gewünschte Blatt aufgerufen wird.
    ist doch in dieser funktion: //Ein Arbeitsblatt auswählen
    habe es bei mir aber richtig angepasst!
    Funkrioniert dieser version??:S

  5. Gravatar Stefan
    Am 17. November 2007 um 18:33 Uhr

    Die Funktion nutze ich seit längerer Zeit wie oben abgebildet. Bau doch mal ein try-catch drum und schau, was das genaue Problem ist…

  6. Gravatar Mathias
    Am 29. Mai 2008 um 12:41 Uhr

    Da ich mitbekommen habe, dass hier jemand Ahnung hatte, hoffe ich das du noch diesen Beitrag liest obwohl der Thread schon alt ist … aber was mache ich falsch wenn ich diese Fehlermeldung bekomme.

    Error: Das COM-Objekt des Typs “Microsoft.Office.Interop.Excel.WorkbookClass” kann nicht in den Schnittstellentyp “Microsoft.Office.Interop.Excel.Workbooks” umgewandelt werden. Dieser Vorgang konnte nicht durchgeführt werden, da der QueryInterface-Aufruf an die COM-Komponente für die Schnittstelle mit der IID “{000208DB-0000-0000-C000-000000000046}” aufgrund des folgenden Fehlers nicht durchgeführt werden konnte: Schnittstelle nicht unterstützt (Ausnahme von HRESULT: 0×80004002 (E_NOINTERFACE)). Line: WindowsFormsApplication2

    Danke für die Hilfe

  7. Gravatar Robsen
    Am 24. Juli 2008 um 00:30 Uhr

    selber Fehler wie Matthias… auch mit der msdn-website-anleitung…

  8. Gravatar Hannes
    Am 16. September 2008 um 08:19 Uhr

    Hast du den oben angegebenen Quellcode wirklich 1:1 verwendet?

  9. Gravatar Stefan
    Am 16. September 2008 um 13:24 Uhr

    Hallo Hannes.
    Ich habe den Code aus meinem lauffähigen Programm kopiert. Hast du alle Verweise eingefügt? Bei mir läuft’s mit Excel 2003…

  10. Gravatar Andy
    Am 24. November 2008 um 12:19 Uhr

    Hallo,

    in welcher Form muss ich denn den Pfad und den Dateinamen eingeben?

    Z.B. wenn ich das C#-Projekt unter
    c:\csharp\projekt1
    gespeichert habe und meine Datei liegt auf
    c:\eigenedateien\mappe1.xls

    Wenn ich an Stelle von
    this.dateiname
    folgendes eingebe:
    c:\eigenedateien\mappe1.xls
    dann funktioniert das nicht.

    Fehlermeldung: Unerwartetes Zeichen “\”.

    Auch mit Anführungsstrichen (” bzw. ‘) funktioniert das nicht.
    Fehlermeldung: Nicht erkannte Escapesequenz

  11. Gravatar Stefan
    Am 24. November 2008 um 13:20 Uhr

    @Andy: Du musst natürlich die Backslashes escapen. Entweder separat oder gleich ein “@” vor den String: "c:\\eigenedateien\\mappe1.xls" oder @"c:\eigenedateien\mappe1.xls".

  12. Gravatar Andreas
    Am 17. Dezember 2008 um 20:34 Uhr

    Hallo,

    ich bekomme beim Aufruf von

    Sheets sheets = wb.Worksheets;

    stets den Fehler

    Eine Ausnahme (erste Chance) bei 0×7c812aeb in KppSAPServer.exe: 0×80010108: Das aufgerufene Objekt wurde von den Clients getrennt.

  13. Gravatar Stefan
    Am 18. Dezember 2008 um 00:15 Uhr

    @Andreas: Dazu kann ich dir leider nichts sagen. Du wirst wohl mal den Debugger anschmeißen müssen :-(

  14. Gravatar Andreas
    Am 18. Dezember 2008 um 15:28 Uhr

    @stefan: Gut, dass ich ab übermorgen Urlaub hab. Ich habe den Code in eine Methode ausgelagert und übersehen, dass das Excel im finally block geschlossen wird ;-(. Dein Code funktioniert problemlos.

  15. Gravatar Mike
    Am 16. Januar 2009 um 16:26 Uhr

    Hey, danke, das hat mir sehr geholfen, funktioniert!

    Thx

  16. Gravatar Excel Zellen schreiben (Problem) - .NET Datenverwaltung @ tutorials.de: Forum, Tutorial, Anleitung, Schulung & Hilfe
    Am 5. Februar 2009 um 15:51 Uhr

    [...] Ahnung warum. Vielleicht habt ihr ne Idee. Kopier mal mein Code hier rein. Habe den Code von: Stefan Macke als Vorlage genommen. Ich versuche mit ws.Cells[2, 2] = "irgendein Text"; was in eine [...]

  17. Gravatar Ploetzeneder Andreas
    Am 24. Juli 2009 um 12:41 Uhr

    Hallo,
    Gut geht das auch mittels XML :
    http://www.ploetzeneder.eu/softwareentwicklung/cvbnet/38-datagridview-in-excel-exportieren.html

  18. Gravatar Steffen
    Am 21. August 2009 um 09:56 Uhr

    Hallo,

    super Sache das Snippet, nur leider bricht er bei mir beim Open schon ab. An was kann das liegen? dateiname und Excel ist offen.

    gruß
    steffen

  19. Gravatar Stefan
    Am 21. August 2009 um 15:43 Uhr

    @Steffen: Da wäre jetzt eine Fehlermeldung hilfreich. Irgendeine Exception oder so!?

  20. Gravatar Steffen
    Am 21. August 2009 um 16:02 Uhr
    PGNvZGU+QSBmaXJzdCBjaGFuY2UgZXhjZXB0aW9uIG9mIHR5cGUgJ1N5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5DT01FeGNlcHRpb24nIG9jY3VycmVkIGluIFNoYXJlUG9pbnRDbGVhbnVwVG9vbDIuZXhlPC9jb2RlPg==

    Das ist die Fehlermeldung

  21. Gravatar Steffen
    Am 21. August 2009 um 16:11 Uhr

    A first chance exception of type ‘System.Runtime.InteropServices.COMException’ occurred in SharePointCleanupTool2.exe
    Das ist die Fehlermeldung

  22. Gravatar Michael
    Am 17. September 2009 um 14:56 Uhr

    Vielen Dank.
    Du hast allen Usern im Web einen schönen Einstieg in die Automatisierung von Excel gegeben.

  23. Gravatar Stefan
    Am 17. September 2009 um 16:51 Uhr

    @Michael: Danke! Freut mich, dass es jemand brauchen kann :-)

  24. Gravatar Jürgen
    Am 16. Januar 2010 um 05:31 Uhr

    @Stefan: Ich fand Deinen Beitrag sehr hilfreich. Bin dabei eine Excel 2007-Anwendung (Fahrtenbuch für mein Motorrad) mittels Visual C# 2008 zu automatisieren und suche mit Hilfe einer 0)> -Schleife die erste leere Zeile unten in meiner Tabelle zum Einfügen neuer Daten (Datum, km-Stand, Tankstelle, Liter, Kosten). Dazu muss ich unbedingt eine neue Zeile einfügen, da noch weiter unten Zellen belegt sind. Wie schaffe ich das in meinem C#-Programm?

  25. Gravatar Stefan
    Am 18. Januar 2010 um 08:57 Uhr

    @Jürgen: Probier’s doch mal hiermit:

    Worksheet.Range("A1").EntireRow.Insert(xlShiftDown);
  26. Gravatar Jürgen
    Am 19. Januar 2010 um 20:48 Uhr

    @Stefan: Bedanke mich für die Antwort. Ich versuche bei Reihe 191 eine
    neue Zeile in meine Excel-Tabelle mit C#, Visual Studio 2008 Express
    einzufügen. Das Ergebnis war wie folgt:

    oSheet.Range(”A191″).EntireRow.Insert(xlShiftDown);

    Fehler 1 Die Eigenschaft, der Indexer oder das Ereignis “Range” wird von der Sprache nicht unterstützt. Rufen Sie die Microsoft.Office.Interop.Excel._Worksheet.get_Range(object, object)-Accessormethode direkt auf.

    Fehler 2 Der Name “xlShiftDown” ist im aktuellen Kontext nicht vorhanden.

    Ich habe es auch analog zu VBA für Excel versucht:
    ActiveSheet.Rows(191).Insert
    bekomme dann aber die Fehlermeldung, dass Rows keine Methode ist.
    Ich bin schon fast verzweifelt, finde kaum Doku oder Buch zum Thema
    C# und Excel-Automatisierung.
    Jürgen

  27. Gravatar Jürgen
    Am 19. Januar 2010 um 22:32 Uhr

    @Stefan: Du hast mich mit “EntireRow.Insert” auf die richtige Spur gebracht.
    Folgende zwei Zeilen funktionieren tatsächlich bei mir:

    oRng = oSheet.get_Range(”A191″, Missing.Value);
    oRng.EntireRow.Insert(Excel.XlInsertShiftDirection.xlShiftDown, false);

    wo oRng ein Range Objekt ist. Abenteuerlich, nicht wahr?

    Trotzdem habe ich noch immer keine vernünftige Doku zum Thema: “Automation von Excel mittels C# Programme” gefunden und tappt man mehr oder weniger im Dunkeln. Zu diesem Thema scheint es auch keine
    Bücher zu geben! Sonst wird man doch zugemüllt mit Titeln wie:
    Einstieg in ….. Schritt für Schritt usw.. VBA und Excel – jede Menge.
    C# und Excel – nichts.
    Jürgen

  28. Gravatar Dominik
    Am 14. April 2010 um 15:03 Uhr

    Danke der Code war sehr hilfreich :D

    mfg
    dom

  29. Gravatar Murat
    Am 22. Juli 2010 um 17:15 Uhr

    Hallo,

    ich habe den Code 1 zu 1 übernommen doch es funktioniert bei mir leider nicht. Ich bekomme zwar keine Fehlermeldung, doch das Programm macht bei mir scheinbar garnix.

    System:
    Visual Studio 2008
    Excel 2007

    Ich lege eine “Windows Form application” an und kopiere beide Codeteile in dieselbe Datei. Dann mache ich noch einen Button “button 1″. Das Form kommt auch, aber wenn ich auf den Button drücke passiert leider garnichts. Kann mir jemand weiterhelfen ?

  30. Gravatar Stefan
    Am 24. Juli 2010 um 23:29 Uhr

    @Murat: Der obige Code ist nicht 1-zu-1 lauffähig. Du musst schon noch ein Gerüst drumherum bauen…

  31. Gravatar MK
    Am 9. September 2010 um 11:04 Uhr

    Hallo,

    bei mir läuft der Code.
    Nun mein Problem: Ich möchte ein Macro ausführen daas in dem Excelsheet in einem Modul ist. Wie kann ich dieses Macro aufrufen?

    Gruß
    M

  32. Gravatar Stefan
    Am 10. September 2010 um 11:05 Uhr

    @MK: Sorry, das weiß ich leider nicht…

  33. Gravatar David Schonebeck
    Am 24. Januar 2011 um 22:43 Uhr

    Hier ist einige Info um Excel auch ohne com zu schreiben/
    einzulesen: http://www.schonebeck.net/?p=127

  34. Gravatar Zippo
    Am 24. Februar 2011 um 16:24 Uhr

    Hallo zusammen

    ich bin auf VS2010 umgestiegen. Verwende aber noch office2003.
    Wenn ich meine solution baue, kommt die meldung das die Office Assembly nicht passt. Ich lade mir die PIO2003 runter und installiere diese. Ich binde den Verweis (V12.0)ein. Der compiler meckert aber immernoch, weil er die V11.0 haben will. ich habe keine lust meinen code umzubauen. Könnt ihr mir bitte helfen ?
    mfg
    zippo

  35. Gravatar Käse
    Am 1. März 2011 um 01:52 Uhr

    Hallo alle zusammen!
    @Stefan, erstmal ein fettes dankeschön meinerseits für den Code und damit einen einstieg in die automatisierung von excel ;)
    Ich habe jedoch das Problem, dass bei Codezeile:
    7. excel = new Microsoft.Office.Interop.Excel.ApplicationClass();
    die Fehlermeldung kommt:
    Der Interoptyp “Microsoft.Office.Interop.Excel.ApplicationClass” kann nicht eingebettet werden. Verwenden Sie stattdessen die entsprechende Schnittstelle.”

    Ich verwende Excel 2007 und habe daher “Microsoft Excel 12.0 Object Library” als Verweis hinzugefügt.
    Den Verweis “Microsoft Excel 11.0 Object Library” gibt es bei meinem Visual Studio anscheinend auch nicht und so meine frage an dich:
    Bist du dir sicher dass dein Code auch bei Excel 2007 funktioniert?

    MfG, Käse ;)

  36. Gravatar Stefan
    Am 1. März 2011 um 10:30 Uhr

    @Käse: Danke für den Tipp. Der Code ist korrigiert (Quelle: Peter Torr: Don’t use ApplicationClass (unless you have to)).

  37. Gravatar Käse
    Am 1. März 2011 um 17:20 Uhr

    Danke dass du das behoben hast ^^
    Freut mich dass ich helfen konnte, obwohl ich neu in c# bin ;)

  38. Gravatar gilles
    Am 2. März 2011 um 18:22 Uhr

    wenn ich eine zweite Exceldatei ausser meinem Programm aufmache und die zumacht dann ist auch gleichzeitig die Datei, deren ich mit meinem Programm geöffnet habe zugemacht. wie kann ich es vermeiden

  39. Gravatar Stefan
    Am 3. März 2011 um 10:43 Uhr

    @gilles: Vielleicht könntest du einfach das excel.Quit(); weglassen.

  40. Gravatar R
    Am 18. April 2011 um 10:12 Uhr

    Sehr gutes Posting. Danke. bb

  41. Gravatar IM
    Am 10. Juni 2011 um 09:57 Uhr

    Hallo, danke für Deine 5-jährige!!! Unterstützung zu diesem Thema!

    Vielleicht kannst Du mir auch helfen. Ich möchte in einem Programm sowohl den Import von Excel 2007 als auch 2010 Dateien unterstützen, ohne dass der Nutzer angeben muss welche Version er importiert. Jetzt habe ich gehört, dass folgende Probleme auftreten:

    - Falls ich nur die Excel 2010 Bibliothek verwende, dann werden die 2007er Dateien automatisch konvertiert und die Tabellenstruktur kann verloren gehen.
    - Ich kann, ohne dass ich die Datei mit einer der Bibs aufmache, nicht entscheiden um welche Excel Version es sich handelt.

    Wäre super, wenn Du under jemand anderes hier mir diese Aussagen kommentieren könnte!
    Ich werde ja nicht die erste sein, die vor dieser Aufgabe steht, da muss es doch eine Lösung geben.

  42. Gravatar Stefan
    Am 12. Juni 2011 um 10:18 Uhr

    Mh… mir ist nicht bekannt, dass es einen Unterschied der Dateiformate zwischen 2007 und 2010 gibt. Wenn du ein Beispiel für eine 2007er Datei hättest, die “kaputt” geht, wenn man sie mit 2010 öffnet, könnte ich das mal nachstellen.

  43. Gravatar Martin
    Am 2. Juli 2011 um 09:14 Uhr

    Ich verwende den Code in einer ASP.NET-Seite zum Hochladen und Analysieren einer xlsx. Klappt in VS2010 wunderbar, leider nicht mehr, wenn ich die Seite in IIS7 veröffentliche. Habe mittlerweile die COM-Komponente korrekt berechtigt und komme bis zum Open des Workbooks:

    Microsoft.Office.Interop.Excel.Application excel = null;
    Workbook wb = null;
    excel = new Microsoft.Office.Interop.Excel.Application();
    excel.Visible = false;

    wb = excel.Workbooks.Open(xlsxFile,
    ExcelKonstanten.UpdateLinks.DontUpdate,
    ExcelKonstanten.ReadOnly,
    ExcelKonstanten.Format.Nothing,
    “”, // Passwort
    “”, // WriteResPasswort
    ExcelKonstanten.IgnoreReadOnlyRecommended,
    XlPlatform.xlWindows,
    “”, // Trennzeichen
    ExcelKonstanten.Editable,
    ExcelKonstanten.DontNotifiy,
    ExcelKonstanten.Converter.Default,
    ExcelKonstanten.DontAddToMru,
    ExcelKonstanten.Local,
    ExcelKonstanten.CorruptLoad.NormalLoad);

    Hier erhalte ich den Fehler, dass auf die Exceldatei nicht zugegriffen werden kann, weil schon geöffnet. Die Exceldatei steht in einem Ordner mit JEDER-Vollzugriffsrechten. Weiß nicht mehr weiter … bitte um Tipps, wo ich noch ansetzen könnte. Besten Dank, Martin

  44. Gravatar Martin
    Am 2. Juli 2011 um 09:17 Uhr

    Ergänzung, der genaue Fehler lautet:

    Microsoft Excel kann auf die Datei ‘C:\inetpub\ExcelAuswertung\App_Data\Excelfiles\test.xlsx’ nicht zugreifen. Dies kann mehrere Gründe haben:

    • Der Name des Dokuments oder der Pfad ist nicht vorhanden.
    • Das Dokument wird von einem anderen Programm verwendet.
    • Der Name der Arbeitsmappe, die gespeichert werden soll, ist identisch zu dem Namen eines anderen Dokuments, welches schreibgeschützt ist.

    Beschreibung: Unbehandelte Ausnahme beim Ausführen der aktuellen Webanforderung. Überprüfen Sie die Stapelüberwachung, um weitere Informationen über diesen Fehler anzuzeigen und festzustellen, wo der Fehler im Code verursacht wurde.

    Ausnahmedetails: System.Runtime.InteropServices.COMException: Microsoft Excel kann auf die Datei ‘C:\inetpub\ExcelAuswertung\App_Data\Excelfiles\test.xlsx’ nicht zugreifen. Dies kann mehrere Gründe haben:

    • Der Name des Dokuments oder der Pfad ist nicht vorhanden.
    • Das Dokument wird von einem anderen Programm verwendet.
    • Der Name der Arbeitsmappe, die gespeichert werden soll, ist identisch zu dem Namen eines anderen Dokuments, welches schreibgeschützt ist.

  45. Gravatar Stefan
    Am 2. Juli 2011 um 16:47 Uhr

    Sorry Martin, dazu kann ich dir leider auch nichts sagen :-(

  46. Gravatar Stefan
    Am 13. Juli 2011 um 00:16 Uhr

    Habe genau das gleiche Problem wie Martin, C# Webanwendung, gleiche Fehlermeldung beim Öffnen der Datei. Das seltsame ist auf einem anderen Server läuft der gleiche Binärcode einwandfrei, auch gleiche Office Version. Leider waren bisher im Internet keine Antworten zu finden, das Problem gibts aber öfters.

  47. Gravatar DJung
    Am 4. September 2011 um 21:39 Uhr

    Guten Abend,

    vielen Dank für den tollen Einstieg!
    Was mir noch fehlt ist das Schreiben von (einzelnen) Werten
    in die Excel-Tab (das Schreiben einer ganzen Zeile
    noch nicht probiert habe), vielleicht habe ich es auch nur nicht
    gesehen, so oder so wäre ein Tip sehr hilfreich.

    Versucht habe ich bisher

    Object[] args = new Object[1];
    args[0] = 6;
    aRange.GetType().InvokeMember(”Value”,
    BindingFlags.SetProperty, null, aRange, args);
    aRange.Value2 = 8;

    Verwenden von COM-Interop zum Erstellen einer
    Excel-Kalkulationstabelle
    (http://msdn.microsoft.com/de-de/library/ms173186%28v=vs.80%29.aspx#Y611)

    bzw.
    excelRange.Cells.set_Item(row, col, value);
    von Set cell value using Excel interop
    (http://stackoverflow.com/questions/4811664/set-cell-value-using-excel-interop)

    Beides leider ohne Erfolg, würde mich freuen, wenn jemand eine
    weitere Idee hat.

    Im voraus vielen Dank
    :-)

  48. Gravatar DJung
    Am 5. September 2011 um 20:21 Uhr

    Guten Abend :-)
    schon schade, wenn man ReadOnly in Zeile 14 übersieht.
    Wobei Excel auch artig fragt, ob die Datei überschrieben werden soll
    und keine Fehlermeldung bringt.

    nochmal vielen Dank für die Seite
    Gruß D

  49. Gravatar Kobold
    Am 11. Oktober 2011 um 18:22 Uhr

    @Martin
    Hast du es schon mal mit einem Virtuellen Verzeichnis probiert?
    Bei hat es danach funktioniert.

    LG

  50. Gravatar Kobold
    Am 11. Oktober 2011 um 18:22 Uhr

    @Martin
    Hast du es schon mal mit einem Virtuellen Verzeichnis probiert?
    Bei mir hat es danach funktioniert.

    LG

  51. Gravatar Erwin
    Am 7. November 2011 um 09:59 Uhr

    Hi,

    Ich habe win7 64 bit, office 2010 und vs2008. Ich kann die Microsoft Excel 14.0 Object Library nicht finden. Bei mir ist nur die 12.0 vorhanden.

    Grüße, Oli

  52. Gravatar Karsten
    Am 1. Dezember 2011 um 13:40 Uhr

    Danke für die Hilfe, das funktioniert auch soweit alles ganz gut, jedoch springt er bei mir direkt zum Ende wenn er eine leere Zelle erwischt.

    Ein Codeausschnitt

    if (crange11.Value.ToString() != null)
    { czellwert11 = crange11.Value2.ToString();
    czellwertint11 = Convert.ToInt16(czellwert11);
    }
    else
    {czellwertint11 = 0;}

    Wenn die Zelle leer ist, geht er einfach nicht in die Else-Schleife.

    Hat jemand eine Lösung???

  53. Gravatar Karsten
    Am 1. Dezember 2011 um 14:15 Uhr

    Hat sich erledigt, wenn eine Zelle leer ist, kann man sie nicht in einen String umwandeln, heißt in

    if (crange11.Value.ToString() != null)

    muss das .ToString() rausgenommen werden

  54. Gravatar Moritz
    Am 25. Januar 2012 um 18:25 Uhr

    Vielen Dank!!!

    Super Anleitung hat mir sehr geholfen!

Einen Kommentar schreiben

XHTML: Diese Tags sind erlaubt: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>