2017-01-02 83 views
0

我有一個要求,使用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

回答

1

如果您需要多用戶訪問並期望它可以正常工作,您可能應該考慮使用數據庫。即使Access也會比Excel更好。如果您需要輸出到Excel中,則可以導出到Excel的報表可以用於此功能。

如果在打開文件時發生異常,可能是嘗試處理該異常並添加重試邏輯?你可以使用諸如https://github.com/App-vNext/Polly之類的東西來簡化操作。

用戶排序可能就是它如何處理寫入。我不希望這是你可以解決的問題,因爲它是Excel,而不是數據庫。

+1

確切的說......如果說明書無效,應該改變它們。 – Phil1970