无法使用C#服务打开XLS文件

时间:2019-01-21 13:32:19

标签: c# excel import excel-interop interopservices

我必须创建一个服务,以将数据从excel文件导入到SQL Server表中;整个系统属于我公司的客户之一,因此我必须使用Visual Studio2010。某些打开的文件可能已打开,因此我决定将其复制到一个临时目录中,然后解析此副本。我以为可以了,因为它可以在调试模式下正常工作:打开文件,读取所有行,最后将值写入DB。我将其安装为服务,但始终出现相同的错误(翻译成英文):

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)

该文件存在,我可以在文件夹中找到它,并且在该服务尝试打开它时,没有人在使用它(我只是复制了它)。我不是要保存它,而是以只读模式打开它,因此也可以排除第3点。 我正在开发服务的计算机与运行该服务的计算机是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 个答案:

答案 0 :(得分:0)

我添加了这两个文件夹,即C:\ Windows \ SysWOW64 \ config \ systemprofile \ Desktop(64位)和C:\ Windows \ System32 \ config \ systemprofile \ Desktop(32位)。我在另一个论坛上找到了它们,因此决定尝试。现在可以了。 不要问我为什么...