机房重构之导出Excel表

在导出excel表的时候,先后尝试了两种方法。第一种方法是添加Microsoft.Office.Interop的引用。第二种方法是用了第三方控件NPOI。下面就介绍一下我的excel之旅。

方法一、添加Interop引用

功能:把datagrid导出为excel
imports microsoft.office.interop

Module exportexcel
    Public Function exportexcel(ByVal dtgrd As datagridview) As Boolean    '把datagrid导出为excel
        判断datagrid是否为空()
        Try
            If dtgrd.rows.count = 0 Then
                msgbox("没有要导出的记录!", messageboxbuttons.ok, messageboxicon.exclamation)
                Return False
                Exit Function
            End If

            '建立excel连接
            Dim excelapp As New microsoft.office.interop.excel.application()
            'excelapp.application.workbooks.add(true)
            excelapp.application.workbooks.add(True)
            excelapp.visible = True

            '定义循环变量 行列变量
            Dim introw As Integer
            Dim intcolumn As Integer
            Dim inttitle As Integer

            '添加表头
            For inttitle = 0 To dtgrd.columncount - 1
                excelapp.cells(1, inttitle + 1) = dtgrd.columns(inttitle).headertext

            Next inttitle

            '通过循环把datagrid里的数据添加到excel表中
            For introw = 0 To dtgrd.rowcount - 1
                For intcolumn = 0 To dtgrd.columncount - 1
                    'excel第一行是表头所以从第二行开始,第一行的默认序号为1 ,而datagrid为0
                    excelapp.cells(introw + 2, intcolumn + 1) = dtgrd(introw, intcolumn).value.tostring
                Next intcolumn

            Next introw

            Return True  '添加完毕,返回true

        Catch ex As exception '错误处理
            msgbox("未知错误", messageboxbuttons.ok, messageboxicon.exclamation)
        End Try




    End Function

遇到的问题

我其实挺喜欢这个方法的,添加一个引用,代码也相对简单,但是老报错。错误是这样的:
机房重构之导出Excel表_第1张图片
在网上找了好多解法,尝试过更改引用interop的这里写代码片属性,但是无果。网上大多说可能是因为之前下载过其他版本的office或wps没有卸载干净,我也找过注册表没有发现其他版本的offic,网上有人建议重装系统。感觉重装系统有点麻烦,于是就尝试另一种方法。

第二种方法

使用第三方控件NPOI.NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。

NPOI不仅支持excel还支持word,不仅支持到处excel还可以导入。

步骤:
一、下载一个NPOI.DLL
二、把这个DLL放到Ui层的bin 的debug下。
三、在代码中做好引用。

Imports NPOI.HSSF.UserModel  'hssf是microsoft excel 97—2003 格式读写库
Imports NPOI.SS.UserModel  'excel 公用接口及excel公式计算引擎
Imports System.IO    '提供允许读写文件和数据流的类
Module exportexcel
 Public Sub ExportExcel(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

小结

问题是前进的动力。用的第一个方法的时候就没想过再去尝试另一种方法,但是问题却给了我一个发现和开阔思路的机会。另外,感觉第三方控件挺好的,开发一种方法可以被许多人在不同的程序中调用,真正的实现了解耦和面向对象。

你可能感兴趣的:(机房重构之导出Excel表)