C# Excel Tabelle auslesen unter 64bit?

domidragon

Fleet Admiral
Registriert
Juli 2008
Beiträge
11.532
Huhu

Suche seit Stunden eine möglichkeit Excel Tabellen auszulesen. Nichts scheint zu klappen wegen dem 64bit. Angeblich gibt es nur 32bit treiber :(

Hab es mit ADO.net versucht, aber da gelangt man in ein 32/64 Teufelskreis.
Ich brauch die applikation in 64Bit, also ein umsteigen auf 32 bit ist keine lösung. Das ganze muss leider mit Excel 32bit funktionieren.

Hat das einer schon mal hinbekommen und kann mir kurz den Lösungsweg weisen?

OleDbConnection con = new OleDbConnection();
con.ConnectionString = "Data Source=" + _strExcelFilename +
";Provider=Microsoft.ACE.OLEDB.12.0;";
con.ConnectionString += @"Extended Properties=""Excel 8.0;HDR=No""";
try
{
con.Open();
}

Aktueller stand, der klappt aber eben nicht, da er immer die Meldung bringt, der provider sei nicht installiert. Diese kommt aber eben leider auch, wenn er auf 32bit modul zugreiffen will...

Habe schon alle Stringconnections möglichkeiten getestet, geht keine.

kann man excel sheets auch anders auslesen als mit OleDB? vlt. mit ODBC?

oder führt kein weg drumheurm, dass ganze in eine SQL Datenbank zu exprotieren? gibts denn da keine probleme mit 64/32 bit?

danke

greez
 
Hm das hab ich erst demletzt gemacht. Bekomm es auswendig aber gerade auch nicht mehr auf die Reihe. Wenn du noch etwas Zeit hast, dann kann ich dir heute Abend, wenn ich zuhause bin meinen Code zeigen.
Hab auch eine Weile gebraucht bis es lief.
 
Zuletzt bearbeitet:
Hier stand müll...

Edit:
Vllt mal was suchen mit dem du die exceldatei direkt in CSV umwandeln kannst und dann einfahc die CSV einlesen
 
Zuletzt bearbeitet:
Wird gemacht. bin aber erst so gegen 19 Uhr daheim.
 
Also bei mir funktioniert es so:

Code:
public void readXLSX( string filename )
{
            // Establish Excel connection
            string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties='Excel 12.0;'";

            // connect to excel file
            OleDbDataAdapter dataAdapter = new OleDbDataAdapter("select * from [Tabelle1$]", connectionString);
            DataSet myDataSet = new DataSet( );

            // read first table of file
            dataAdapter.Fill( myDataSet );
            DataTable ExcelDataTable = myDataSet.Tables[ 0 ];
      
            [ ... und so weiter ... ;) ]

}
 
dank dir
hm wäre auch zu schön gewesen :(

kommt wieder die Meldung:
System.InvalidOperationException: Der 'Microsoft.ACE.OLEDB.12.0'-Provider ist nicht auf dem lokalen Computer registriert.

Hast du das ganze wirklich auf einem 64bit system am laufen und kompilierst du es auch als 64bit anwendung?

wenn ja, welchen provider hast du installiert? bzw. von wo?
 
Ja, hab ich.
Windows 7 Professional x64 mit Visual Studio 2010 Ultimate. Gebaut wird für AnyCPU aber das sollte ja kein Problem sein, denk ich.

Achja, ist auch für Excel 2010. Hast du ein älteres Office? Die Fehlermeldung deutet zumindest darauf hin. Dann müsstest du die Version anpassen.
 
hm hast du ein Office 64bit oder 32bit? das wäre der einzige unterschied noch -.-
 
Office ist die ganz normale Home & Student 32bit Version.
 
Hm, also es muss klappen, demnach. nur was mach ich / ist bei mir falsch -.-

kannst du das mal ausführen?
DataTable providers = System.Data.Common.DbProviderFactories.GetFactoryClasses();
foreach (DataRow provider in providers.Rows)
{
foreach (DataColumn col in providers.Columns)
listBox1.Items.Add(col.ColumnName + " : " + provider[col]);
listBox1.Items.Add("-----------------------");
}
this.Show();

bzw. so wie du willst, brauche den output...

EDIT:
das ist mein output:
 
Zuletzt bearbeitet:
Wie muss den dazu das Excel aussehen? Btw hast du ein XSL oder ein XLSX? Das könnte noch das Problem sein.
 
mom. ein xlsx, aber das kann man ja mit dem
angeben, was auch xlsx auslesen kann.

(xls geht genau so wenig)
Ergänzung ()

Kannst du nicht VSTO nehmen und direkt Excel-Interop benutzen?

Hm hab ich mal getestet, jetzt habe ich ein excel sheet in visual studio. aber auf diese tabellen kann ich zugreiffen, immerhin schon mal was. jetzt muss ich nur noch rausbekommen, wie man dem quasi eine externe tabelle übergeben kann, eine idee?

Vllt mal was suchen mit dem du die exceldatei direkt in CSV umwandeln kannst und dann einfahc die CSV einlesen
ins CSV umwandeln ist nicht das problem :D
diese vernüpftig einzulesen eher. ich google mal danach, wenn du eine gute lösung hast, nur zu^^

ich muss das excel sheet einlesen und auch wieder schreiben können später. zudem brauche ich halt die "struktur" der tabelle. es handelt sich dabei um artikel inkl. deren nummer eigenschaften etc...
 
Almeida schrieb:
Ja, hab ich.
Windows 7 Professional x64 mit Visual Studio 2010 Ultimate. Gebaut wird für AnyCPU aber das sollte ja kein Problem sein, denk ich.

Achja, ist auch für Excel 2010. Hast du ein älteres Office? Die Fehlermeldung deutet zumindest darauf hin. Dann müsstest du die Version anpassen.

1.) Wenn du auf Any CPU stellst, dann läuft die Anwendung auf einem 32Bit System als 32Bit Anwendung und auf einem 64Bit System als 64Bit Anwendung. Da hast du dann das Problem, dass es für Office noch keine 64Bit ODBC Treiber gibt. Stellst du auf x86, läuft alles wunderbar, aber du kannst eben nicht die Features von 64Bit Software nutzen (mehr als ca. 2GB RAM für den Prozess anfordern, die Performance bei Fließkommaanwendungen und bei Int64 kann etwas niedriger sein etc., aber bei normalen Anwendungen nichts dramatisches. Es ist leider ein weit verbreiteter Irrglaube, dass man auf einem 64Bit System unbedingt 64Bit Software erzeugen muss. Selbst MS selbst rät davon ab Office 64Bit zu verwenden, es sei denn man braucht es wirklich (große Datacenter Anwendungen, die in Excel wirklich mehrere GB am RAM verbraten).

2.) Ein CSV Datei funktioniert zwar, hat aber folgende Nachteile:
a) Man muss sie extra speichern
b) Man hat nur eine Tabelle
c) Man hat nur Werte, alle Formeln, Formatierungen etc. gehen verloren. Diese muss man sich bei Bedarf seperat abspeichern
d) Kein Unicode Support d.h. es gibt nur die regionalen Zeichen. Hat man ein ausländisches System, so werden eventuell nicht einmal die Umlaute richtig gespeichert

