分享

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

 franklinfj 2013-06-26

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

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

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

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

不符合需求。

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

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

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

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

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

运行效果图:

DataGridView中复制数据到Excel

源代码:

  1. Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click  
  2.     Try  
  3.         Dim filepath As String = Application.StartupPath & "/" & Now.ToFileTimeUtc & ".xls"  
  4.         Dim objexcel As New Excel.Application()  
  5.         Dim objbook As Excel.Workbook = objexcel.Workbooks.Add()  
  6.         objbook.SaveAs(filepath)  
  7.   
  8.         '设置复制模式为:连同行头和表头一起复制   
  9.         Me.DataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText  
  10.         '如果不需要复制行头,就把它隐藏掉   
  11.         Me.DataGridView1.RowHeadersVisible = False  
  12.         '选中DataGridView1的所有内容   
  13.         Me.DataGridView1.SelectAll()  
  14.         '判断DataGridView1中是否有选中单元格(与上面好像有点矛盾,自行处理)   
  15.         If Me.DataGridView1.GetCellCount(DataGridViewElementStates.Selected) > 0 Then  
  16.             Clipboard.SetDataObject(Me.DataGridView1.GetClipboardContent())  
  17.         End If  
  18.          '直接在Excel中粘贴   
  19.         'objexcel.ActiveSheet.paste()   
  20.         '為防止亂碼。使用選擇性粘貼   
  21.         '下面這一行,相當于在Excel中點擊右鍵->選擇性粘貼->文本   
  22.         objexcel.ActiveSheet.PasteSpecial(Format:="文本", Link:=False, DisplayAsIcon:=False)  
  23.         '选中Excel所有单元格   
  24.         objexcel.Cells.Select()  
  25.         '不自动换行   
  26.         objexcel.Selection.WrapText = False  
  27.         '自动调整列宽   
  28.         objexcel.Columns.AutoFit()  
  29.         '储存   
  30.         objbook.Save()  
  31.         '退出   
  32.         objbook.Close()  
  33.         objexcel.Quit()  
  34.         objbook = Nothing  
  35.         objexcel = Nothing  
  36.         killexcel()  
  37.         '提示打开文件   
  38.         If MessageBox.Show("档案储存在:" & filepath & ",你要打开吗?""提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) = Windows.Forms.DialogResult.Yes Then  
  39.             Process.Start(filepath)  
  40.         End If  
  41.     Catch ex As Exception  
  42.         killexcel()  
  43.         MsgBox(ex.Message)  
  44.     End Try  
  45. End Sub  
  46.   
  47. '杀掉程序创建的Excel进程   
  48. Private Sub killexcel()  
  49.     Try  
  50.         For Each proc As Process In Process.GetProcessesByName("EXCEL")  
  51.             If proc IsNot Nothing AndAlso proc.MainWindowTitle = "" Then  
  52.                 proc.Kill()  
  53.             End If  
  54.         Next  
  55.     Catch ex As Exception  
  56.         Throw ex  
  57.     End Try  
  58. End Sub  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多