无法加载文件或程序集'Office, Version=15.0.0.0'。

43
我使用的是Vs2013,我创建了一个应用程序,在该应用程序中使用Excel文件作为输入并从文件中获取联系人。这一切在我的电脑上都正常工作。我的电脑上有Vs2013、Windows 8.1、Ms office 2007和2013。当我在其他任何计算机上运行我的应用程序时,它会抛出“无法加载文件或程序集'office,Version=15.0.0.0,Culture=neutral,PublicKeyToken=71e9bc111e9429c'或其某个依赖项。系统找不到指定的文件”的错误。根据我的应用程序要求,我需要使用来自Office 2007至2013的Excel文件。我已参考了一些StackOverflow链接,但是我没有得到结果。我被卡住了,请建议如何解决这个问题。

3
如果你想支持2007版本的话,你选择了错误的Office版本。而且,如果你不至少针对.NET 4.0进行开发,那也是一个错误,因为嵌入互操作类型功能非常理想。总之,按照你现在的方式,你需要在你的机器和目标机器上都安装Office 2007主要互操作程序集。 - Hans Passant
你是在操作Excel文件还是只是读取其中的数据? - T.S.
如果我更改Excel 12.0.0.0,它是否适用于所有Ms Office 2007至2013版本? - NJ Bhanushali
如果你只是读写数据,而没有执行任何“Excel功能”,那么你可以使用Microsoft.ACE.OleDb连接Excel,就像操作数据库表格一样。无论如何,你似乎还缺少Excel.dll。 - T.S.
http://www.codeproject.com/Tips/705470/Read-and-Write-Excel-Documents-Using-OLEDB - T.S.
显示剩余2条评论
6个回答

35
即使我拥有Office 2010并且在GAC下没有Microsoft.Office.Interop.Excel文件夹,我还是收到了这个错误信息。
我在这里找到了我的解决方案: https://www.add-in-express.com/forum/read.php?FID=5&TID=15525
您需要引用这些文件夹中的两个dll文件:
C:\Windows\assembly\GAC_MSIL\Microsoft.Vbe.Interop\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll

C:\Windows\assembly\GAC_MSIL\office\15.0.0.0__71e9bce111e9429c\OFFICE.DLL


4
呼!终于成功了。谢谢你的帮忙。这在我的电脑上起作用了。 - Marc Kenneth Lomio
太烦人了。谢谢@Pinokio - jason m
太好了!添加“OFFICE.DLL”引用解决了我的问题。 - Banketeshvar Narayan

23

您的另一台计算机需要安装相应版本的Office。15.0.0.0 应该对应Office 2013 - 这需要安装在目标计算机上(其他版本的Office可能无法使用)。几乎可以确定,这意味着您正在使用MSOffice互操作库,这些库仅在安装了相同版本的Office并针对该版本运行时才能工作。

或者,您可以重构代码以直接读取Excel XML。


我已经在两台电脑上尝试过了。在安装有Ms office 2013的电脑上可以正常工作。但是在另一台安装有Ms office 2007的电脑上无法工作。由于应用程序处于边缘状态,我不能更改机制。我必须找到解决方案。您能否在这种情况下给我建议?@Dan Field - NJ Bhanushali
对,它需要 Office 2013。如果你想让它与 Office 2007 兼容,你必须确保针对那些库(而不是版本 15.0.0.0)进行构建。 - Dan Field
1
谢谢。我已经将版本更改为12.0.0.0,现在它可以正常工作了。 - NJ Bhanushali
我已经安装了Office 2013并在同一台电脑上使用Office 2013创建了两个相关文档,但仍然出现了此错误。使用的是最新的15.0.4797.1003版本。 - Slagmoth

12

我的问题在于我尝试使用NuGet包:

<PackageReference Include="Microsoft.Office.Interop.Excel" Version="15.0.4795.1001" />

这不仅不受支持,而且会因为FileNotFoundException而无法加载。

使用COMRreference属性。例如,这是Excel的COMReference:

<ItemGroup>
    <COMReference Include="Microsoft.Office.Interop.Excel">
        <EmbedInteropTypes>true</EmbedInteropTypes>
        <Guid>00020813-0000-0000-c000-000000000046</Guid>
        <Isolated>false</Isolated>
        <Lcid>0</Lcid>
        <WrapperTool>primary</WrapperTool>
        <VersionMajor>1</VersionMajor>
        <VersionMinor>9</VersionMinor>
    </COMReference>
