C# Exel nach Datagridview

Horst1945

Cadet 4th Year
Registriert
Okt. 2014
Beiträge
106
Hallo

Ich möchte eine Excel-Datei ins Datagridview1 importieren:

excel.jpg

Code:
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Data.SqlClient;

namespace WindowsFormsApplication1
{
    public partial class offenLief : Form
    {
        

       
        public offenLief()
        {
            InitializeComponent();
        }

        private void start_Click(object sender, EventArgs e)
        {
            //string strPath = "C:\Users\User\Documents\stammdaten.xlms";
            string constr= "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + txtPath.Text + "; ExtendedProperties=\"Excel 10.0;HDR=YES;\"";


            
        
            OleDbConnection con = new OleDbConnection(constr);
            OleDbDataAdapter adapter = new OleDbDataAdapter("Select * from ['" + txtDatei.Text + "$']", con);
            DataTable dt = new DataTable();
            adapter.Fill(dt);
            dataGridView1.DataSource = dt;
           
        }
    }
}

Leider bekomme ich immer die Fehlermeldung: Zusätzliche Informationen: Installierbares ISAM nicht gefunden

Horst
 
Ich meine das könnte ein Problem mit Hochzeichen in deinem ConnectionString sein. Versuche bitte folgendes:

Code:
string constr= "Provider=Microsoft.ACE.OLEDB.12.0; Data Source='" + txtPath.Text + "'; ExtendedProperties='Excel 10.0;HDR=YES'";

Hier schenk ich dir:

