2011-09-10 46 views
0

我在向/從Excel工作簿中導入/導出數據時遇到了一些麻煩。例如,我有一個帶有3個文本框的表單。在Visual Basic中持久化TextBox文本

我已經完成了單元格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

上面的代碼是否編譯?它不應該只看這一行TextBox3.Text = objWorksheet.celss(3,1).text –

+0

謝謝Mattias,這是一個我沒有注意到的錯誤是阻止txtbox 3填充....你有任何關於爲什麼我不能回寫excel並重新打開原始電子表格以改變單元格內容的想法?對不起所有的問題,我對VB非常陌生,並且仍然在找我。再次感謝H – Hazeley

+0

你用什麼來閱讀excel什麼庫你導入使用Excel.Workbook爲例子? –

回答

0

那臺textbox3該生產線是小姐類型TextBox3.Text = objWorksheet.celss(3,1)的.text

嘗試使用此代碼替換代碼。如果它仍然在文件保護上投訴,請嘗試使用新文件,因爲舊文件仍處於鎖定狀態。 公共類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 
+0

我試過了,沒有運氣,我很害怕...現在還出現了一條新的錯誤消息,指出New不能用作接口(第3行)此外,該應用程序現在完全沒有從Excel工作簿中返回任何值。我修改了原始問題中的代碼以顯示我現在所擁有的信息再次感謝您的幫助H – Hazeley

+0

我更新了自己的答案並嘗試了自己的代碼,並且它可以工作,因此我希望它能幫助您解決問題。 –

+0

感謝馬蒂亞斯....我恐怕我仍然在這裏完全喪失。該應用程序正在讀取數據,但由於某種原因,Excel文件的路徑包含在'objWorkbook = objExcel.Workbooks.Open(「C:\ Users \ Public \ Book2.xls」)行中自動變爲只讀。我已經檢查了文件屬性,它們沒有設置爲只讀,所以我不確定發生了什麼事情?我創建了兩個新文件,每個文件都有不同的名稱,但同樣的事情仍在繼續。非常感謝你對此的幫助,我真的很感激H – Hazeley

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 

在你的代碼,並保存後在quiting,調用PostMessage的

PostMessage(objExcel.Hwnd, WM_QUIT, 0, 0) 

過程將結束,從而解除鎖定。之前我曾經遇到過這個問題,整個互聯網上都有一些瘋狂的東西。某些版本的ReleaseComObject可以工作,但似乎只適用於比XP更高版本的Excel,並且它們在XP版本上似乎不起作用。沒有多少意義,但我似乎已經發現的唯一工作是PostMessage聲明。

祝你好運......你不是唯一一個在那裏。只需在Bing中搜索「excel.application process release」,您就會驚訝於您發現的內容!

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