机房重构 导出Excel

机房重构又遇到了导出Excel这个问题。


方法一:添加Interop引用

1.在U层添加一个引用


2.在U层中添加一个模块,在其中协商导出的代码

Imports Microsoft.Office.Interop
Imports System.Windows.Forms
Module ImprotToExcel

    Public Function ImportToExcel(ByVal dgvw As DataGridView) As Boolean

        Try
            If dgvw.Rows.Count = 0 Then
                MsgBox("没有要导出的记录!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

                Return False
                Exit Function
            End If

            '建立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 dgvw.ColumnCount - 1
                myExcel.Cells(1, intTitle + 1) = dgvw.Columns(intTitle).HeaderText

            Next
            '通过循环来添加控件中的数据到表格中
            For intRow = 0 To dgvw.RowCount - 1
                For intColumn = 0 To dgvw.ColumnCount - 1
                    '第一行是表头,所以添加数据从第二行开始
                    myExcel.Cells(intRow + 2, intColumn + 1) = dgvw(intColumn, intRow).Value.ToString
                Next
            Next

            Return True

        Catch ex As Exception
            MsgBox("未知错误")
            Return False
        End Try

    End Function
End Module
3.在具体的窗体中引用这个方法

Private Sub btnExcel_Click(sender As Object, e As EventArgs) Handles btnExcel.Click
        Call ImprotToExcel.ImportToExcel(DataGridView1)
        '第一个InprotToExcel是模块名称,第二个是方法名称,参数是控件名称
    End Sub
End Class


可是运行之后就报了这个错误:


其中这个问题的原因就是之前电脑上下载过其他版本的office或WPS,没有卸载干净。


方法二:使用第三方控件NPOI.NPOI 

第三方控件NPOI.NPOI 是 POI 项目的 .NET 版本,POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。NPOI不仅支持Excel还支持Word,还可以导入导出。

1.下载NPOI.dll,将其放在UI层bin文件的Debug下

2.添加引用


3.在UI中建立一个模块

Imports NPOI.HSSF.UserModel 'hssf是microsoft excel 97-2003格式读写库
Imports NPOI.SS.UserModel  'Excel公用接口及Excel公式计算引擎
Imports System.IO  '提供允许读写文件和数据流的类
Module ImprotToExcel
    Public Sub ImprotToExcel(ByVal dtgrd As DataGridView)
        Dim workBook As New HSSFWorkbook  '工作薄
        Dim sheet As HSSFSheet  '工作表
        Dim excelRow As HSSFRow   '行集

        Dim intCol As Integer   '列的循环变量
        Dim intRow As Integer   '行的循环变量

        Dim saveDialog As Windows.Forms.SaveFileDialog   '保存文件的对话框

        Dim ms As MemoryStream   '内存中的数据流
        Dim fs As FileStream   '文件流
        Dim fileName As String    '保存时的文件名称

        '如果datagridview里没有数据,则不导出excel
        If dtgrd.Rows.Count = 0 Then
            MsgBox("没哟内容,无法导出Excel!", MsgBoxStyle.Exclamation, "温馨提示")
            Return '将执行过程调回到function,sub,get等开始的地方

        End If

        sheet = workBook.CreateSheet   '在工作簿中创建表
        excelRow = sheet.CreateRow(0)   '在工作表中穿件标题行Row(0)

        '添加每列列标题
        For intCol = 0 To dtgrd.Columns.Count - 1
            '将可见的列的标题写到单元格中(如果某列不可见,那么会在导出的Excel中空出这列)
            If dtgrd.Columns(intCol).Visible = True Then
                excelRow.CreateCell(intCol).SetCellValue(dtgrd.Columns(intCol).HeaderText)
            End If
        Next
        '添加除标题外的其他行和列
        For intRow = 1 To dtgrd.Rows.Count
            excelRow = sheet.CreateRow(intRow)
            For intCol = 0 To dtgrd.Columns.Count - 1
                '如果该列可见,则导出该列单元格的值
                If dtgrd.Columns(intCol).Visible = True Then
                    excelRow.CreateCell(intCol).SetCellValue(dtgrd.Rows(intRow - 1).Cells(intCol).Value.ToString)
                Else
                    sheet.SetColumnHidden(intCol, 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 Module


方法三:不用引用任何服务

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

解决问题的方法会有很多种,看看哪个比较适合自己。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值