在C#中无法打开Excel文件

12

我在我的项目中有以下的 C# 函数,它的功能是打开并返回一个现有的 Excel 工作簿对象:

Application _excelApp;

// ...

private Workbook OpenXL(string path, string filename)
{
    try
    {
        if (_excelApp == null)
        {
            _excelApp = new Application();
        }

        Workbook workBook = _excelApp.Workbooks.Open(path + filename,   // Name
                                                     0,                 // Do not update links
                                                     true);             // Open read-only

        return workBook;
    }
    catch (Exception e)
    {
        _excelApp = null;
        throw new ArgumentException("Error opening " + path + filename, e);
    }
}
但是当我使用 "C:\" 和 "scratch.xlsx" 运行它时,Open() 调用会抛出以下错误:
Microsoft Excel cannot access the file 'C:\scratch.xlsx'. There are several possible reasons:

• The file name or path does not exist.
• The file is being used by another program.
• The workbook you are trying to save has the same name as a currently open workbook.
文件和路径确实存在:我已经从错误消息中复制了路径并将其粘贴到命令窗口中,在Excel中加载文件。该文件没有被锁定:Excel可以正常打开它,但我的程序不能,即使在重新启动后也是如此。我试图打开它而不是保存它,因此最后一个选项无关紧要。
我不知道为什么这个简单的代码没有起作用。任何建议都将不胜感激。
[编辑]我现在已经尝试从我的个人网络驱动器(M:)和USB存储器中打开该文件,但都没有成功。
该应用程序实际上是一个Windows服务,以本地系统帐户运行并生成报告。它目前编写CSV报告,并且没有任何访问问题。我现在正在尝试打开一个Excel文件作为模板报告并填写各种字段。当打开Excel文件时,它就会失败。我认为管理员帐户选项就是大家所提议的红鲱鱼,因为它可以毫无问题地编写CSV文件。
---Alistair。

尝试以管理员身份运行?用户帐户对该文件具有读取权限吗? - Sam Leach
你或者C#是否转义了\ - Kami
4
不要像 path + filename 这样拼接路径,而应该使用 Path.Combine(path, filename) - Marco
你使用了哪个Excel Interop?它是适用于Excel 2007或更高版本的正确版本吗? - Marco
Marco,我正在使用interop的14.0.0.0版本(C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14\Microsoft.Office.Interop.Excel.dll)。 - user41013
4个回答

38
我发现了以下页面: http://social.msdn.microsoft.com/Forums/en-US/b81a3c4e-62db-488b-af06-44421818ef91/excel-2007-automation-on-top-of-a-windows-server-2008-x64 其中说到...
如果不使用UI自动化则不支持此版本的Office产品。似乎Windows Server 2008和Excel 2007都强制执行了这个声明。
问题描述者接着描述了我遇到的情况,即无法打开Excel文件的Windows服务,尽管在命令行程序中相同的代码没有问题。 回答建议创建以下文件夹:
Windows 2008 Server x64:C:\Windows\SysWOW64\config\systemprofile\Desktop Windows 2008 Server x86:C:\Windows\System32\config\systemprofile\Desktop 我已经尝试过,并且运行得很好!有人能解释为什么需要它以及任何缺点吗?
谢谢, --- Alistair。

1
是的,我也有同样的问题。你的解决方案对我也有效。但是为什么呢? - GLP
1
不知道为什么,我没有找到任何原因,并且完全忘记了它。当我们很快迁移到新硬件时,它可能会再次使我困扰! - user41013
1
不知道为什么这个有效,但我可以确认它在使用Server 2008和Office 2010时帮了我一个大忙。 - GreyCloud
1
一样的情况。创建这些文件夹就解决了问题。非常感谢! - CleanBold
2
刚刚发现这篇帖子,为了我的旧Windows 7系统修复它,然后在升级到Windows 10后又不得不再次修复。但是在Windows 10中,我必须将“Everyone”用户的权限设置为两个文件夹的完全访问权限,才能使其正常工作。 - Morvael
显示剩余5条评论

4

我遇到了同样的问题,而且我已经调查了有关“注册表修改”的信息。

最终,我找到了另一种解决方案,它不改变任何注册表值,并且一切正常工作。

该解决方案是......

・Windows 2008 Server x64

请创建这个文件夹。

  C:\Windows\SysWOW64\config\systemprofile\Desktop

・Windows 2008 Server x86

请创建此文件夹。

 C:\Windows\System32\config\systemprofile\Desktop

使用Component Services(组件服务)代替dcomcnfg.exe进行操作。

这个操作解决了我的系统中的Office自动化问题。

在systemprofile文件夹中似乎需要一个Desktop文件夹才能通过Excel打开文件。

在Windows2008中,它会消失,而Windows2003中有该文件夹,我认为这是引起此错误的原因。

我认为这比“注册表修改”更安全。

如果您尝试此解决方案,请告诉我结果。


1
我有这个文件夹,但是我需要授予它正确的权限。 - Mishelle

4

我还要补充一点,你的代码按预期工作,代码没有任何问题。 - Erik Philips
我同意,只要所有的类都按照我的预期工作,我就看不出有什么问题。 - Pharap
它最初是访问 C:\Reports\ 的。我将路径更改为 C:\,以使其更简单! - user41013
如果您有像 D:\ 驱动器或像 F:\ 这样挂载的驱动器,而且这只是一个测试 / 您无法打扰编辑应用程序清单,请改用其中一个驱动器。 - Pharap
@user41013:你尝试过像我之前建议的那样使用Path.Combine合并路径了吗? - Marco
显示剩余2条评论

0

今天我遇到了这个问题。

令人惊讶的是,当应用程序以管理员身份运行时,错误似乎发生了。

在我们迁移到Windows 10后,一些事情(主要与IIS相关)只有在将Visual Studio作为管理员运行时才能正常工作,因此很快就养成了以管理员身份启动VS的习惯。

解决方案是不要以管理员身份运行应用程序。

这可能与我们的工作环境设置有关,但如果其他解决方案对他们也不起作用,我认为值得分享。


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