簡體   English   中英

如何在一個 excel 文件中保存到 datagridview 數據

[英]How to save to datagridview data in one excel file

我正在使用microsoft.excel.introp.dlldatagridview數據保存到 excel 文件中,我的問題是如何在一個sheet1sheet2文件中保存兩個datagridview數據

我正在使用此代碼將第一個 datagridview 保存為 excel 文件:

    Private Sub copyAlltoClipboard()
        DataGridView1.SelectAll()
        Dim dataObj As DataObject = DataGridView1.GetClipboardContent()
        If dataObj IsNot Nothing Then Clipboard.SetDataObject(dataObj)
    End Sub

    Private Sub releaseObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
            MessageBox.Show("Exception Occurred while releasing object " & ex.ToString())
        Finally
            GC.Collect()
        End Try
    End Sub

 Dim sfd As SaveFileDialog = New SaveFileDialog()
            sfd.Filter = "Microsoft Excel 97-2003 Workbook (*.xls)|*.xls"

            sfd.FileName = NomTextBox.Text & "_" & PrenomTextBox.Text

            If sfd.ShowDialog() = DialogResult.OK Then
                copyAlltoClipboard()
                Dim xlexcel As Excel.Application
                Dim xlWorkBook As Excel.Workbook
                Dim xlWorkSheet As Excel.Worksheet
                Dim misValue As Object = System.Reflection.Missing.Value
                xlexcel = New Excel.Application()
                xlexcel.Visible = False
                xlWorkBook = xlexcel.Workbooks.Add(misValue)
                xlWorkSheet = CType(xlWorkBook.Worksheets.Item(1), Excel.Worksheet)
                Dim CR As Excel.Range = CType(xlWorkSheet.Cells(1, 1), Excel.Range)
                CR.[Select]()
                xlWorkSheet.PasteSpecial(CR, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, True)

 xlWorkBook.SaveAs(sfd.FileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue)
                xlexcel.DisplayAlerts = True
                xlWorkBook.Close(True, misValue, misValue)
                xlexcel.Quit()
                releaseObject(xlWorkSheet)
                releaseObject(xlWorkBook)
                releaseObject(xlexcel)
                Clipboard.Clear()

這不是我的代碼,我從其他人那里獲取並對其進行了修改。

首先,您應該知道不建議使用Interop 還有其他第三方庫在許多方面工作得更好,並且有一些優勢。 即,使用互操作要求目標計算機具有與代碼使用的相同的 Excel 庫。 但是,我知道這可能是必需的或唯一的選擇。 如果是這種情況,那么下面的代碼可能會有所幫助。

當前代碼存在的一個問題是無法控制“工作表名稱”應該是什么。 恕我直言,最好給工作表一個“特定”的名稱,以便代碼以后可以用新數據覆蓋文件。 通過簡單地添加新的工作表,您最終可能會得到一堆具有相同數據的工作表。

因此,我創建了一個GetWorksheet方法,它采用WorkbookString name. 此方法將返回一個與給定名稱“匹配”的Worksheet ,或者如果在給定工作簿中找不到工作表名稱,則它將返回一個具有給定名稱的新工作表。 這種方法可能看起來像……

Private Function GetWorksheet(wb As Excel.Workbook, name As String) As Excel.Worksheet
  For Each ws In wb.Sheets
    If ws.Name = name Then
      Return ws
    End If
  Next
  Dim newWS = wb.Worksheets.Add()
  newWS.Name = name
  Return newWS
End Function

上面的代碼循環遍歷給定工作簿中的所有工作表。 如果找到與給定名稱匹配的工作表名稱,則返回該工作表。 如果未找到工作表名稱,則返回具有給定名稱的新工作表。 這將允許您將工作表命名為比“Sheet1”、“Sheet2”等更直觀的名稱。我們可以使用此方法獲取現有工作表或為要添加到工作簿的每個網格創建一個新工作表。

接下來,稱為AddSheetToWorkbook的第二個輔助方法接受一個工作簿、一個DataGridView和一個工作表名稱......可能會使事情變得更容易。 在這種方法中,代碼將 select 給定網格中的所有單元格。 使用上述方法從給定(OPEN)工作簿中獲取具有給定工作表名稱的工作表。 然后將復制的單元格粘貼到工作表中。 它可能看起來像……

Private Sub AddSheetToWorkbook(xlWorkBook As Excel.Workbook, dgv As DataGridView, wkSheetName As String)
  dgv.SelectAll()
  Dim dataObj As DataObject = dgv.GetClipboardContent()
  If dataObj IsNot Nothing Then Clipboard.SetDataObject(dataObj)
  Dim xlWorkSheet = GetWorksheet(xlWorkBook, wkSheetName)
  Dim CR As Excel.Range = CType(xlWorkSheet.Cells(1, 1), Excel.Range)
  CR.[Select]()
  xlWorkSheet.PasteSpecial(CR, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, True)
End Sub

我們可以使用此方法將每個DataGridView添加到工作簿中的不同工作表中。

最后,將所有這些放在一起可能如下所示。 我使用了一些不同的方法,使用Try/Catch/Finally來確保 Excel COM 對象被正確處理,但是,在我的測試中,當前代碼也可以工作。

該代碼使用與當前代碼相同的方法。 使用SaveFileDialog. 創建一個新的 Excel 應用程序,添加一個工作簿,然后將兩個網格添加到工作簿中。 每個網格將位於具有提供的工作表名稱的單獨工作表上。 文件被保存, Finally COM對象被關閉並釋放。

目前尚不清楚在當前發布的代碼中調用此代碼的“位置”。 在這個例子中,代碼是通過按下窗體上的按鈕來運行的。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  Dim sfd As SaveFileDialog = New SaveFileDialog With {
    .Filter = "Microsoft Excel 97-2003 Workbook (*.xls)|*.xls",
    .FileName = NomTextBox.Text & "_" & PrenomTextBox.Text
  }
  If sfd.ShowDialog() = DialogResult.OK Then
    Dim xlexcel As Excel.Application = Nothing
    Dim xlWorkBook As Excel.Workbook = Nothing
    Dim misValue As Object = Reflection.Missing.Value
    Try
      xlexcel = New Excel.Application()
      xlWorkBook = xlexcel.Workbooks.Add()
      AddSheetToWorkbook(xlWorkBook, DataGridView1, "Grid1")
      AddSheetToWorkbook(xlWorkBook, DataGridView2, "Grid2")
      xlWorkBook.SaveAs(sfd.FileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue)
    Catch ex As Exception
      MessageBox.Show("Error: " + ex.Message)
    Finally
      If (xlWorkBook IsNot Nothing) Then
        xlWorkBook.Close()
        Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook)
      End If
      If (xlexcel IsNot Nothing) Then
        xlexcel.Quit()
        Runtime.InteropServices.Marshal.ReleaseComObject(xlexcel)
      End If
      MessageBox.Show("Export Complete")
    End Try
  End If
End Sub

最后,我猜你不需要 Excel 文件中的列標題,因為操作系統 select all 和復制命令不會抓取網格列 Z099FB995346F31C749F6E40DB0F395E

我希望這是有道理的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM