2010-07-12 17 views
5

Ich verwende oledb Verbindungszeichenfolge, um Excel-Blatt zu importieren. Ich verweise auf 12.0 Objektbibliotheken. habe ich versucht, mit Excel 2003 und 2007 beide aber die gleiche Ausnahme wie untenimportieren Sie Excel-Blatt in Winform

Erstellen einer Instanz der COM-Komponente mit CLSID {immer 00020820-0000-0000-C000-000000000046} von der IClassFactory aufgrund der folgenden Fehler fehlgeschlagen: 80010001

.

mein Code

 txtpath.Text = fdlg.FileName; 

     Excel.Worksheet worksheet = new Excel.Worksheet(); 
     Excel.Sheets sheets; 
     Excel.Workbook theWorkbook; 
     string SheetName; 

     OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"" + txtpath.Text + "\";Extended Properties=\"Excel 12.0 Xml;HDR=Yes;\";"); 
     conn.Open(); 

     Excel.Application ExcelObj = null; 
     ExcelObj = new Excel.Application(); 

     theWorkbook = ExcelObj.Workbooks.Open(txtpath.Text, 0, false, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t", true, true, 0, true, 1, 0); 

     sheets = theWorkbook.Worksheets; 

     worksheet = (Excel.Worksheet)theWorkbook.Worksheets.get_Item(1); 
     SheetName = worksheet.Name.Trim(); 

     OleDbDataAdapter da = new OleDbDataAdapter("Select * FROM [" + SheetName + "$]", conn); 
     DataSet ds = new DataSet(); 
     da.Fill(ds); 

bitte helfen.

+0

In welcher Zeile tritt der Fehler auf? Nebenbei bemerkt, Ihre zweite Zeile (Excel.Worksheet-Worksheet = new Excel.Worksheet();) sieht überflüssig aus, deklarieren Sie einfach eine neue Variable und rufen Sie nicht 'new' auf dem' Worksheet'-Typ auf. Nur die 'Excel.Application' Objekt kann Ihnen ein neues Arbeitsblatt geben –

+0

20xA3: Es sieht so aus, als würde er nie das neue Arbeitsblatt verwenden, der Verweis wird durch den Aufruf von 'theWorkbook.Worksheets.get_Item (1)' überschrieben. Ich würde sagen, dass es wahrscheinlich noch übrig ist Experiment. Das sagte, wenn der * Fehler * da ist .... könnte das Problem sein. – Randolpho

Antwort

1

Es ist ein sehr niedriger Ebene COM-Fehler, RPC_E_CALL_REJECTED, "Call by Aufgerufenen abgelehnt". Das hilft nicht viel, aber Excel ist nicht sehr glücklich mit Ihrem Code. Ein sehr guter Kandidat ist diese Aussage:

Excel.Worksheet worksheet = new Excel.Worksheet(); 

Verlieren, dass es nichts nützliches tut. Das Anlegen des Anwendungsobjekts ist immer erforderlich.

+0

danke. das half. –

0

Haftungsausschluss: Ich mache nicht viel Office-Interop. Aber mein Googeln auf diesen Fehler bedeutet, dass es auftritt, wenn das fragliche COM-Objekt nicht vollständig geladen ist, und ich bemerke, dass Sie die Verbindung öffnen, bevor Sie ein Excel.Application Objekt erstellen.

Vielleicht können Sie das umschalten? Probieren Sie etwas wie folgt aus:

 Excel.Worksheet worksheet = new Excel.Worksheet(); 
     Excel.Sheets sheets; 
     Excel.Workbook theWorkbook; 
     string SheetName; 

     Excel.Application ExcelObj = null; 
     ExcelObj = new Excel.Application(); 

     theWorkbook = ExcelObj.Workbooks.Open(txtpath.Text, 0, false, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t", true, true, 0, true, 1, 0); 

     sheets = theWorkbook.Worksheets; 

     worksheet = (Excel.Worksheet)theWorkbook.Worksheets.get_Item(1); 
     SheetName = worksheet.Name.Trim(); 


     OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"" + txtpath.Text + "\";Extended Properties=\"Excel 12.0 Xml;HDR=Yes;\";"); 
     conn.Open(); 
     OleDbDataAdapter da = new OleDbDataAdapter("Select * FROM [" + SheetName + "$]", conn); 
     DataSet ds = new DataSet(); 
     da.Fill(ds);