記得提前先使用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