.net从DataGridView复制到Excel.代码实现。解决乱码问题

在Winform 的开发中,经常要做Excel的报表,有些报表很复杂,也有简单的。

复杂的就不讲了,简单的比如说:要次一个DataGridView中的数据原板原样的放到Excel中。

通常从DataGridView中取数据都是逐行读取。如果这样做,遇到数据量比较大的时候,速度会变得很慢。

不符合需求。

在.net中DataGridView已经封装好复制的功能。可以直接调用。

贴一段核心代码:使用pubs数据库中的jobs资料表

在使用粘贴板的时候有可能乱码(因为DataGridView和Excel的格式是不一样的。)

解决方法 在粘贴的时候使用Excel中的选择性粘贴功能。 

            '下面這一行,相當于在Excel中點擊右鍵->選擇性粘貼->文本
            objexcel.ActiveSheet.PasteSpecial(Format:="文本", Link:=False, DisplayAsIcon:=False)

运行效果图:

.net从DataGridView复制到Excel.代码实现。解决乱码问题_第1张图片

源代码:

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 '选中DataGridView1的所有内容 Me.DataGridView1.SelectAll() '判断DataGridView1中是否有选中单元格(与上面好像有点矛盾,自行处理) If Me.DataGridView1.GetCellCount(DataGridViewElementStates.Selected) > 0 Then Clipboard.SetDataObject(Me.DataGridView1.GetClipboardContent()) End If '直接在Excel中粘贴 'objexcel.ActiveSheet.paste() '為防止亂碼。使用選擇性粘貼 '下面這一行,相當于在Excel中點擊右鍵->選擇性粘貼->文本 objexcel.ActiveSheet.PasteSpecial(Format:="文本", Link:=False, DisplayAsIcon:=False) '选中Excel所有单元格 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 '杀掉程序创建的Excel进程 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

你可能感兴趣的:(Winform,.net,excel,exception,winform,button,报表)