VB.NET NPOI快速导入导出Excel
记得提前先使用NeGet程序包提前导出NPOI相关dll引用
DataGridView导出Excel
1 ''' <summary> 2 ''' 获取EXCEL表格真正的值 3 ''' </summary> 4 ''' <param name="cell"></param> 5 ''' <returns>不同的类型处理后的值</returns> 6 ''' <remarks></remarks> 7 Private Function GetCellValue(cell As ICell) As String 8 If cell Is Nothing Then 9 Return String.Empty 10 End If 11 Select Case cell.CellType 12 Case CellType.Blank 13 '空数据类型 这里类型注意一下,不同版本NPOI大小写可能不一样,有的版本是Blank(首字母大写) 14 Return String.Empty 15 Case CellType.[Boolean] 16 'bool类型 17 Return cell.BooleanCellValue.ToString() 18 Case CellType.[Error] 19 Return cell.ErrorCellValue.ToString() 20 Case CellType.Numeric 21 '数字类型 22 If HSSFDateUtil.IsCellDateFormatted(cell) Then 23 '日期类型 24 Return cell.DateCellValue.ToString("yyyy/MM/dd") '格式下化下日期,否则会带上时间--可以针对修改需求 25 Else 26 '其它数字 27 Return cell.NumericCellValue.ToString() 28 End If 29 Case CellType.Unknown 30 '无法识别类型 31 '默认类型 32 Return cell.ToString() 33 ' 34 Case CellType.[String] 35 'string 类型 36 Return cell.StringCellValue 37 Case CellType.Formula 38 '带公式类型 39 Try 40 'Dim e As New HSSFFormulaEvaluator(cell.Sheet.Workbook) 41 'e.EvaluateInCell(cell) 42 Return cell.StringCellValue '带出公式会出异常,故只返回字符串--可以针对修改调试 43 Catch 44 Return cell.NumericCellValue.ToString() 45 End Try 46 End Select 47 End Function
1 ''' <summary> 2 ''' 导出为Excel 3 ''' </summary> 4 ''' <param name="dgv"></param>参数为DataGridView 5 ''' <remarks></remarks> 6 Public Sub ExportExcel(ByVal dgv As System.Windows.Forms.DataGridView) 7 Dim workbook As New HSSFWorkbook '工作簿 8 Dim sheet As HSSFSheet '工作表 9 Dim excelrow As HSSFRow '行集 10 11 Dim i As Integer '列的循环变量 12 Dim m As Integer '行的循环变量 13 Dim n As Integer '列的循环变量 14 15 Dim saveDialog As Windows.Forms.SaveFileDialog '保存文件的对话框 16 17 Dim ms As MemoryStream '内存中的数据流 18 Dim fs As FileStream '文件流 19 Dim filename As String '保存时的文件名称 20 21 22 23 '如果DataGridView中没有数据,则不导出Excel 24 If dgv.Rows.Count = 0 Then 25 MsgBox("无法导出为Excel!", MsgBoxStyle.Exclamation, "温馨提示") 26 Return 27 End If 28 29 sheet = workbook.CreateSheet '在工作簿中创建表 30 excelrow = sheet.CreateRow(0) '在工作表中创建标题行Row(0) 31 32 '添加每列列标题 33 For i = 0 To dgv.Columns.Count - 1 34 '将可见的列的标题写到单元格中(如果某列不可见,那么会在导出的Excel中空出这列) 35 If dgv.Columns(i).Visible = True Then 36 excelrow.CreateCell(i).SetCellValue(dgv.Columns(i).HeaderText) 37 End If 38 Next 39 '添加其他行和列 40 For m = 1 To dgv.Rows.Count 41 excelrow = sheet.CreateRow(m) '每遍历一行,则在sheet中创建一行 42 For n = 0 To dgv.Columns.Count - 1 '遍历每一行中的所有列 43 '如果该列可见,则导出该列单元格的值 44 If dgv.Columns(n).Visible = True Then 45 excelrow.CreateCell(n).SetCellValue(dgv.Rows(m - 1).Cells(n).Value.ToString) 46 End If 47 '如果该列不可见,则将该列设置为隐藏 48 If dgv.Columns(n).Visible = False Then 49 sheet.SetColumnHidden(n, True) 50 End If 51 Next 52 Next 53 54 55 56 saveDialog = New Windows.Forms.SaveFileDialog '保存文件对话框 57 saveDialog.DefaultExt = "xls" '设置默认文件扩展名 58 saveDialog.Filter = "Excel文件|*.xls" '文件类型 59 saveDialog.ShowDialog() '弹出保存文件对话框 60 61 filename = saveDialog.FileName '将对话框中输入的文件名赋给filename 62 If filename = "" Then '修复一个异常,如果文件名不写,直接取消导出的话,会报错 63 Return 64 End If 65 ms = New MemoryStream() 66 fs = New FileStream(filename, FileMode.Create) 67 workbook.Write(ms) '写入数据 68 workbook.Write(fs) 69 fs.Close() '关闭文件 70 workbook = Nothing 71 ms.Close() 72 ms.Dispose() 73 MsgBox("导出完成") 74 End Sub
DataGirdview导入Excel
1 ''' <summary> 2 ''' 获取excel内容 3 ''' </summary> 4 ''' <param name="filePath">excel文件路径</param> 5 ''' <returns></returns> 6 Public Function ImportExcel(filePath As String) As DataTable 7 Dim dt As New DataTable() 8 Using fsRead As FileStream = System.IO.File.OpenRead(filePath) 9 Dim wk As IWorkbook = Nothing 10 '获取后缀名 11 Dim extension As String = filePath.Substring(filePath.LastIndexOf(".")).ToString().ToLower() 12 '判断是否是excel文件 13 If extension = ".xlsx" OrElse extension = ".xls" Then 14 '判断excel的版本 15 If extension = ".xlsx" Then 16 wk = New XSSFWorkbook(fsRead) 17 Else 18 wk = New HSSFWorkbook(fsRead) 19 End If 20 21 '获取第一个sheet 22 Dim sheet As ISheet = wk.GetSheetAt(0) 23 '获取第一行 24 Dim headrow As IRow = sheet.GetRow(0) 25 '创建列 26 For i As Integer = headrow.FirstCellNum To headrow.Cells.Count - 1 27 Dim datacolum = New DataColumn(headrow.GetCell(i).StringCellValue) 28 'Dim datacolum As New DataColumn("F" + CStr(i + 1)) 29 dt.Columns.Add(datacolum) 30 Next 31 '读取每行,从第二行起 32 For r As Integer = 1 To sheet.LastRowNum 33 Dim result As Boolean = False 34 Dim dr As DataRow = dt.NewRow() 35 '获取当前行 36 Dim row As IRow = sheet.GetRow(r) 37 '读取每列 38 For j As Integer = 0 To row.Cells.Count - 1 39 Dim cell As ICell = row.GetCell(j) 40 '一个单元格 41 dr(j) = GetCellValue(cell) 42 '获取单元格的值 43 '全为空则不取 44 If dr(j).ToString() <> "" Then 45 result = True 46 End If 47 Next 48 If result = True Then 49 '把每行追加到DataTable 50 dt.Rows.Add(dr) 51 End If 52 Next 53 End If 54 End Using 55 Return dt 56 End Function
本文来自博客园,作者:云辰,转载请注明原文链接:https://www.cnblogs.com/yunchen/p/13743217.html