![](/img/trans.png)
[英]How can I save filtered DataGridView data into Excel using EPPlus?
[英]How to save to datagridview data in one excel file
我正在使用microsoft.excel.introp.dll將datagridview數據保存到 excel 文件中,我的問題是如何在一個sheet1和sheet2文件中保存兩個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
方法,它采用Workbook
和String
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.