2013-07-08 123 views
8

我在我的項目,該項目應該打開並返回一個現有的Excel工作簿對象下面的C#功能:無法打開Excel文件在C#

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」,開放()調用引發以下錯誤:

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。

+0

請嘗試以管理員身份運行?用戶帳戶是否具有對文件的讀取權限? –

+0

你或c#轉義'\'? – Kami

+4

不要像'path + filename'一樣加入路徑;使用'Path.Combine(路徑,文件名)'而不是! – Marco

回答

31

我發現下面的頁面:

http://social.msdn.microsoft.com/Forums/en-US/b81a3c4e-62db-488b-af06-44421818ef91/excel-2007-automation-on-top-of-a-windows-server-2008-x64

凡說......

it’s not supported to automate office products UI less. It seems that Windows Server 2008 and Excel 2007 enforce the given statement.

然後提問者準確描述了我在Windows服務中無法打開Excel文件的情況,儘管命令行程序中的相同代碼沒有公開oblem。

響應建議創建以下文件夾:

Windows 2008 Server x64: C:\Windows\SysWOW64\config\systemprofile\Desktop

Windows 2008 Server x86: C:\Windows\System32\config\systemprofile\Desktop

我曾經嘗試這樣做,它的工作一種享受!任何人都可以解釋爲什麼它需要和任何缺點?

謝謝,

--- Alistair。

+0

是的。我也有同樣的問題。而你的解決方案也適用於我。但爲什麼? – GLP

+0

不知道爲什麼,我沒有找到任何理由,並完全忘記了它。當我們很快遷移到新的硬件時,它可能會再次讓我感動! – user41013

+0

不知道爲什麼這個工程,但我可以證實它只是在Sever 2008和辦公室2010保存我 – GreyCloud

3

以admin身份運行該程序,除非用戶以admin身份運行,否則C:/不能被程序訪問。 你可以讓你的程序提示必須以管理員身份運行的用戶通過改變ApplicationManifest:How do I force my .NET application to run as administrator?

+0

'd還補充說你的代碼按預期工作,你的代碼沒有問題。 –

+0

我會第二個,我認爲沒有問題,假設所有的類都做我期望他們做的事。 – Pharap

+0

它最初訪問C:\ Reports \。我將路徑改爲C:\以使其更簡單! – user41013

2

我遇到了同樣的問題和 我調查了有關「註冊表黑客」的信息。

畢竟,我發現了另一個解決方案,它不會更改任何註冊表值 ,並且所有工作都正常進行。

這個解決方案...

·Windows 2008 Server的64

請你把這個文件夾。

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

·Windows 2008 Server的86

請你把這個文件夾。

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

...而不是dcomcnfg.exe。

此操作消除了我係統中的辦公自動化問題。

在systemprofile文件夾中似乎有必要使用桌面文件夾來通過Excel打開文件。

它從Windows2008中消失,Windows2003有文件夾, ,我認爲它會導致此錯誤。

我認爲它比「註冊表黑客」更安全。

如果您嘗試此解決方案,請讓我知道結果。

+1

我有這個文件夾,但我需要授予它正確的權限。 – Mishelle