ClosedXML - 无法加载文件或程序集

10

我正在尝试使用ClosedXML在应用程序中生成Excel文档,但每当我尝试运行它时,我都会收到一个无法加载文件或程序集的服务器错误。

Could not load file or assembly 'DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.

我看过几种解决方法,其中包括更改 .dll 的属性中的“复制本地”值并直接将程序集添加到 web.config 中。

我正在使用 Visual Studios 2010,但是 dll 属性中没有“复制本地”条目。然后,当我在 web.config 中输入以下程序集时,我仍然会收到相同的服务器错误消息。我从提供的错误消息中获得了该程序集。

 <add assembly="ClosedXML, Version=0.76.0.0, Culture=neutral, PublicKeyToken=fd1eb21b62ae805b"/>

1
我也遇到了这个错误。使用Visual Studio 2017,C#,Nuget ClosedXML和所有相关的依赖项已更新。在Visual Studio 2017开发PC(Windows 10)上一切正常,但将发布版复制到Windows Server 2016时失败。将发布版复制到Windows Server 2012 R2时,没有此问题。希望有人能解决这个问题。 - gridtrak
1
我在Windows Server 2016中无法使用NuGet ClosedXML,因为它出现了“无法加载文件或程序集...”的错误。然而,当我从GitHub下载ClosedXML的源代码并引用它来构建我的应用程序时,一切都很顺利。 - gridtrak
6个回答

5

在疯狂搜索答案并最终发布问题后,我找到了最简单的答案,并且一旦引用了额外的.dll,一切都能正常工作。

要使用ClosedXML,您必须引用DocumentFormat.OpenXml.dll:

适用于NET 4.0+的DocumentFormat.OpenXml.dll


1

我遇到了同样的问题,但我只需添加NuGet包,并确保在我的项目中正确引用它:

using ClosedXML.Excel;

然后我可以使用以下代码访问Excel文件:
var wb = new XLWorkbook(MyExcelFile);

1

1
我有同样的问题。我在Nugget中搜索"ClosedXML.Signed",更新"DocumentFormat.OpenXml"后问题得到解决!

0
我浏览了这里的每一个答案,但都没有起作用。我解决这个问题的方法是通过NuGet包管理器将ClosedXML回滚到v0.90.0。然后我的错误消息变成了需要v2.16.0的DocumentFormat.OpenXML依赖项。所以,再次通过Nuget Package Manager,我更改了已安装的DocumentFormat.OpenXML版本为v2.16.0。然后它就可以工作了。为了让一个简单的DLL工作,要经历这么多烦琐的事情真是太可怕了。哦,我还知道几个月前一切都正常,只有当我几个月后去使用这个功能时才发现有些东西已经改变了。

0
如果您从由另一个应用程序A调用的类B中引用ClosedXML,则这可能是原因:
当A运行时,它只查找一组文件夹中的程序集,不知道B的依赖项在哪里。如果ClosedXML不在与A的可执行文件相同的目录中,那么您可能会遇到这个问题。
请参见此链接以获取原始答案:如何在.NET中运行时添加文件夹到程序集搜索路径?
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(LoadFromSameFolder);

static Assembly LoadFromSameFolder(object sender, ResolveEventArgs args)
{
    string folderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    string assemblyPath = Path.Combine(folderPath, new AssemblyName(args.Name).Name + ".dll");
    if (!File.Exists(assemblyPath)) return null;
    Assembly assembly = Assembly.LoadFrom(assemblyPath);
    return assembly;
}

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