2016-11-23 159 views
0

我在Visual Studio 2013中創建了一個表單,用於同時在多個用戶的Excel中輸入數據。除非兩個用戶同時打開表單,或者點擊了提交併且表單仍在處理,否則會發生錯誤。寫入excel和只讀屬性vb.net

未處理的異常發生在您的應用程序。來自HRESULT的例外:0x800A03EC

將數據寫入文件時,我想讓它只讀,以便其他用戶可以等待。我該怎麼做呢?

Imports excel = Microsoft.Office.Interop.Excel 
Imports System.Runtime.InteropServices 

Public Class Form1 
Dim xlapp As New excel.Application 
Dim workbook As excel.Workbook 
Dim worksheet As excel.Worksheet 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 
workbook = xlapp.Workbooks.Open("\2.xlsx") 
xlapp.Visible = False 
worksheet = workbook.Sheets("sheet1") 
End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

If workbook.MultiUserEditing Then 
    workbook.AcceptAllChanges() 
    workbook.Save() 
End If 

Dim row As Long 
Dim alpha As Long = 0 
row = 5 
With worksheet 
    Do While .Cells(row, 4).value IsNot Nothing 
     row = row + 1 
    Loop 

    .Cells(row, 2).value = Me.fname.Text 
    .Cells(row, 3).value = Me.lname.Text 
    Me.fullname.Text = Me.fname.Text + Me.lname.Text 
    .Cells(row, 4).value = Me.fullname.Text 

End With 
xlapp.DisplayAlerts = False 

workbook.SaveAs("\2.xlsx", AccessMode:=excel.XlSaveAsAccessMode.xlShared) 

End Sub 
End Class 
+0

你有沒有考慮製作的Excel文件的模板? – JohnG

+0

這是什麼意思?對不起,我對這一切都不知道 – user5538704

+0

模板文件就像只讀文件。例如:當您使用'workbook = xlapp.Workbooks.Open(「\ 2.xlsx」)打開一個常規的excel文件時,這會打開文件並保持打開狀態,直到用戶關閉它爲止。另一方面,模板將簡單地將自身作爲新文件複製到用戶「Document1」並關閉模板。然後,當用戶嘗試保存該文件時,系統會提示他們爲其提供文件名,因爲該模板已關閉。那麼用戶在同一時間抓取文件的可能性就會降低。 – JohnG

回答

0

你想要的是,文件應該是相互排斥的寫作,即如果有人打開它寫作別人不能打開它進行編輯。 這個問題的一個簡單的解決方案是,每當用戶打開一個文件記錄它。這可以通過在數據庫或文件系統中跟蹤表來實現。

  1. 對於DB方法: - 檢查記錄表的文件名存在。如果是,請將標籤的文本設置爲「只讀」,不允許保存。如果未找到記錄,請在數據庫中插入一條記錄並允許保存。當表格被保存/關閉時從表格中刪除該記錄。即使您可以通過跟蹤哪個用戶打開/關閉它以及在何時擴展功能。在這種情況下,您不需要刪除記錄,但可以添加更多列IsOpened,User,StartDateTime,EndDateTime。
  2. 對於文件系統方法: - 檢查文件夾中是否存在filename的空文件。如果文件存在,請將標籤的文本設置爲「Read only」,並且不允許保存。如果文件不存在,請在Lock文件夾中使用filename創建一個空文件並允許保存。表單保存/關閉時,從文件夾中刪除此文件。

已更新對於文件系統方法: - 下面僅向您展示該方法。我沒有編譯代碼。請原諒我。

  1. 在excel文件將被保存的位置創建一個文件夾「Lock」。
  2. 在表單上添加一個指標(例如label lblAccess)。
  3. 更新Form1_Load()以檢查鎖定文件夾中是否存在文件並指示用戶有關訪問。
  4. 更新的button1_Click函數來執行或不執行另存爲

---代碼如下---

Dim lockFile As String ' form/class level variable 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 

    Dim filename As String = "2.xlsx" 
    Dim sharedFolder As String = "\\ComputerABC\XL_FILE_FOLDER\LOCK\" 

    lockFile = sharedFolder + filename 
    If (System.IO.File.Exists(lockFile)) Then 
     Me.lblAccess.Visible = True 
     Me.lblAccess.Text = "Read-Only Access. Data cannot be saved." 
    Else 
     IO.File.Create(lockFile).Dispose() 'create empty file 
     Me.lblAccess.Visible = False 
    End If 
    Me.Button1.Enabled = Not Me.lblAccess.Visible 

    workbook = xlapp.Workbooks.Open("\" + filename) 
    xlapp.Visible = False 
    worksheet = workbook.Sheets("sheet1") 
End Sub 



Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    : 
    : 
    : 
    If Not lblAccess.Visible Then 
     workbook.SaveAs("\2.xlsx", AccessMode:=excel.XlSaveAsAccessMode.xlShared) 
     System.IO.File.Delete(lockFile) 
     lockFile = "" 
    End If 

End Sub 
+0

我必須使用文件系統的方法,但是請您解釋一下如何編寫代碼? – user5538704

+0

更新了代碼 –

+0

問題是用戶在輸入一個數據後不會關閉表單。他們可以在打開表格的情況下輸入任意次數。所以,第二次鎖定文件沒有被創建並顯示錯誤。此外,如果用戶獲得「只讀訪問權限,無法保存數據」,那麼爲了檢查文件是否可以自由寫入數據,他必須關閉並再次打開我不想要的表單。應該有一些限制,之後用戶知道該文件是免費的,他可以點擊提交。請幫助如何做到這一點? – user5538704