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

时间:2017-01-02 14:39:09

标签: c# openxml-sdk

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

我已经测试了3个尝试通过LAN同时写入数据的不同用户。 我最初在以下声明的开放期间得到了一个例外。

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

此时,即使已启用shareworkbook设置,也只有一个用户可以写入共享的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文件。用户2的写入在结束后开始     USER1。
  3. 任何人都可以指导我找到正确的方法来消除打开期间的异常,并使用OpenXML Sdk同时写入excel文件。

    提前致谢。

1 个答案:

答案 0 :(得分:1)

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

如果在打开文件时发生异常,可能尝试处理该异常,并添加重试逻辑?您可以使用类似https://github.com/App-vNext/Polly之类的内容来轻松完成。

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