【问题标题】:Cannot create an instance of Excel 2016 in Visual Studio 2015无法在 Visual Studio 2015 中创建 Excel 2016 的实例
【发布时间】:2016-03-29 10:48:54
【问题描述】:

我有 Visual Studio 2015,我的应用程序适用于 .NET Framework 4.0。

我安装了 Microsoft Office Home&Buissness 2016 并尝试使用以下代码创建一个实例: Microsoft.Office.Interop.Excel.Application excelAppTemplate = new Microsoft.Office.Interop.Excel.Application();

但我收到此错误:

无法将“System.__ComObject”类型的 COM 对象转换为接口类型“Microsoft.Office.Interop.Excel.Application”。此操作失败,因为 IID 为“{000208D5-0000-0000-C000-000000000046}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:未注册接口(来自 HRESULT 的异常:0x80040155)。

我引用的是 Microsoft.Office.Interop.Excel 15.0.0.0。 在寻找答案时,我看到了删除此注册表项的解决方案:

HKEY_CLASSES_ROOT\TypeLib{00020813-0000-0000-C000-000000000046}

但我有 1.9 而不是以前的版本,如 1.8 或 1.7,只有 1.9。 Office 2016 有新版本吗?

【问题讨论】:

    标签: c#


    【解决方案1】:

    我建议您使用更灵活的可配置和稳定的库EPPlus,而不是 Microsoft.Office.Interop.Excel.Application 库。它的运行速度比基于反射的 COM 地狱库快很多倍,并且可以通过 nuget 安装。

    不得不提一下,EPPlus 仅支持 xlsx 文件格式,如果您需要使用较旧的 xls 文件格式,您可以使用库 CSharpJExcel,该库无需 COM ,用于读取您的 xls 文件,然后通过 EPPlus 将它们保存为 xlsx。

    从 xls 到 xlsx 的这种转换可能如下所示:

    // Reading xls-file data with CSharpJExcel
    
    var cellsData = new List<List<string>>();
    
    var book = Workbook.getWorkbook(new FileInfo(fileName));
    var dataSheet = book.getSheet(0);
    
    // Loop over rows and fill collection with data
    for (int r = 0; r < dataSheet.getRows(); r++)
    {
        var dataRow = new List<string>();
    
        // Loop over columns  
        for (int c = 0; c < dataSheet.getColumns(); c++)
        {
            var cellValue = dataSheet.getCell(c, r).getContents();
            dataRow.Add(cellValue);
        }
    
        cellsData.Add(dataRow);
    }
    
    
    // Saving data to xlsx file with EPPlus
    using (var xls = new ExcelPackage(new FileInfo(path + ".xlsx")))
    {
        var sheet = xls.Workbook.Worksheets.Add("test");
    
        int row = 1;
        foreach (var cellsRow in cellsData)
        {
            int col = 1;
    
            // Some data processing logic...
    
            foreach (var cellData in cellsRow)
            {
                sheet.Cells[row, col].Value = cellData;
    
                ++col;
            }
            ++row;
        }
    
        xls.Save();
    }
    

    【讨论】:

    • 但是要花钱。
    • 没有机会使用 interop.Excel?
    • 它不花钱,它们是免费的。 EPPlus 是开源的,CSharpJExcel 是免费的(它的维护似乎很久以前就被冻结了,但它的功能很少,它可以读取 xls 文件的内容。如果你坚持使用它们,请随时询问。
    • 我成功地使用了这些库,甚至用于大数据文件的转换,也将它们用于样式、单元格数据类型格式化、图表和公式构建。因此,如果不需要 Microsoft.Office.Interop.Excel 15.0.0.0 提供的一些额外的独特功能,我建议您使用更方便的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多