多位用户使用OpenXML并发写入共享Excel文件

问题描述:

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

我已经用3个不同的用户在同一时间通过局域网测试了这个数据。 我最初在下面的声明中打开时遇到了异常。

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

此时,只有一个用户可以写入共享的excel文件,即使启用了shareworkbook设置。

后来,我改变了上面的语句中使用流如下

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写入 user1结束后开始。

任何人都可以请指导我找到合适的方法来消除在开放的例外,也做了并行写入使用OpenXML的SDK中的Excel文件。

在此先感谢。

+0

我严重怀疑这是可能的,因为OpenXML SDK是低级别的。如果您需要协调,那么您需要在客户端和OpenXML SDK之间为此设置一个层。 – Phil1970

如果您需要多用户访问并期望它可以正常工作,您可能应该考虑使用数据库。即使Access也会比Excel更好。如果您需要输出到Excel中,则可以导出到Excel的报表可以用于此功能。

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

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

+1

确切的说......如果说明书无效,应该改变它们。 – Phil1970