【问题标题】:import excel sheet in winformwinform导入excel表格
【发布时间】:2011-03-14 22:35:41
【问题描述】:

我正在使用 oledb 连接字符串来导入 Excel 工作表。我正在引用 12.0 对象库。 我尝试使用 excel 2003 和 2007 都得到了如下相同的异常

由于以下错误,从 IClassFactory 创建 CLSID 为 {00020820-0000-0000-C000-000000000046} 的 COM 组件实例失败: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);

请帮忙。

【问题讨论】:

  • 错误出现在哪一行?此外,您的第二行 (Excel.Worksheet worksheet = new Excel.Worksheet(); 看起来很可疑,只需声明一个新变量,不要在 Worksheet 类型上调用 new。只有 Excel.Application 对象可以为您提供一个新工作表。
  • 20xA3:看起来他从不使用新版的工作表;该引用被对theWorkbook.Worksheets.get_Item(1) 的调用覆盖。我会说这可能是剩余的实验。也就是说,如果存在 error.... 可能是问题所在。

标签: c#


【解决方案1】:

免责声明:我不做很多 Office 互操作。但是我在谷歌上搜索这个错误意味着它发生在有问题的 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);

【讨论】:

    【解决方案2】:

    这是一个非常低级的 COM 错误,RPC_E_CALL_REJECTED,“Call was denied by callee”。这没有多大帮助,但显然 Excel 对您的代码不太满意。一个非常好的候选者是这样的声明:

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

    失去它,它不会做任何有用的事情。始终需要先创建 Application 对象。

    【讨论】:

      猜你喜欢
      • 2019-12-09
      • 1970-01-01
      • 2013-03-27
      • 2011-08-09
      • 2014-01-16
      • 2021-03-03
      • 2017-04-23
      • 1970-01-01
      • 2013-11-08
      相关资源
      最近更新 更多