3.) Du kannst die Datei als .xlsx abspeichern. Das geht ab Excel 2007 bzw. Excel 2003, falls das Update dafür installiert ist (solltest du sowieso tun). Diese .xlsx Datei ist in Wirklichkeit eine .zip Datei, die mehrere xml Dateien enthält. Da kannst du dir dann die Daten herausholen. Ich lese meine Excel Dateien mittlerweile alle so ein. War zwar ein Tag Arbeit, bis es wirklich stabil funktioniert hat, aber jetzt kann ich die ganzen Batch verarbeitungen von ganzen Dateien automatisch machen, statt alles immer per Copy und Paste händisch raus zu holen. Schreiben habe ich allerdings noch nicht probiert. Das könnte eventuell gefährlich werden.
 
Genau diese art von excel tabellen auslesen habe ich gestern auch gefunden. aber das wäre ja den einfach der manuelle weg, von dem her eigentlich das, was man vermeiden wollte. Hab jedenfalls so schon mal angefangen...

Ich steht jetzt einfach vor dem Problem. Was ist besser, das ganze in ein Dataset zu bringen oder besser in eine Klasse.

Dataset(Datatable etc.) hätte ich mal so gesagt, da kann man es einfach mit autofilter funktionen etc. wieder nutzen. das problem ist aber, ich habe relationen, also ein artikel hat gewisse zubehöre. alles ist in ein und derselben tabelle.

Es gibt eindeutige artikelnummern. aktuell ist die tablle so aufgebaut, dass es hinter den spalten der artikeleigenschaften einfach nochmals soviele spalten wie artikel gibt, um da quasi ein kreuz zu setzen, welches zubehör zu diesem artikel passen würde.
andere idee war, eine weitere spalte da hin zu setzen, also nach den spalten der eigenschaften, und es halt kompatibelität oder so zu nennen, wo man komma getrennt die artikelnummern der kompatiblen zubehöre angibt.

aber wie bringe ich das gescheid in ein dataset/datatable? ich habe bisher kaum was mit datenbank/datenverarbeitung im grösseren still gemacht. wäre froh um einen wegzeiger oder direkt um eine lösung.

danke

greeez
 
Zuletzt bearbeitet:
Code:
DataSet ds = new DataSet();
            //You must use the $ after the object
            //you reference in the spreadsheet
            try
            {
                string sSQL = "SELECT " + sCol + " FROM [" + sSheetname + "$]";
                OleDbDataAdapter da = new OleDbDataAdapter
                    (sSQL, strConn);


                //da.TableMappings.Add("Table", "ExcelTest");

                da.Fill(ds);
            }
            catch (Exception ex)
            {
                string xxx = ex.Message;
            }

Ich versuche gerade in einer 64 Windows 7 Umgebung aus Excel rauszulesen, aber irgendwie scheint das nicht zu klappen, wenn ich AnyCPU ausgewählt habe. Ich will aber auch nicht auf x86 umswitchen. Gibts da einen alternativen Provider um auf Excel Sheets zuzugreifen wie mit OleDB Jet4 Dingens?
 
Zurück
Oben