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

免责声明:我知道这是一个糟糕的做事方式。 这是我们与客户的唯一select。

问题:

我们需要每x次读取Excel文件中的数据。 数据通过第三方Excel插件不断变化。应用程序的环境是Windows XP,SP1和.Net 2.0。 不要将操作系统升级到SP2 / 3或升级.Net Framework。 再次,这是所有的客户参数。

以下是我们现有的代码:

 String sConnectionString = @“Provider = Microsoft.Jet.OLEDB.4.0; Data Source =”+ Settings.ReutersFilePath +“; Extended Properties = \”Excel 8.0; HDR = No; IMEX = 1 \“”;
使用(OleDbConnection objConn =新的OleDbConnection(sConnectionString))
 {
    尝试
     {
         objConn.Open();
         _dataSet = new DataSet();
         OleDbCommand objCmdSelect = new OleDbCommand(“SELECT * FROM [”+ ConfigurationManager.AppSettings [“Excel.WorksheetName”] +“$]”,objConn);
         OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
         objAdapter1.SelectCommand = objCmdSelect;
         objAdapter1.Fill(_dataSet);
         _dataTable = _dataSet.Tables [0];
         objConn.Close();

         //将新数据保存到数据库中。
        即updateSQL();
     }
     catch(Exception ex){}
    最后
     {
         _isCurrentlyProcessing = false;
         if(objConn!= null &&(objConn.State!= ConnectionState.Broken || objConn.State!= ConnectionState.Closed))
         {
             objConn.Close();
         }
     }
 }

此代码在从控制台或Windows窗体运行时起作用,但是当我们从Windows服务运行它时,它无法访问Excel文件。 XP w / SP1有没有限制,不允许与Vista中的桌面应用程序交互? 这可以通过服务完成吗? 客户非常需要运行服务的可靠性。

编辑:

该服务以LocalSystem身份运行。

编辑#2:

从服务运行时得到的错误是:Microsoft Jet数据库引擎无法打开文件“”。 它已经由另一个用户专门打开,或者您需要查看其数据的权限。

Excel文件在桌面上打开,但必须打开才能从第三方应用程序获取更新。

除了@ sontek的回答。

[只适用于如果您是相关电子表格的拥有者/开发者…]

您可能会发现使用“数据推送”模式而不是“数据推送”模式更容易。 根据插件的某些事件,通过一个Excelmacros直接将数据推送到数据存储区通常是一个更简单的编程模型。 这通常比定时器上的服务轮询更好。

Excel不允许你同时打开一个文件。 您需要将其作为共享工作簿创build,或者创build该文件的副本并从副本中删除。

还有完整的excel API(Microsoft.Office.Interop.Excel),你可以尝试使用,这将允许你钩入当前打开的Excel /工作簿。

什么用户是运行的服务? 确保用户有权访问特定的文件。

这似乎很可能是一个权限问题。 Windows服务在与桌面应用程序不同的用户帐户下运行。

另外,你提到你每x次执行一次这个方法。 确保你使用正确的计时器。 http://www.aspfree.com/c/a/C-Sharp/Timer-Objects-in-Windows-Services-with-C-sharp-dot-NET/

而且您应该可以使用“附加到进程”并select您的主机进程,将debugging器附加到该服务。 这可能会给你更多关于你的问题的信息。 http://msdn.microsoft.com/en-us/library/7a50syb3(VS.80).aspx

SpreadsheetGear for .NET可以打开文件,即使Excel当前打开了文件,也非常适合从Windows服务中使用。

但是,磁盘上的文件不会反映Excel未保存的更改,而且Excel正处于保存过程中,SpreadsheetGear将无法打开工作簿,因此服务将不得不考虑这一点。

免责声明:我自己的SpreadsheetGear LLC

您可以尝试将其制作为共享工作簿(“工具”>“共享工作簿”)。 这可以让多个用户同时编辑同一个工作簿。 我不确定这是否适用于您,因为某些工作簿function在共享时被locking