2010-07-12 4 views
5

Я использую строку подключения oledb для импорта листа excel. Я ссылаюсь на библиотеки объектов 12.0. Я пробовал с excel 2003 и 2007 оба, но получал такое же исключение, что и нижеimport excel sheet in winform

Создание экземпляра COM-компонента с CLSID {00020820-0000-0000-C000-000000000046} из IClassFactory не удалось из-за следующей ошибки: 80010001 .

мой код

 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); 

пожалуйста, помогите.

+0

В какой строке возникает ошибка? Кроме того, ваша вторая строка ('Excel.Worksheet workheet = new Excel.Worksheet();' выглядит supsipicous, просто объявляет новую переменную и не вызывает 'new' в типе' Worksheet'. Только 'Excel.Application' объект может дать вам новый рабочий лист. –

+0

20xA3: похоже, что он никогда не использует новый рабочий лист, ссылка перезаписывается вызовом 'theWorkbook.Worksheets.get_Item (1)'. Я бы сказал, что это, вероятно, осталось Это говорит о том, что если ошибка * есть ... может быть проблемой. – Randolpho

ответ

1

Это COM ошибка очень низкого уровня, RPC_E_CALL_REJECTED, «Вызов был отклонен вызываемым». Это не очень помогает, но, очевидно, Excel не очень доволен вашим кодом. Очень хороший кандидат в этом заявлении:

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

Потеряйте это, он ничего не полезен. Всегда требуется создать объект приложения.

+0

спасибо. , который помог. –

0

Отказ от ответственности: Я не очень много вмешиваюсь в Office. Но мой Googling на этой ошибке подразумевает, что это происходит, когда объект COM, о котором идет речь, не полностью загружен, и я замечаю, что вы открываете соединение до, вы создаете объект Excel.Application.

Возможно, вы можете переключить это вокруг? Попробуйте что-то вроде этого:

 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);