多个用户使用 OpenXML 同时写入共享 Excel 文件

Multiple users writing concurrently to shared Excel file using OpenXML

我需要在 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 文件进行并发写入。

提前致谢。

如果您需要多用户访问并希望它能正常工作,您可能应该考虑使用数据库。即使是 Access 也比 Excel 好。如果您需要在 Excel 中输出,可以导出到 Excel 的报告可以满足此要求。

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

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