Code:
        private static DataTable ReadExcelSheet(string filePath, string sheetName)
        {
            DataTable table = new DataTable();
            ValidateSheetName(ref sheetName);
            try
            {
                OleDbConnection connection;
                DataSet DtSet;
                OleDbDataAdapter cmd;
                connection = new OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + filePath + "';Extended Properties='Excel 12.0 Xml;HDR=NO;IMEX=1'");
                cmd = new OleDbDataAdapter("select * from [" + sheetName + "]", connection);
                cmd.TableMappings.Add("Table", sheetName.Replace("$", string.Empty));
                DtSet = new DataSet();
                cmd.Fill(DtSet);
                table = DtSet.Tables[0];
                connection.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

            return table;
        }

        public static List<string> GetSheetNames(string filePath)
        {
            List<string> sheetNames = new List<string>();
            DataTable dt = null;

            try
            {
                OleDbConnection connection = new OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + filePath + "';Extended Properties='Excel 12.0 Xml;HDR=NO;IMEX=1'");
                connection.Open();
                dt = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

                if (dt == null)
                {
                    return null;
                }

                // Add the sheet name to the string array.
                foreach (DataRow row in dt.Rows)
                {
                    sheetNames.Add(row["TABLE_NAME"].ToString());

                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            return sheetNames;
        }

        public static List<DataTable> ConvertExcelToTables(string filePath)
        {
            List<string> sheetNames = GetSheetNames(filePath);
            List<DataTable> tableList = new List<DataTable>();

            foreach (string sheetName in sheetNames)
            {
                tableList.Add(ReadExcelSheet(filePath, sheetName));
            }

            return tableList;
        }

        public static void ValidateSheetName(ref string sheetName)
        {
            sheetName = sheetName.EndsWith("$") ? sheetName : sheetName + "$";
        }

Da musst du nur noch ConvertExcelToTables aufrufen und den dateipfad angeben, bekommst eine Liste mit sämtlichen Tabellen zurück. Muss dazu aber sagen OleDb für Excel solltest du nur nehmen wenn deine Anforderungen mikroskopisch klein sind. Ansonsten würde ich Interop nehmen.

Gruß,
Käsebrot
 
Zuletzt bearbeitet:
IKäsebrot schrieb:
Ich meine das könnte ein Problem mit Hochzeichen in deinem ConnectionString sein. Versuche bitte folgendes:

Code:
string constr= "Provider=Microsoft.ACE.OLEDB.12.0; Data Source='" + txtPath.Text + "'; ExtendedProperties='Excel 10.0;HDR=YES'";

Habe die Hochzeichen gemacht und immer noch der Fehler!
 
Alles gut und schön, aber wie muss ich das Einsetzen, denn ich bin Neuling in Visual C#
 
Meinst du die Methoden oben? Wenn ja:

1. Erstelle Klasse (mach sie statisch).
2. Kopiere alle Methoden rein.
3. Rufe die Methode ConvertExcelToTables da wo du sie brauchst und übergib ihr den Pfad zur Excel-Datei.
4. Du bekommst eine Liste mit Tabellen als Rückgabewert.

Das könnte so aussehen:

Code:
//txtPath muss den gesamten Pfad enthalten
List<DataTable> liste = ConvertExcelToTables(txtPath.Text);

//Jetzt kannst du beliebig Tabellen aus der Liste an deine DataGridView binden
dataGridView1.DataSource = liste[0];

Hoffe es hilft. Ansonsten wie gesagt guck dir Interop an.
 
Noch nicht so richtig verstanden!

excel2.jpg

So wenn ich den Button Start gedrückt habe, wie geht die weiter vorgewiesen weiter ?
 
Zuletzt bearbeitet:
Ich bin bis hier gekommen:

Code:
public partial class offenLief : Form
    {
        

       
        public offenLief()
        {
            InitializeComponent();
        }

         private static DataTable ReadExcelSheet(string filePath, string sheetName)
         {
               DataTable table = new DataTable();
               ValidateSheetName(ref sheetName);
              try
           {
                OleDbConnection connection;
                DataSet DtSet;
                OleDbDataAdapter cmd;
                connection = new OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + filePath + "';Extended Properties='Excel 12.0 Xml;HDR=NO;IMEX=1'");
                cmd = new OleDbDataAdapter("select * from [" + sheetName + "]", connection);
                cmd.TableMappings.Add("Table", sheetName.Replace("$", string.Empty));
                DtSet = new DataSet();
                cmd.Fill(DtSet);
                table = DtSet.Tables[0];
                connection.Close();

Und den Rest deine Hilfe! 
            }

Danach weiß ich nicht mehr weite!
 
Zuletzt bearbeitet:
Erstell einfach eine neue Anwendung (z.b. eine neue Konsolenanwendung). Jetzt füge eine neue Klasse hinzu:

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.OleDb;
using System.Data;

namespace DeinNamespace
{
    public static class DeineKlasse
    {
    }
}

In diese Klasse kopierst du alle Methoden von oben. Jetzt kannst du dir alle Tabellen aus deine Excel-Datei Ausgeben lassen, so z.B.:

Code:
string pfad = "dein pfad hier...";
List<DataTable> tabellen = DeineKlasse.ConvertExcelToTables(pfad);
dataGridView1.DataSource = tabellen[0];

Jetzt iterierst du durch die Liste und holst dir was du brauchst.

Wie gesagt alternativ würde ich mir Interop angucken.

Hoffe ich konnte helfen,
Gruß
 
Zuletzt bearbeitet:
@IKäseBrot.

Ich habe das so gemacht wie du es mir beschrieben hast:

Code:
 private void btnShow_Click(object sender, EventArgs e)
        {
            List<DataTable> liste = ConvertExcelToTables(txtPath.Text);
        }

ich komme auch in der Klasse rein

tableLIst.jpg

Aber wie bekomme ich das weiterhin. muss ich mir in der Form erst eine listbox oder ein listview anlegen um anschließend das DataGridView aufrufen zu können?
Ergänzung ()

Nach einigen Schwierigkeiten habe ich es endlich geschafft die Excel-Datei in das DataGridView zu laden.

Besten Dank an @IKäsebrot
Ergänzung ()

GridLIst.jpg
 
Horst1945 schrieb:
@IKäseBrot.

Ich habe das so gemacht wie du es mir beschrieben hast:

Code:
 private void btnShow_Click(object sender, EventArgs e)
        {
            List<DataTable> liste = ConvertExcelToTables(txtPath.Text);
        }

ich komme auch in der Klasse rein

Anhang anzeigen 452995

Aber wie bekomme ich das weiterhin. muss ich mir in der Form erst eine listbox oder ein listview anlegen um anschließend das DataGridView aufrufen zu können?
Ergänzung ()

Nach einigen Schwierigkeiten habe ich es endlich geschafft die Excel-Datei in das DataGridView zu laden.

Besten Dank an @IKäsebrot
Ergänzung ()

Anhang anzeigen 453000

Sehr gerne! Aber wie schon mehrmals gesagt wenn du weiterhin effektiv mit Excel arbeiten möchtest guck dir die Interop-Klassen an. Die sind aktueller und können mehr (bezüglich Excel) als OleDb.

Gruß und weiterhin viel erfolg!
 
Zurück
Oben