none
[VB2008] DataGridView資料寫入Excel的問題 RRS feed

  • 問題

  • 想請教各位大大
    小弟將dataGridView的資料寫回Excel時
    會發生一個很怪的問題
    就是最後兩筆資料會重複
    舉例來說:
    DataGridView中已經有五筆資料
    若我刪除兩筆
    再新增三筆後
    將資料寫回Excel時
    應該會寫入六筆資料
    但是...
    系統會寫回...八筆資料
    最後兩筆資料會重複寫入
    想請問一下這是什麼問題呢??

    code如下:
                Dim xlsApp As New Object
                xlsApp = CreateObject("Excel.Application")
                Dim xlsSheet As Object
                Dim xlsBook As Object
                xlsBook = xlsApp.workbooks.open(Open_File)
                xlsSheet = xlsBook.sheets("Sheet1")
                'Dim WorkSheetName As String
    
                Dim k As Integer
    
                For k = 1 To saveTable.Columns.Count - 1
                    xlsSheet.cells(1, k) = nMDS.Tables(0).Columns(k - 1).Caption
                Next k
    
                Dim i As Integer
                Dim j As Integer
    
                For i = 0 To (saveTable.Rows.Count - 1)
                    For j = 0 To saveTable.Columns.Count - 1
                        xlsSheet.cells(i + 2, j + 1) = saveTable.Rows(i).Item(j)
                    Next j
                Next i
    
                xlsApp.quit()
                xlsSheet = Nothing
                xlsBook = Nothing
                xlsApp = Nothing
                GC.Collect()
    


    開發環境:WIN XP SP3+Visual Studio VB2008+Framework 3.5
    2009年4月10日 下午 03:34

解答

所有回覆

  • 風箏:
           我覺得問題不出在存檔,而出在刪除.
           你先測試一下,不要刪除,直接新增三筆,會不會得到正確的結果
           如果這樣是正確,那可能是刪除的地方有問題.
    2009年4月10日 下午 03:49
    版主
  • Bill大
    如果不刪除而直接存檔
    則是OK的
    但如果刪除後寫入Excel檔
    則會出現重複寫入的問題
    但在同時間會寫入另一個txt檔
    則是沒有問題的...
    這就是神奇的地方了...

    寫入txt檔的code如下:
                txtFileName = SaveDataBase.FileName
    
                Dim saveFileName As FileStream = New FileStream(txtFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)
    
                Using FileSave As StreamWriter = New StreamWriter(saveFileName, System.Text.Encoding.Unicode)
                    'For Each saveTable In 
                    For Each colobject In saveTable.Columns
                        FileSave.Write(colobject.caption & ";")
                    Next
                    FileSave.WriteLine()
                    For Each fileRow In saveTable.Rows
    
                        For Each fileColumn In saveTable.Columns
    
                            FileSave.Write(fileRow(fileColumn).ToString() & ";")
    
                        Next fileColumn
    
                        FileSave.WriteLine()
    
                    Next fileRow
                    'Next saveTable
    
                End Using
    2009年4月11日 上午 01:15
  • HI,

    您可以考慮用OLEDB+ADO.NET的技術寫入資料到EXCEL文件, 好做又不容易發生錯誤:
    Reading and Writing Excel using OLEDB
    • 已提議為解答 Lolota Lee 2009年4月13日 上午 09:31
    • 已標示為解答 bauannModerator 2009年4月17日 上午 02:25
    2009年4月11日 上午 07:44
  • 這幾天一直在研究
    還是研究不出個所以來

    小弟在讀入Excel的code如下:
            Excel_xls = "Excel 2000-2003(*.xls)|*.xls"
    
            OpenDataBase.Filter = Excel_xls
            OpenDataBase.FilterIndex = 1
            OpenDataBase.RestoreDirectory = True
            OpenDataBase.InitialDirectory = "C:\"
    
            If OpenDataBase.ShowDialog() = DialogResult.OK Then
                Open_File = OpenDataBase.FileName
                'SheetInputDialog.Show()
    
                'MessageBox.Show(sheetName)
                MyOleDb_cn = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;" & "Data Source=" & Open_File & ";" & "Extended Properties=Excel 8.0")
                MyOleDb_cmd = New OleDb.OleDbCommand("Select * from [Sheet1$]", MyOleDb_cn)
                MyData = New OleDb.OleDbDataAdapter(MyOleDb_cmd)
                MyData.Fill(MDS)
                sBS.DataSource = MDS.Tables(0)
                DataView.DataSource = sBS
                sBS.ResetBindings(False)
                'DataView.DataSource = MDS.Tables(0).DefaultView
    
                AddSong_Button.Visible = True
            End If

    目前寫入Exel的code如下:
                Dim xlsApp As New Object
                xlsApp = CreateObject("Excel.Application")
                Dim xlsSheet As Object
                Dim xlsBook As Object
                xlsBook = xlsApp.workbooks.open(Open_File)
                xlsSheet = xlsBook.sheets("Sheet1")
    
                Dim k As Integer
    
                For k = 1 To saveTable.Columns.Count - 1
                    If (nMDS.Tables(0).Columns(k - 1).Caption.ToString = "歌曲編號") Then
                        xlsSheet.cells(1, k) = "#歌曲編號"
                    ElseIf (nMDS.Tables(0).Columns(k - 1).Caption.ToString <> "歌曲編號") Then
                        xlsSheet.cells(1, k) = nMDS.Tables(0).Columns(k - 1).Caption
                    End If
                Next k
    
                Dim i As Integer
                Dim j As Integer
    
                For i = 0 To (saveTable.Rows.Count - 1)
                    For j = 0 To saveTable.Columns.Count - 1
                        xlsSheet.cells(i + 2, j + 1) = saveTable.Rows(i).Item(j)
                    Next j
                Next i
    
                xlsApp.quit()
                xlsSheet = Nothing
                xlsBook = Nothing
                xlsApp = Nothing
                GC.Collect()
    
            End If
    小弟要怎麼改寫「寫入Excel」這塊呢??
    2009年4月20日 上午 07:51