机房重构之导出Excel表

来源:互联网 发布:多个list转json 编辑:程序博客网 时间:2024/06/05 22:51

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

方法一、添加Interop引用

功能:把datagrid导出为excelimports microsoft.office.interopModule 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

遇到的问题

我其实挺喜欢这个方法的,添加一个引用,代码也相对简单,但是老报错。错误是这样的:
这里写图片描述
在网上找了好多解法,尝试过更改引用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 SubEnd Module

小结

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

0 0