2016-11-23 115 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