</ItemGroup>

关于这个讨论中确切的子属性,需要一些帮助:使用Office互操作时出现错误的COMReference条目 #5735


1
这在我使用Nuget包的.NET 6 Winform应用程序中有效。当我卸载了Nuget包后,它就起作用了。 - user0123456789

9
我通过更改Excel.dll版本解决了问题。我之前使用的是15.0.0.0,现在我将其更改为12.0.0.0,它正常工作了。
我从以下路径中获取了dll:添加引用 > 浏览 > C: > Windows > assembly > GAC > Microsoft.Office.Interop.Excel > 12.0.0.0_etc > Microsoft.Office.Interop.Excel.dll

我在GAC文件夹中找不到Microsoft.Office.Interop.Excel。我错过了什么? - Tran B. V. Son
6
@TranB.V.Son 我的是在 GAC_MSIL 中。 - chriszumberge

4
我创建了一个批处理文件来解决这个问题。请参见下面的脚本:
    echo off
        cls
        color 1f
        echo Checking for Administrator elevation.
        openfiles>nul 2>&1

            if %errorlevel% EQU 0 goto isadmin

                COLOR 4f
            echo.    You are not running as Administrator.
            echo.    This tool cannot do it's job without elevation.
            echo.
            echo.    You need run this tool as Administrator.
            echo.

            echo.Press any key to continue . . .
            pause>nul
        exit
        :isadmin
        if exist c:\windows\assembly\GAC_MSIL\office\16.0.0.0__71e9bce111e9429c\OFFICE.DLL set officever=16
    if exist c:\windows\assembly\GAC_MSIL\office\15.0.0.0__71e9bce111e9429c\OFFICE.DLL set officever=15
    if exist c:\windows\assembly\GAC_MSIL\office\14.0.0.0__71e9bce111e9429c\OFFICE.DLL set officever=14

    md c:\windows\assembly\GAC_MSIL\office\12.0.0.0__71e9bce111e9429c
    xcopy c:\windows\assembly\GAC_MSIL\office\%officever%.0.0.0__71e9bce111e9429c c:\windows\assembly\GAC_MSIL\office\12.0.0.0__71e9bce111e9429c /s/y
pause

9
请为您的解决方案提供解释。我们不是一个编写代码的服务,请分享您的知识,并描述您如何创建该解决方案。非常感谢。 - creyD
1
这看起来很糟糕,你正在将一个较新版本的.dll复制到一个文件名中,该文件名假装是旧版本。这将导致各种难以调试的问题。 - Hugh W

1

我曾经遇到过同样的问题,你需要引用以下包(Syncfusion.XlsIO)而不是(Microsoft.Office.Interop.Excel),因为后者只支持Excel 2013,但第一个包'Syncfusion.XlsIO'支持Excel 2016。

=> using Syncfusion.XlsIO;

以下是代码示例:

这里是以下的代码:

  using (ExcelEngine excelEngine = new ExcelEngine())
                {
                        IApplication application = excelEngine.Excel;
                        application.DefaultVersion = ExcelVersion.Excel2016;
                        IWorkbook workbook = application.Workbooks.Create(1);
                        IWorksheet worksheet = workbook.Worksheets[0];
                        //Adding text to a cell
                        for (int i = 1; i < dataGridView1.Columns.Count + 1; i++)
                        {
                           worksheet.Range[1, i].Text = dataGridView1.Columns[i - 1].HeaderText;
                        }

                        for (int i = 0; i < dataGridView1.Rows.Count-1; i++)
                        {
                            for (int j = 0; j < dataGridView1.Columns.Count; j++)
                            {
                                worksheet.Range[i + 2, j + 1].Text = dataGridView1.Rows[i].Cells[j].Value.ToString();
                            }
                        }
                        //Saving the workbook to disk in XLSX format
                        Stream excelstream = File.Create(Path.GetFullPath(@"MyExcelFile.xlsx"));
                        workbook.SaveAs(excelstream);
                        excelstream.Dispose();
                }

3
Syncfusion.XlsIO不是付费的NuGet包吗? - arihanth jain
@arihanthjain 是的,我尝试过这个示例,在最后一步显示了一个关于支付的消息。太遗憾了。 - qarly_blue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接