TOP

2015年5月7日 星期四

NPOI 讀取Excel、匯出Excel

下載DLL 並加入參考 >>下載<<

Imports NPOI.HPSF
Imports NPOI.HSSF
Imports NPOI.HSSF.UserModel
Imports NPOI.POIFS
Imports NPOI.Util
NPOI 讀取Excel
 Public Shared Function LoadExcel(Optional ByVal FilePath As String = "", _
               Optional ByVal SheetName As String = "", _
               Optional ByVal SheetIndex As Integer = 0)
        Dim OpenXls As New OpenFileDialog
        Dim table As New DataTable
        OpenXls.Filter = "XLS File|*.xls"

        If String.IsNullOrWhiteSpace(FilePath) = True Then
            If OpenXls.ShowDialog = DialogResult.OK Then
                FilePath = OpenXls.FileName
            End If
        End If
        If File.Exists(FilePath) = False Then
            Return table
        End If

        Dim tmpXs As String = Application.StartupPath & "\tmp.xls"
        If File.Exists(tmpXs) = True Then
            File.Delete(tmpXs)
        End If

        File.Copy(FilePath, tmpXs)
        FilePath = tmpXs


        Try
            Dim Fs As FileStream = File.OpenRead(FilePath)
            Dim workbook As HSSFWorkbook = New HSSFWorkbook(Fs)
            Try
                Dim sheet As HSSFSheet
                If SheetName <> "" Then
                    sheet = workbook.GetSheet(SheetName)
                Else
                    sheet = workbook.GetSheetAt(SheetIndex)
                End If

                Dim headerRow As HSSFRow = sheet.GetRow(0)
                Dim cellCount As Int32 = headerRow.LastCellNum

                For i As Int32 = headerRow.FirstCellNum To cellCount - 1
                    Dim column As DataColumn = New DataColumn(headerRow.GetCell(i).StringCellValue)
                    table.Columns.Add(column)
                Next

                Dim rowCount As Int32 = sheet.LastRowNum

                For i As Int32 = (sheet.FirstRowNum + 1) To sheet.LastRowNum

                    Dim row As HSSFRow = sheet.GetRow(i)
                    Dim dataRow As DataRow = table.NewRow()
                    Dim NullCount As Integer = 0
                    For j As Int32 = row.FirstCellNum To cellCount - 1

                        If Not (row.GetCell(j) Is Nothing) Then
                            dataRow(j) = row.GetCell(j).ToString()
                        End If
                        If IsDBNull(dataRow(j)) = True Then
                            NullCount += 1
                        ElseIf String.IsNullOrWhiteSpace(dataRow(j)) = True Then
                            NullCount += 1
                        End If
                    Next
                    If NullCount <> table.Columns.Count Then
                        table.Rows.Add(dataRow)
                    End If
                Next
                sheet = Nothing

            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                Fs.Dispose()
                Fs.Close()
            End Try
            workbook = Nothing
            Return table
        Catch ex As Exception
            MessageBox.Show(ex.Message)
            Return table
        End Try

    End Function


NPOI 寫入EXCEL檔

Public Shared Function SaveExcel(ByVal obj As Object, Optional ByVal FilePath As String = "") As Boolean
        Try
            Dim SaveXls As New SaveFileDialog
            Dim i As Integer = 1
            SaveXls.Filter = "Excel檔(*xls)|*.xls"

            If FilePath <> "" Then

            ElseIf SaveXls.ShowDialog = DialogResult.OK Then
                FilePath = SaveXls.FileName
            Else
                Return False
            End If

            Dim Ds As New DataSet
            Select Case obj.GetType
                Case GetType(DataSet)
                    Ds = obj.copy
                Case GetType(DataTable)
                    Ds.Tables.Add(obj.copy)
                Case Else
                    Dim Json As String = JsonConvert.SerializeObject(obj)
                    Dim dt As DataTable = JsonConvert.DeserializeObject(Of DataTable)(Json)
                    Ds.Tables.Add(dt)
            End Select

            Dim workbook As HSSFWorkbook = New HSSFWorkbook()
            Dim ms As MemoryStream = New MemoryStream()
            For Each dt As DataTable In Ds.Tables
                If dt.TableName = "" Then
                    dt.TableName = "sheet" & i
                    i = i + 1
                End If

                Dim sheet As HSSFSheet = workbook.CreateSheet(dt.TableName)


                Dim headerRow As HSSFRow = sheet.CreateRow(0)


                ' 欄位資料
                Dim column As DataColumn
                For Each column In dt.Columns
                    headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName)
                Next column

                ' 資料內容
                Dim rowIndex As Int32 = 1
                Dim row As DataRow
                For Each row In dt.Rows
                    Dim DataRow As HSSFRow = sheet.CreateRow(rowIndex)

                    For Each column In dt.Columns
                        If IsDBNull(row(column)) = False Then
                            DataRow.CreateCell(column.Ordinal).SetCellValue(row(column))

                        End If
                    Next column
                    rowIndex = rowIndex + 1
                Next row
                sheet.CreateFreezePane(0, 1, 0, 1)    '凍結視窗
                sheet = Nothing
                headerRow = Nothing
            Next


            workbook.Write(ms)
            ms.Flush()
            ms.Position = 0
            workbook = Nothing
            Dim fs As FileStream = New FileStream(FilePath, FileMode.Create, FileAccess.Write)
            Dim data As Byte() = ms.ToArray()
            fs.Write(data, 0, data.Length)
            fs.Flush()
            fs.Close()
            data = Nothing
            ms = Nothing
            fs = Nothing
            Ds.Dispose()
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function