2013-07-08 3 views
8

У меня есть следующая C# функции в моем проекте, который должен открыть и вернуть существующие книги Excel объект:Невозможно открыть 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», вызов 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 может открыть его в порядке, но моя программа не может, даже сразу после перезагрузки. Я не пытаюсь его сохранить, я пытаюсь открыть его, поэтому последний вариант не имеет значения.

Я затрудняюсь понять, почему этот простой кусок кода не работает. Любые предложения были бы чрезвычайно оценены.

[edit] Я теперь попытался открыть этот файл с моего личного сетевого диска (M :) и с USB-накопителя. Все безрезультатно.

Приложение на самом деле является службой Windows, работающей под учетной записью локальной системы и создающей отчеты. В настоящее время он пишет отчеты CSV без каких-либо проблем с доступом. Теперь я пытаюсь открыть файл excel в качестве отчета о шаблоне и заполнить различные поля. Это когда открывается файл Excel, который он терпит неудачу. Я думаю, что опция учетной записи администратора, которую все предлагают, - это красная селедка, так как она может писать файлы CSV без проблем. [/ edit]

--- 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

Я попробовал это, и она работала лакомство! Может ли кто-нибудь объяснить, почему это необходимо и какие-то недостатки?

Thanks,

--- Alistair.

+0

Да. У меня такая же проблема. И ваше решение работает и на меня. Но почему? – GLP

+0

Не знаю, почему, я не нашел для этого никаких оснований и полностью забыл об этом. Скорее всего, он снова закроет меня, когда мы скоро перейдем на новое оборудование! – user41013

+0

не знаю, почему это работает, но я могу подтвердить, что он только что спас меня, а на Sever 2008 & office 2010 – GreyCloud

3

Запуск программы как администратора, C:/не может быть доступ к программе, если пользователь не работает как администратор. Вы можете сделать свою программу запрашивать у пользователя должна быть запущена как администратор, изменяя ApplicationManifest: How do I force my .NET application to run as administrator?

+0

I 'd также добавить, что ваш код работает как ожидалось, нет ничего плохого в вашем коде. –

+0

Во-вторых, я не вижу никаких проблем с этим, предполагая, что все классы выполняют то, что я ожидаю от них. – Pharap

+0

Первоначально он был доступен для C: \ Reports \. Я изменил путь к C: \, чтобы сделать его проще! – user41013

2

Я столкнулся с той же проблемой и Я исследовал информацию о «рутке реестра».

В конце концов, я нашел другое решение, которое не меняет значения реестра , и все работает правильно.

Это решение ...

· Windows 2008 x64 сервера

Пожалуйста, эту папку.

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

· Windows 2008 x86 сервер

Пожалуйста, эту папку.

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

... вместо dcomcnfg.exe.

Эта операция устранила проблемы с офисной автоматикой в ​​моей системе.

Папка рабочего стола, по-видимому, необходима в папке systemprofile для открытия файла с помощью Excel.

Он исчез из Windows2008, у Windows2003 была папка , и я думаю, что это вызывает эту ошибку.

Я думаю, что это безопаснее, чем «взлом реестра».

Если вы попробуете это решение, пожалуйста, дайте мне знать результаты.

+1

У меня была папка, но мне нужно было предоставить ей правильные разрешения. – Mishelle

Смежные вопросы