Laden...

Mit C# in eine Excel-Tabelle schreiben - Microsoft.Office.Interop-Verweise fehlen

Erstellt von samkirchner vor 7 Jahren Letzter Beitrag vor 7 Jahren 3.686 Views
S
samkirchner Themenstarter:in
15 Beiträge seit 2016
vor 7 Jahren
Mit C# in eine Excel-Tabelle schreiben - Microsoft.Office.Interop-Verweise fehlen

Hallo liebe C#´ler,

trotz einiger gelesenen Hilfestellungen im Netz bin ich leider nicht im Stande in eine Excel-Tabelle zu schreiben.

Einerseits habe ich bei CodeProjekt diesen Link über OLEDB gefunden, welcher leider net geht:

http://www.codeproject.com/Tips/705470/Read-and-Write-Excel-Documents-Using-OLEDB

Andererseits habe ich auch MSDN bemüht mit folgendem Link:

https://msdn.microsoft.com/de-de/library/ee342218.aspx

Den Link von CodeProjekt habe ich abgeschrieben und sieht wie folgt aus:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Hopfengarten.Model;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;

namespace Hopfengarten
{
    class Excel
    {
        public Excel()
        {
           
        }

        private string VerbindungsStringErstellen()
        {
            Dictionary<string, string> eigenschaften = new Dictionary<string, string>();
            
            //XLSX - Excel 2007, 2010, 2012, 2013
            eigenschaften["Provider"] = "Microsoft.ACE.OLEDB.12.0;";
            eigenschaften["Extended Properties"] = "Excel 12.0 XML";
            eigenschaften["Data Source"] = @"Hopfengarten.xlsx";

            StringBuilder sb = new StringBuilder();

            foreach (KeyValuePair<string, string> eigenschaft in eigenschaften)
            {
                sb.Append(eigenschaft.Key);
                sb.Append('=');
                sb.Append(eigenschaft.Value);
                sb.Append(';');
            }
            
            return sb.ToString();
        }


        public  void SchreibeInExcel()
        {
            string VerbindungsString = VerbindungsStringErstellen();

            using (OleDbConnection con = new OleDbConnection(VerbindungsString))
            {
                try
                {
                    con.Open();
                    OleDbCommand cmd = new OleDbCommand();
                    cmd.Connection = con;
                    
                    MessageBox.Show("Verbindung zu Excel hergestellt");

                    con.Close();
                }
                catch
                {
                    MessageBox.Show("Verbindung zur Excel-Tabelle fehlgeschlagen!");
                }
                con.Close();
            }
        }
    }
}

Leider fliege ich permanent bei con.Open() in den catch rein, was ja bedeutet es konnte keine Verbindung aufgebaut werden.

Wenn ich den Anweisungen von der MSDN folge, scheitere ich da es kein Microsoft.Office.Interop
in den Verweisen gibt 😦

Weiß jmd vlt was ich nu machen kann? Habe gestern auch gelesen das man ab Office 2003 besser XML verwenden soll, da es scheinbar schneller ist, doch das war mir zu hoch, war glaub ich auch ein Thread von hier!

Ich will lediglich in Excel schreiben und dann (wenn es möglich ist) von C# die Excel ausdrucken lassen.

Wäre über Hilfe sehr dankbar, es gibt zwar echt viel im Net davon, aber leider für einen Anfänger alles ein wenig zu hoch 😉

lg Samkirchner

PS: Obwohl ich die einfachen Grundstrukturen kenne, fällt es mir schwer den von mir oben eingefügten Code zu verstehen. Selbstverständlich weiß ich was ne Dictionary ist und was die Foreach macht, doch was der StringBuilder macht, bin ich ratlos.

Liebe Grüße

Sam

16.807 Beiträge seit 2008
vor 7 Jahren
  1. bitte im Titel angeben, was das Problem ist. So hilft das keinem was.
  2. man fängt in einem catch die Exception. Dort drin steht dann, was das Problem ist.
catch(Exception ex)

Den Fehler schaut man sich dann zB im Debugger an
[Artikel] Debugger: Wie verwende ich den von Visual Studio?

Wenn Du nicht weißt, was eine C# Klasse macht und sie gehört zum Framework, dann schau bitte in die Dokumentation. Dafür ist sie da.
StringBuilder-Klasse
In der Regel - wie bei der StringBuilder-Klasse - zeigt die MSDN zudem ausführliche Beispiele, wie die Klasse verwendet wird und was das Resultat dessen ist.

