【问题标题】:Multiple users writing concurrently to shared Excel file using OpenXML多个用户使用 OpenXML 同时写入共享 Excel 文件
【发布时间】:2017-01-02 23:13:27
【问题描述】:

我需要在 C# 中使用 open xml sdk 读取和写入共享的 excel(xlsx) 文件。 我已经使用this 堆栈溢出问题的答案更新了共享模式设置,并且该设置在创建的 excel 文件中更新。 我写了一个小程序,根据this将数据插入到这个生成的Excel文件中。

我已经用 3 个不同的用户在 LAN 上同时写入数据对此进行了测试。 我最初在下面的语句中打开时遇到了异常。

using (SpreadsheetDocument doc = SpreadsheetDocument.Open(excelStream, true))

此时即使启用了共享工作簿设置,也只有一个用户可以写入共享的 Excel 文件。

后来我把上面的语句改成使用 Stream 如下

 using (FileStream excelStream = new FileStream(filePath,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.ReadWrite))
                {
                    using (SpreadsheetDocument doc = SpreadsheetDocument.Open(excelStream, true))

在此更改之后,初始异常的频率降低了,但有时仍会出现。但是,当这成功时,多个用户可以写入 excel 文件。

当多个用户写入共享的 Excel 文件时,我观察到两个重要的行为。

  1. 即使用户同时写入数据,用户在一个会话中写入的所有行也是按顺序排列的。
  2. 何时 多个用户尝试写入同一个共享 excel 文件,打开 xml 似乎按顺序在用户之后写入数据用户。 我通过在写入时插入时间戳来验证这一点 每个用户的excel文件。为 user2 写入在结束后开始 用户 1。

谁能指导我找到正确的方法来消除打开期间的异常,并使用 OpenXML Sdk 并发写入 excel 文件。

提前致谢。

【问题讨论】:

  • 我严重怀疑是否有可能这样做......因为 OpenXML SDK 是低级别的。如果你想要协调,那么你需要在你的客户端和 OpenXML SDK 之间建立一个层。

标签: c# openxml-sdk


【解决方案1】:

如果您需要多用户访问并希望它能够正常工作,您可能应该考虑使用数据库。甚至 Access 也会比 Excel 更好。如果您需要在 Excel 中输出,可以导出到 Excel 的报告可以实现。

如果在打开文件时发生异常,是否可以尝试处理该异常并添加重试逻辑?您可以使用 https://github.com/App-vNext/Polly 之类的东西来简化操作。

用户排序可能就是它处理写入的方式。我不希望这是您可以解决的问题,因为它是 Excel,而不是数据库。

【讨论】:

  • 正是...如果规范无效,则应更改它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多