我在使用Excel工作簿导入/导出数据时遇到了一些麻烦。例如,我有一个包含3个文本框的表单。
我已经设置了一个简单的Excel工作表,单元格A1,A2和A3已完成。当我运行调试时,只有前两个框填充了Excel数据。
另外,当我更改文本框中的值时,它不会保存回原始电子表格!?!当我尝试打开电子表格以查看保存是否已发生时,会出现只读通知...但我仍然希望能够更改原始工作表,以便在应用程序启动时导入新数据!
我已粘贴下面的代码......我做错了什么?
Public Class Form1
Dim objExcel As New Excel.Application
Dim objWorkbook As Excel.Workbook
Dim objWorksheet As Excel.Worksheet
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
objWorkbook = objExcel.Workbooks.Open("C:\Users\HP\desktop\Book2.xls")
objWorksheet = CType(objWorkbook.Worksheets.Item("Sheet1"), Excel.Worksheet)
TextBox1.Text = objWorksheet.Cells(1, 1).text
TextBox2.Text = objWorksheet.Cells(2, 1).text
TextBox3.Text = objWorksheet.Cells(3, 1).text
End Sub
Private Sub Command1_Click()
objWorksheet.Cells(1, 1).Value = TextBox1.Text
objWorksheet.Cells(2, 3).Value = TextBox2.Text
objWorksheet.Cells(3, 3).Value = TextBox3.Text
End Sub
Private Sub Command2_Click()
objExcel.Application.Quit()
End Sub
Private Sub Command3_Click()
objExcel.SaveAs("C:\Users\HP\desktop\Book2.xls")
End Sub
End Class
答案 0 :(得分:0)
设置textbox3的行是未命名的TextBox3.Text = objWorksheet.celss(3,1).text
尝试使用此代码替换您的代码。如果它仍然在fileprotection上抱怨,请在新文件上尝试它,因为旧文件仍然被锁定。 公共类Form1
Dim objExcel As New Excel.Application
Dim objWorkbook As Excel.Workbook
Dim objWorksheet As Excel.Worksheet
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
objWorkbook = objExcel.Workbooks.Open("C:\Temp\Bok3.xlsx")
objWorksheet = objWorkbook.Worksheets.Item("Sheet1")
TextBox1.Text = objWorksheet.Cells(1, 1).text
TextBox2.Text = objWorksheet.Cells(2, 1).text
TextBox3.Text = objWorksheet.Cells(3, 1).text
objExcel.Workbooks.Close()
objExcel.Application.Quit()
End Sub
Private Sub Command1()
objWorkbook = objExcel.Workbooks.Open("C:\Temp\Bok3.xlsx")
objWorksheet = objWorkbook.Worksheets.Item("Sheet1")
objWorksheet.Cells(1, 1).Value = TextBox1.Text
objWorksheet.Cells(2, 1).Value = TextBox2.Text
objWorksheet.Cells(3, 1).Value = TextBox3.Text
objWorkbook.Save()
objExcel.Workbooks.Close()
objExcel.Application.Quit()
End Sub
End Class
答案 1 :(得分:0)
您是否尝试使用标准API调用来结束该过程,从而解锁Excel文件。
如果你使用System.Runtime.InteropServices.Marshal.ReleaseComObject(objComObject)
,程序似乎仍然存在,直到程序关闭,此时Excel进程终止,文件可以打开而不是“只读”。
这是一种方法:
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Int32, ByVal wMsg As Int32, _
ByVal wParam As Int32, ByVal lParam As Int32) As Int32
Const WM_QUIT = &H12
在您的代码中,保存并退出后,请调用PostMessage
PostMessage(objExcel.Hwnd, WM_QUIT, 0, 0)
该过程将结束,从而释放锁定。我以前遇到过这个问题,互联网上有很多东西。某些版本的ReleaseComObject
可以正常工作,但它们似乎只能在XP之后的版本上运行,而且它们似乎在XP版本上运行良好。没有多大意义,但我似乎唯一能找到工作的是PostMessage
声明。
答案 2 :(得分:0)
如果您保存工作表而不是工作簿,它似乎工作正常。这假设您只需要保存当前工作表。
Public Class Form1
Dim objExcel As New Excel.Application
Dim objWorksheet As Excel.Worksheet
Dim objWorkbook As Excel.Workbook
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
objWorkbook = objExcel.Workbooks.Open("C:\Users\HP\desktop\Book2.xls")
objWorksheet = CType(objWorkbook.Worksheets.Item("Sheet1"), Excel.Worksheet)
TextBox1.Text = objWorksheet.Cells(1, 1).text
TextBox2.Text = objWorksheet.Cells(2, 1).text
TextBox3.Text = objWorksheet.Cells(3, 1).text
End Sub
Private Sub Command1_Click() Handles Button1.Click
objWorksheet.Cells(1, 3).Value = TextBox1.Text
objWorksheet.Cells(2, 3).Value = TextBox2.Text
objWorksheet.Cells(3, 3).Value = TextBox3.Text
objWorksheet.SaveAs("C:\Users\HP\desktop\Book2.xls")
objExcel.Workbooks.Close()
objExcel.Application.Quit()
End Sub
End Class