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

C# 在Windows服务中使用OleDb从Excel读取?,c#,excel,C#,Excel,免责声明:我知道这是一种糟糕的做事方式。这是我们与客户的唯一选择 问题: 我们需要每隔x个时间从Excel文件中读取数据。数据通过第三方Excel插件不断变化。应用程序的环境是Windows XP、SP1和.Net 2.0。无需将操作系统升级到SP2/3或升级.Net Framework。同样,这都是每个客户的参数 以下是我们目前的代码: String sConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + S

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

问题:

我们需要每隔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\""; using (OleDbConnection objConn = new OleDbConnection(sConnectionString)) { try { 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(); // Persists new data to a database. UpdateSQL(); } catch (Exception ex) { } finally { _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文件在桌面上是打开的,但它必须打开才能从第三方应用程序获取更新。

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

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

另外,您提到每x个时间执行一次此方法。确保使用正确的计时器


您应该能够通过使用“附加到进程”并选择主机进程,将调试器附加到服务。这可能会为您提供有关问题的更多信息

您可以尝试将其设置为共享工作簿工具>共享工作簿。这允许多个用户同时编辑同一工作簿。我不确定这是否适用于您,因为某些工作簿功能在共享时会被锁定

Excel不允许您同时打开文件。您需要将其创建为共享工作簿,或者制作文件的副本并处理副本


您还可以尝试使用完整的excel API Microsoft.Office.Interop.excel,这将允许您连接到当前打开的excel/工作簿。

除了@sontek的答案之外

[仅当您是相关电子表格的所有者/开发者时适用…]

您可能会发现使用数据推送模型比使用数据拉取模型更容易。根据插件中的某个事件,通过excel宏将数据直接推送到数据存储中通常是一种更简单的编程模型。这通常比在计时器上进行服务轮询要好得多。

可以打开文件,即使Excel当前已打开该文件,并且它非常适合从Windows服务使用

但是,磁盘上的文件不能反映Excel没有保存的更改,而SpreadsheetGear不能在Excel处于保存中时打开工作簿,因此服务必须考虑到这一点。


免责声明:我拥有的SpreadsheetGear LLC

服务正在作为LocalSystem运行。我应该在哪里签入XP以获取所述权限。既然您已经发布了错误,权限就不是问题了:我们可以在机器上测试它,但机器上没有任何devenv,因此附加调试器将无法工作。我还没有任何运气尝试远程附加调试器。至于计时器,我们使用的是System.Threading.timer。我可能会尝试以用户身份登录该服务,看看会发生什么。共享时,C代码无法从Excel文件中获取最新数据:它只获取最后保存的数据。我从未处理过任何Excel宏内容。最初的谷歌搜索让我觉得这可能是最好的选择。我假设Excel宏可以检测到单元格的更改,然后触发逻辑?是的,当然。事件在多个级别触发,单元格事件将在工作表级别处理其他级别是应用程序、工作簿和图表,您可以将已更改的单元格作为一个范围传递给处理程序。当然,这里还有一些宏的VBA代码。。。将此标记为答案,因为它给了我们更好的想法。