none
C# Programm für alle Versionen von MS-Excel RRS feed

  • Frage

  • Hallo,

    in meinem Programm kann ich eine Excle-Datei lesen, aber das funktioniert leider mit MS-Excel 2007 und 2010.

    Wie muss ich mein Programm ändern, damit ich alte Versionen ( Z.B 2000) auch lesen kann?

    Wenn ich versuche, alte Excel-Tabelle( 2000) zu lesen, reagiert das Programm nicht mehr.

     

    Viele Grüße

    mmx2010

    Mittwoch, 21. September 2011 09:05

Antworten

  • Hallo mm.,

    Möglichkeit 1: man benutzt normal entweder spät gebundene Techniken wie :

    Type exelTyp = Type.GetTypeFromProgID ("Excel.Application");
    
    

    etc. (analog zu [diesem] - heutzutage dann eher mit dem dynamic - Typ (s. Beispiel COM-Interop).

    Je nach Wunsch auch Dinge wie:

    [LateBindingApi.Excel]
    http://excel.codeplex.com/

    ______________________

    Möglichkeit 2: oder bindet die tiefste zu unterstützende IA / PIA in das Projekt ein.
    Nutzt dann diese Methoden tysicher und schaut bei Methoden, deren Signatur sich bei
    anderen Office-Versionen unterscheidet (oder neu ist) dass man dort ggf. andere Aufrufe verwendet.
    Dies nur ganz kurz als Überblick.

     

     


    ciao Frank
    Donnerstag, 22. September 2011 05:40
  • Hallo mmx2010,

    Wenn Euer Budget das erlaubt, würde ich mir - zusätzlich zu den hier bereits aufgeführten Optionen - Aspose.Cells für .NET ansehen. Das Produkt is sehr flexibel und unterstützt Excel 97 / 2000 / XP / 2007 / 2010 (XLSX).

    Aspose.Cells für .NET (Features):
    http://www.aspose.com/categories/.net-components/aspose.cells-for-.net/key-features.aspx

    Gruß
    Marcel

    Donnerstag, 22. September 2011 06:03
    Moderator
  • Hallo ,

    möglichkeit 3 : OleDB. Wichtig : Im connectionstring solltest du, wegen gemischten zeilentypen , den Wert

    IMEX=1
    

    setzten.

    Ein fertiger ConnextionString sieht dann zb so aus :

     

     

    private string GetExcelConnectionString(string filePath)
            {
                return String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=\"{0}\";Extended Properties=\"Excel 8.0;IMEX=1\"", filePath);
            }
    

    Mehr zu den passenden Connectionstrings findest du Hier

     


    Donnerstag, 22. September 2011 07:00
  • Hallo mmx2010,

    Andere Möglichkeit mit Microsoft.Jet.OLEDB.4.0 und ""Excel 8.0;HDR=Yes;"" (man muss aber den Namen des Arbeitsblatt kennen…in dem Beispiel ANSWERED)

    [C# Beispiel]

            private void button1_Click(object sender, EventArgs e)
            {
                DataTable fooData = new DataTable();
                OleDbConnection dbConnection =
                  new OleDbConnection
                    (@"Provider=Microsoft.Jet.OLEDB.4.0;"
                     + @"Data Source=C:\Temp\ThreadList.xls;"
                     + @"Extended Properties=""Excel 8.0;HDR=Yes;""");
                dbConnection.Open();
                try
                {
                    OleDbDataAdapter dbAdapter =
                        new OleDbDataAdapter
                            ("SELECT * FROM [ANSWERED$]", dbConnection);
                    dbAdapter.Fill(fooData);
                    
                    BindingSource bSource = new BindingSource();
    
                    bSource.DataSource = fooData;
    
                    dgView.DataSource = bSource;
                }
                finally
                {
                    dbConnection.Close();
                }
            }
    
    

     

    Grüße,

    Robert

    Donnerstag, 22. September 2011 08:08
    Moderator
  • Hallo mmx2010,

    um zB alle Sheets aus einer Exceltabelle zu lesen geht folgendes :

            private DataSet GetData(string filePath)
            {
                var set = new DataSet(Path.GetFileName(filePath));
                using (var connection = new OleDbConnection(GetExcelConnectionString(filePath)))
                {
                    var tablenames = GetDataSheetName(connection.GetSchema("Tables"));
    
                    foreach (string s in tablenames)
                    {
                        var select = String.Format("SELECT * FROM [{0}]", s.Replace("'", ""));
                        try
                        {
                            using (var adapter = new OleDbDataAdapter(select, connection))
                            {
                                var dt = new DataTable(s);
                                adapter.Fill(dt);
                                set.Tables.Add(dt);
                            }
                        }
                        catch (Exception ex)
                        {
    
                        }
                    }
                }
    
                return set;
            }
      private IEnumerable<string> GetDataSheetName(DataTable table)
            {
                return from DataRow row in table.Rows select row["TABLE_NAME"].ToString();
            }
    
    


    Donnerstag, 22. September 2011 08:36
  • Hallo mmx2010,
     
    Andere Möglichkeit um z.B. alle Arbeitsblätter aus einer Exceltabelle zu lesen ist:
     

    DataTable dbSchema = dbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
    

     
    und nachher durch alle .Rows gehen aber nur wenn nicht
     
    if (dbSchema == null || dbSchema.Rows.Count < 1)
    

     
    Grüße,
     
    Robert
     

     


    Donnerstag, 22. September 2011 09:15
    Moderator

Alle Antworten

  • Hallo,

    welche Technologie nutzt du um Exceldateien zu lesen ?

    Ohne diese Infos können wir dir kaum helfen ;-)

    Grüße

    Mittwoch, 21. September 2011 11:23
  • hallo Pawel,

    danke für deine Antwort.

    Ich benutze   "Microsoft.Office.Interop.Excel.Application  " keine jet OLEDB.

    Ich habe auch mit jet OLEDB 4.0 auch die Daten in einem Dataset gespeichert, aber einige Daten wurden nicht in Dataset übernommen, ich weiß nicht warum?

     

    Viele Grüße

    Mittwoch, 21. September 2011 19:06
  • Hallo mm.,

    Möglichkeit 1: man benutzt normal entweder spät gebundene Techniken wie :

    Type exelTyp = Type.GetTypeFromProgID ("Excel.Application");
    
    

    etc. (analog zu [diesem] - heutzutage dann eher mit dem dynamic - Typ (s. Beispiel COM-Interop).

    Je nach Wunsch auch Dinge wie:

    [LateBindingApi.Excel]
    http://excel.codeplex.com/

    ______________________

    Möglichkeit 2: oder bindet die tiefste zu unterstützende IA / PIA in das Projekt ein.
    Nutzt dann diese Methoden tysicher und schaut bei Methoden, deren Signatur sich bei
    anderen Office-Versionen unterscheidet (oder neu ist) dass man dort ggf. andere Aufrufe verwendet.
    Dies nur ganz kurz als Überblick.

     

     


    ciao Frank
    Donnerstag, 22. September 2011 05:40
  • Hallo mmx2010,

    Wenn Euer Budget das erlaubt, würde ich mir - zusätzlich zu den hier bereits aufgeführten Optionen - Aspose.Cells für .NET ansehen. Das Produkt is sehr flexibel und unterstützt Excel 97 / 2000 / XP / 2007 / 2010 (XLSX).

    Aspose.Cells für .NET (Features):
    http://www.aspose.com/categories/.net-components/aspose.cells-for-.net/key-features.aspx

    Gruß
    Marcel

    Donnerstag, 22. September 2011 06:03
    Moderator
  • Hallo ,

    möglichkeit 3 : OleDB. Wichtig : Im connectionstring solltest du, wegen gemischten zeilentypen , den Wert

    IMEX=1
    

    setzten.

    Ein fertiger ConnextionString sieht dann zb so aus :

     

     

    private string GetExcelConnectionString(string filePath)
            {
                return String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=\"{0}\";Extended Properties=\"Excel 8.0;IMEX=1\"", filePath);
            }
    

    Mehr zu den passenden Connectionstrings findest du Hier

     


    Donnerstag, 22. September 2011 07:00
  • Hallo mmx2010,

    Andere Möglichkeit mit Microsoft.Jet.OLEDB.4.0 und ""Excel 8.0;HDR=Yes;"" (man muss aber den Namen des Arbeitsblatt kennen…in dem Beispiel ANSWERED)

    [C# Beispiel]

            private void button1_Click(object sender, EventArgs e)
            {
                DataTable fooData = new DataTable();
                OleDbConnection dbConnection =
                  new OleDbConnection
                    (@"Provider=Microsoft.Jet.OLEDB.4.0;"
                     + @"Data Source=C:\Temp\ThreadList.xls;"
                     + @"Extended Properties=""Excel 8.0;HDR=Yes;""");
                dbConnection.Open();
                try
                {
                    OleDbDataAdapter dbAdapter =
                        new OleDbDataAdapter
                            ("SELECT * FROM [ANSWERED$]", dbConnection);
                    dbAdapter.Fill(fooData);
                    
                    BindingSource bSource = new BindingSource();
    
                    bSource.DataSource = fooData;
    
                    dgView.DataSource = bSource;
                }
                finally
                {
                    dbConnection.Close();
                }
            }
    
    

     

    Grüße,

    Robert

    Donnerstag, 22. September 2011 08:08
    Moderator
  • Hallo mmx2010,

    um zB alle Sheets aus einer Exceltabelle zu lesen geht folgendes :

            private DataSet GetData(string filePath)
            {
                var set = new DataSet(Path.GetFileName(filePath));
                using (var connection = new OleDbConnection(GetExcelConnectionString(filePath)))
                {
                    var tablenames = GetDataSheetName(connection.GetSchema("Tables"));
    
                    foreach (string s in tablenames)
                    {
                        var select = String.Format("SELECT * FROM [{0}]", s.Replace("'", ""));
                        try
                        {
                            using (var adapter = new OleDbDataAdapter(select, connection))
                            {
                                var dt = new DataTable(s);
                                adapter.Fill(dt);
                                set.Tables.Add(dt);
                            }
                        }
                        catch (Exception ex)
                        {
    
                        }
                    }
                }
    
                return set;
            }
      private IEnumerable<string> GetDataSheetName(DataTable table)
            {
                return from DataRow row in table.Rows select row["TABLE_NAME"].ToString();
            }
    
    


    Donnerstag, 22. September 2011 08:36
  • Hallo mmx2010,
     
    Andere Möglichkeit um z.B. alle Arbeitsblätter aus einer Exceltabelle zu lesen ist:
     

    DataTable dbSchema = dbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
    

     
    und nachher durch alle .Rows gehen aber nur wenn nicht
     
    if (dbSchema == null || dbSchema.Rows.Count < 1)
    

     
    Grüße,
     
    Robert
     

     


    Donnerstag, 22. September 2011 09:15
    Moderator
  •  

    Hallo liebe Leute,

     

    ich danke euch für eure gute Unterstützung.

     

    Vuele Grüße

     

    mmx2010

    Sonntag, 25. September 2011 15:56
  • Hallo mmx2010,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Montag, 26. September 2011 07:34
    Moderator