在Winform 的开发中,经常要做Excel的报表,有些报表很复杂,也有简单的。
复杂的就不讲了,简单的比如说:要次一个DataGridView中的数据原板原样的放到Excel中。
通常从DataGridView中取数据都是逐行读取。如果这样做,遇到数据量比较大的时候,速度会变得很慢。
不符合需求。
在.net中DataGridView已经封装好复制的功能。可以直接调用。
贴一段核心代码:使用pubs数据库中的jobs资料表
在使用粘贴板的时候有可能乱码(因为DataGridView和Excel的格式是不一样的。)
解决方法 在粘贴的时候使用Excel中的选择性粘贴功能。
'下面這一行,相當于在Excel中點擊右鍵->選擇性粘貼->文本
objexcel.ActiveSheet.PasteSpecial(Format:="文本", Link:=False, DisplayAsIcon:=False)
运行效果图:

源代码:
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- Try
- Dim filepath As String = Application.StartupPath & "/" & Now.ToFileTimeUtc & ".xls"
- Dim objexcel As New Excel.Application()
- Dim objbook As Excel.Workbook = objexcel.Workbooks.Add()
- objbook.SaveAs(filepath)
-
-
- Me.DataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText
-
- Me.DataGridView1.RowHeadersVisible = False
-
- Me.DataGridView1.SelectAll()
-
- If Me.DataGridView1.GetCellCount(DataGridViewElementStates.Selected) > 0 Then
- Clipboard.SetDataObject(Me.DataGridView1.GetClipboardContent())
- End If
-
-
-
-
- objexcel.ActiveSheet.PasteSpecial(Format:="文本", Link:=False, DisplayAsIcon:=False)
-
- objexcel.Cells.Select()
-
- objexcel.Selection.WrapText = False
-
- objexcel.Columns.AutoFit()
-
- objbook.Save()
-
- objbook.Close()
- objexcel.Quit()
- objbook = Nothing
- objexcel = Nothing
- killexcel()
-
- If MessageBox.Show("档案储存在:" & filepath & ",你要打开吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) = Windows.Forms.DialogResult.Yes Then
- Process.Start(filepath)
- End If
- Catch ex As Exception
- killexcel()
- MsgBox(ex.Message)
- End Try
- End Sub
-
-
- Private Sub killexcel()
- Try
- For Each proc As Process In Process.GetProcessesByName("EXCEL")
- If proc IsNot Nothing AndAlso proc.MainWindowTitle = "" Then
- proc.Kill()
- End If
- Next
- Catch ex As Exception
- Throw ex
- End Try
- End Sub