Benutzer mit den meisten Antworten
C# Programm für alle Versionen von MS-Excel

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
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- Als Antwort vorgeschlagen Pawel Warmuth Donnerstag, 22. September 2011 06:58
- Als Antwort markiert Robert BreitenhoferModerator Montag, 26. September 2011 07:35
-
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.aspxGruß
Marcel- Als Antwort vorgeschlagen Pawel Warmuth Donnerstag, 22. September 2011 06:58
- Als Antwort markiert Robert BreitenhoferModerator Montag, 26. September 2011 07:35
-
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
- Bearbeitet Pawel Warmuth Donnerstag, 22. September 2011 07:00
- Als Antwort vorgeschlagen Pawel Warmuth Donnerstag, 22. September 2011 12:59
- Als Antwort markiert Robert BreitenhoferModerator Montag, 26. September 2011 07:35
-
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
- Als Antwort vorgeschlagen Pawel Warmuth Donnerstag, 22. September 2011 12:59
- Als Antwort markiert Robert BreitenhoferModerator Montag, 26. September 2011 07:34
-
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(); }
- Als Antwort vorgeschlagen Pawel Warmuth Donnerstag, 22. September 2011 12:59
- Als Antwort markiert Robert BreitenhoferModerator Montag, 26. September 2011 07:34
-
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
- Bearbeitet Robert BreitenhoferModerator Donnerstag, 22. September 2011 09:20 "wenn nicht" eingefuegt
- Als Antwort vorgeschlagen Pawel Warmuth Donnerstag, 22. September 2011 12:59
- Als Antwort markiert Robert BreitenhoferModerator Montag, 26. September 2011 07:34
Alle Antworten
-
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
-
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- Als Antwort vorgeschlagen Pawel Warmuth Donnerstag, 22. September 2011 06:58
- Als Antwort markiert Robert BreitenhoferModerator Montag, 26. September 2011 07:35
-
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.aspxGruß
Marcel- Als Antwort vorgeschlagen Pawel Warmuth Donnerstag, 22. September 2011 06:58
- Als Antwort markiert Robert BreitenhoferModerator Montag, 26. September 2011 07:35
-
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
- Bearbeitet Pawel Warmuth Donnerstag, 22. September 2011 07:00
- Als Antwort vorgeschlagen Pawel Warmuth Donnerstag, 22. September 2011 12:59
- Als Antwort markiert Robert BreitenhoferModerator Montag, 26. September 2011 07:35
-
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
- Als Antwort vorgeschlagen Pawel Warmuth Donnerstag, 22. September 2011 12:59
- Als Antwort markiert Robert BreitenhoferModerator Montag, 26. September 2011 07:34
-
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(); }
- Als Antwort vorgeschlagen Pawel Warmuth Donnerstag, 22. September 2011 12:59
- Als Antwort markiert Robert BreitenhoferModerator Montag, 26. September 2011 07:34
-
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
- Bearbeitet Robert BreitenhoferModerator Donnerstag, 22. September 2011 09:20 "wenn nicht" eingefuegt
- Als Antwort vorgeschlagen Pawel Warmuth Donnerstag, 22. September 2011 12:59
- Als Antwort markiert Robert BreitenhoferModerator Montag, 26. September 2011 07:34