Не удается открыть файл xls с сервисом C#
Мне нужно создать сервис для импорта данных из файла Excel в таблицу SQL Server; вся система принадлежит одному из клиентов моей компании, поэтому я должен использовать Visual Studio 2010. У некоторых открытых этот файл может быть открыт, поэтому я решил скопировать его во временный каталог, а затем проанализировать эту копию. Я думал, что сделал это, так как он работал правильно в режиме отладки: файл открывается, все строки читаются, и в конце значения записываются в БД. Я установил его как службу, но продолжаю получать ту же ошибку (перевод на английский):
System.Exception: System.Runtime.InteropServices.COMException (0x800A03EC): impossible access file "C:\[temp dir]\[file.xls]". Possible reasons are:
• file name or path file do not exists.
• file in use by another program.
• the name of the folder/worksheet you are trying to save corresponds to the name of an open folder/worksheet.
at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad)
Файл существует, я могу найти его в папке, и никто не использует его в тот момент, когда служба пытается открыть его (я просто скопировал его). Я не пытаюсь сохранить его, я открываю его в режиме только для чтения, чтобы можно было исключить и третий пункт. Компьютер, на котором я разрабатываю службу, - это та же машина, на которой работает служба: Windows 7 Ultimate, Service Pack 1.
Я подумал, что это может быть проблемой для пользователя службы, поэтому я попытался запустить службу в Visual Studio в режиме отладки, входя в систему с одним и тем же пользователем службы (уровень администратора), и он работал отлично. Тогда я подумал, что это может быть проблемой синхронизации, возможно, служба пыталась открыть файл "слишком рано", пока система не выпустила его, поэтому я добавила
System.Threading.Thread.Sleep(5000);
перед
xlApp = new Microsoft.Office.Interop.Excel.Application();
линия, но ничего не изменилось. Конечно, каждый раз, когда я изменяю службу, я останавливаю ее, копирую новые файлы в систему и затем перезагружаю ее.
Код является:
string fileName = "[file name].xlsm";
string sourcePath = @"[origin]";
string targetPath = @"[destination]";
string fileDest = "[destination file name].xls";
string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
string targetFile = System.IO.Path.Combine(targetPath, fileDest);
try
{
System.IO.File.Copy(sourceFile, targetFile, true);
}
catch (Exception myEx)
{
throw new Exception(myEx.ToString());
}
xlApp = new Microsoft.Office.Interop.Excel.Application();
xlApp.DisplayAlerts = false;
xlApp.Visible = false;
try
{
wbk = xlApp.Workbooks.Open(targetFile, 0, true, Type.Missing, "[pwd]", "[pwd]", true, Type.Missing, Type.Missing, false, false, Type.Missing, true, Type.Missing, Type.Missing); [<- this is the problem, the exception is raised with these instruction]
sheet = new Worksheet();
range = null;
sheet = wbk.Worksheets.get_Item(4);
range = sheet.UsedRange;
numColonne = range.Columns.Count;
numRighe = range.Rows.Count;
}
catch (Exception myEx)
{
throw new Exception(myEx.ToString());
}
Что я могу сделать, чтобы решить эту проблему? Спасибо за вашу помощь.
1 ответ
Я добавил эти 2 папки: C:\Windows\SysWOW64\config\systemprofile\Desktop (64-разрядная версия) и C:\Windows\System32\config\systemprofile\Desktop (32-разрядная версия). Я нашел их на другом форуме и решил попробовать; сейчас это работает. Не спрашивай меня почему...