机房重构现在遇到了Excel导出的问题,从网上找了好多解决办法。不得不说网上的大神实在是太多了。试了好几个方法,后来挑了一个对我来说错误率最小的,现在给大家总结一下。
方法一
这种方法,不需要我们添加任何服务引用,通过代码来达到“将DataGridView中的数据导出到Excel表中”的目的,简单粗暴!不过我用这种方法的时候总是报错,整的我整个人都不好了
Public Function ExportExcel(ByVal gvw As DataGridView) As Boolean '导出到Excel函数
Try
If gvw.Rows.Count <= 0 Then '判断记录数,如果没有记录就退出
MessageBox.Show("没有记录可以导出", "没有可以导出的项目", MessageBoxButtons.OK, MessageBoxIcon.Information)
Return False
Else '如果有记录就导出到Excel
Dim objCreateExcel As Object
Dim objAddExcel As Object
objCreateExcel = CreateObject("Excel.Application") '创建Excel对象
objAddExcel = objCreateExcel.workbooks.add()
Dim intTitle As Integer
Dim intRow As Integer
Dim intColumn As Integer '定义循环变量,行列变量
'把表头写入Excel
For intTitle = 0 To gvw.Columns.Count - 1
objAddExcel.worksheets(1).cells(1, intTitle + 1) = gvw.Columns(intTitle).HeaderCell.Value
Next
'用循环添加数据
For intRow = 0 To gvw.Rows.Count - 1 '行循环
For intColumn = 0 To gvw.Columns.Count - 1 '列循环
objAddExcel.worksheets(1).cells(intRow + 2, intColumn + 1) = gvw.Item(intColumn, intRow).Value.ToString
Next
Next
objAddExcel.worksheets(1).Cells.EntireColumn.AutoFit() '自动调整Excel列
objCreateExcel.visible = True '设置Excel可见作为Excel工作表名称
objAddExcel = Nothing '释放资源
objCreateExcel = Nothing '释放资源
End If
Return True
Catch ex As Exception '错误处理
MessageBox.Show(Err.Description.ToString, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error) '出错提示
Return False
End Try
End Function</span>
使用时:
Private Sub btnLead_Click(sender As Object, e As EventArgs) Handles btnLead.Click
Call ExportExcel(DataGridView1)
End Sub
方法二
首先,我们要先添加一个模块(将DataGridView中的数据导出到Excel表中这个方法,经常用到。添加到模块中,以后用的时候,直接调用模块即可。)然后添加服务引用 ,添加引用的时候如果找不到图片里的引用,还可以用代码来添加
代码添加引用
Imports Microsoft.Office.Interop
实现代码
Imports Microsoft.Office.Interop
Module ImportToExcel
Public Function ImportToExcel(ByVal gvw As DataGridView) As Boolean '导出到Excel函数
'建立Excel连接
Dim myExcel As New Microsoft.Office.Interop.Excel.Application()
myExcel.Application.Workbooks.Add(True)
myExcel.Visible = True
'定义循环变量,行列变量
Dim intRow As Integer
Dim intColumn As Integer
Dim intTitle As Integer
'添加表头
For intTitle = 0 To gvw.ColumnCount - 1
myExcel.Cells(1, intTitle + 1) = gvw.Columns(intTitle).HeaderText
Next intTitle
'通过循环来添加控件中的数据到表格中
For intRow = 0 To gvw.RowCount - 1
For intColumn = 0 To gvw.ColumnCount - 1
'由于第一行是表头,所以添加数据时从第二行开始
myExcel.Cells(intRow + 2, intColumn + 1) = gvw(intColumn, intRow).Value.ToString
Next intColumn
Next intRow
Return True '添加完毕,返回true
End Function
End Module</span>
调用时
Call ImportToExcel.ImportToExcel(DataGridView1)
方法三
用NPOI将DataGridView中需要的列导出为Excel
一.首先从网上下载NPOI.dll。
二. 在U层添加引用,添加NPOI.dll文件。或直接将文件放到U层的bin\Debug文件夹下。
三. 接下来,就是代码部分。
Imports NPOI.HSSF.UserModel 'HSSF是Microsoft Excel 97-2003 格式读写库
Imports NPOI.SS.UserModel 'Excel公用接口及Excel公式计算引擎
Imports System.IO '提供允许读写文件和数据流的类
Public Class ExportExcel
''' <summary>
''' 导出为Excel
''' </summary>
''' <param name="dgv"></param>参数为DataGridView
''' <remarks></remarks>
Public Shared Sub ExportExcel(ByVal dgv As System.Windows.Forms.DataGridView)
Dim workbook As New HSSFWorkbook '工作簿
Dim sheet As HSSFSheet '工作表
Dim excelrow As HSSFRow '行集
Dim i As Integer '列的循环变量
Dim m As Integer '行的循环变量
Dim n As Integer '列的循环变量
Dim saveDialog As Windows.Forms.SaveFileDialog '保存文件的对话框
Dim ms As MemoryStream '内存中的数据流
Dim fs As FileStream '文件流
Dim filename As String '保存时的文件名称
'如果DataGridView中没有数据,则不导出Excel
If dgv.Rows.Count = 0 Then
MsgBox("无法导出为Excel!", MsgBoxStyle.Exclamation, "温馨提示")
Return
End If
sheet = workbook.CreateSheet '在工作簿中创建表
excelrow = sheet.CreateRow(0) '在工作表中创建标题行Row(0)
'添加每列列标题
For i = 0 To dgv.Columns.Count - 1
'将可见的列的标题写到单元格中(如果某列不可见,那么会在导出的Excel中空出这列)
If dgv.Columns(i).Visible = True Then
excelrow.CreateCell(i).SetCellValue(dgv.Columns(i).HeaderText)
End If
Next
'添加其他行和列
For m = 1 To dgv.Rows.Count
excelrow = sheet.CreateRow(m) '每遍历一行,则在sheet中创建一行
For n = 0 To dgv.Columns.Count - 1 '遍历每一行中的所有列
'如果该列可见,则导出该列单元格的值
If dgv.Columns(n).Visible = True Then
excelrow.CreateCell(n).SetCellValue(dgv.Rows(m - 1).Cells(n).Value.ToString)
End If
'如果该列不可见,则将该列设置为隐藏
If dgv.Columns(n).Visible = False Then
sheet.SetColumnHidden(n, True)
End If
Next
Next
saveDialog = New Windows.Forms.SaveFileDialog '保存文件对话框
saveDialog.DefaultExt = "xls" '设置默认文件扩展名
saveDialog.Filter = "Excel文件|*.xls" '文件类型
saveDialog.ShowDialog() '弹出保存文件对话框
filename = saveDialog.FileName '将对话框中输入的文件名赋给filename
ms = New MemoryStream()
fs = New FileStream(filename, FileMode.Create)
workbook.Write(ms) '写入数据
workbook.Write(fs)
fs.Close() '关闭文件
workbook = Nothing
ms.Close()
ms.Dispose()
End Sub
End Class
调用:
Private Sub btnExportExcel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExportExcel.Click
'当DataGridView中有记录时
If dtgrdRecord.Columns.Count <> 0 Then
'设置不可见的列
dtgrdRecord.Columns(4).Visible = False
End If
ExportExcel.ExportExcel(dtgrdRecord)
End Sub
有时候,任何事情的解决并不是只有一种方法.多多的探索,能开阔我们的视野。
总有一种方法适合你
小助手:DataGridView控件使用大全