Man kann aber auch weiterhin den Debugger dazu verwenden, um zu schauen, was eine Klasse macht, wenn man es nicht weiß und/oder man aus der Verwendung im Quellcode nicht schlau wird.
Hier ist ja zu sehen, dass der StringBuilder wohl eine Methode mit dem Namen AppendLine hat, der Strings annimmt.
Zusammen mit dem Namen StringBuilder könnte man jetzt herleiten, dass diese Klasse wohl strings zusammen kettet.
Ansonsten wie gesagt die Doku sollte hier der erste Anlaufpunkt sein.

Microsoft.Office.Interop muss übrigens via Lazy Binding referenziert wird (bzw. wird es in der Regel so gemacht).
Alternativ gibt es Wrapper wie zB NetOffice (http://netoffice.codeplex.com/).

S
samkirchner Themenstarter:in
15 Beiträge seit 2016
vor 7 Jahren

Danke für die schnelle Antwort 😃

  1. bitte im Titel angeben, was das Problem ist. So hilft das keinem was.
  2. man fängt in einem catch die Exception. Dort drin steht dann, was das Problem ist.

im Anhang habe ich die Ex hinzugefügt, was mir allerdings ein Rätsel ist.

Den Fehler schaut man sich dann zB im Debugger an

>

Wenn Du nicht weißt, was eine C# Klasse macht und sie gehört zum Framework, dann schau bitte in die Dokumentation. Dafür ist sie da.

>

In der Regel - wie bei der StringBuilder-Klasse - zeigt die MSDN zudem ausführliche Beispiele, wie die Klasse verwendet wird und was das Resultat dessen ist.

Dies habe ich selbstverständlich gemacht, jedoch ohne für mich schlüssigen Erfolg

Microsoft.Office.Interop muss übrigens via Lazy Binding referenziert wird (bzw. wird es in der Regel so gemacht).
Alternativ gibt es Wrapper wie zB NetOffice (
>
).

Hier verstehe ich mal wieder nur Bahnhof 😦

Sorry wenn ich mich dumm anstelle jedoch ist es als Newbie einfach alles sagen wir mal unverständlich! Ich meine ich habe viel gelernt aber trotzdem noch ein Anfänger, welcher das meiste Zeug net versteht, selbst wenn man mehrere Erklärungen liest (kennt glaub jeder 😉 ).

Liebe Grüße

Sam

771 Beiträge seit 2009
vor 7 Jahren

Die Fehlermeldung ist doch eindeutig - einfach mal nach "OLEDB 12.0" suchen und dann findet man z.B. OleDB Connection zur Access DB

H
523 Beiträge seit 2008
vor 7 Jahren

Hallo Sam,

die Fehlermeldung ist doch recht eindeutig: Der Provider ist nicht installiert. Ergo, installiere den Provider (z. B. den hier) und versuche es nochmal.

Einfach mal nach Microsoft.ACE.OLEDB.12.0 googlen, da kommen direkt Lösungsvorschläge.

S
samkirchner Themenstarter:in
15 Beiträge seit 2016
vor 7 Jahren

Die Fehlermeldung ist doch eindeutig - einfach mal nach "OLEDB 12.0" suchen und dann findet man z.B.
>

hm, auf der Seite war ich auch schon, aber da da für Access stand habe ich das verworfen ^^.

Und sehe da es funzt ! Mensch es ist echt anstrengend, denn da mache ich schon knapp 3 Tage rum 😦.

Danke Cat 😃

Liebe Grüße

Sam

190 Beiträge seit 2012
vor 7 Jahren

Hallo

zum Thema StringBuilder hier mal was zum lesen:

Die Klasse »StringBuilder«

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

L
136 Beiträge seit 2015
vor 7 Jahren

Hallo SamKirchner,

Als Alternative ist auch OpenXML empfehlenswert.

Gruss Lhyn

J
5 Beiträge seit 2016
vor 7 Jahren

Für mich schaut das nach einem 32 / 64 bit Problem aus.
Der Zugriff auf die OLEDB funktioniert von 64 bit Windows nicht korrekt, da hat sich schon so manch einer die Zähne ausgebissen.
Die Einstellung des Projekts mal auf X86 umstellen, könnte helfen 😁

16.807 Beiträge seit 2008
vor 7 Jahren

.. er hat das Problem bereits gelöst 😃