当从C#打开一个Excel spreedsheet正在被其他用户使用时,引发exception

我目前正在开发一个应用程序,需要一个Excel电子表格,用户select的位置,被读入一个数据表,然后存储在一个SQL Server数据库。

该应用程序在我的开发环境中完美工作,但是当它被部署到我的生产环境中时,将引发exception并显示以下消息。

Microsoft Jet数据库引擎无法打开文件“.xls”。 它已经由另一个用户专门打开,或者您需要查看其数据的权限。

我的代码来读取excel文件如下:

OleDbConnection objConn = null; DataSet objDataset1 = null; string fileLocation = GetFileLocation(); string sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + fileLocation + ";" + "Extended Properties=Excel 8.0;"; objConn = new OleDbConnection(sConnectionString); objConn.Open(); //This is where the exception is thrown OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [Sheet1$]", objConn); OleDbDataAdapter objAdapter1 = new OleDbDataAdapter(); objAdapter1.SelectCommand = objCmdSelect; objDataset1 = new DataSet(); objAdapter1.Fill(objDataset1, "XLData"); DataTable dt = objDataset1.Tables["XLData"]; 

请注意,应用程序和excel文件位于同一个域中的不同服务器上。

围绕各种论坛和知识库,当“用户”没有使用该文件的权限时,会出现exception。 虽然不build议对所有用户的文件权限设置为完全访问权限。

除了文件权限还有什么可能导致这个exception被抛出?

不知道这是否有帮助,但…

错误:

Microsoft Jet数据库引擎无法打开文件“.xls”。

似乎指向一个名为.xls的文件,而不是某个名为myspreadsheet.xlsprodfile.xls

这可能是一个远射,但你可以做一些debugging,以确保文件Jet试图打开实际存在? 可能是由于某种原因,文件名没有正确构build。

下面是对同一个根问题的一些答案:

在Windows服务中使用OleDb从Excel中读取?

杀死以前打开的Excel过程,然后再开始读取Excel的新过程,这将解决您的问题。

我写了一个函数,你可以在打开xls之前调用它。

 private void kill_excel_process() { foreach (Process clsProcess in Process.GetProcesses()) { if (clsProcess.ProcessName.Equals("EXCEL")) { clsProcess.Kill(); break; } } }