サーバーサイドでEXCELを読み込む(NPOI、EPPlus)

サーバーサイドでEXCELを開いて中身を読み込みたい。


今まではデータ接続コンポーネントを使って開いてたんだけど、ダウンロードページをよく読むと、

2007 Office system ドライバは、以下の目的には使用できません。

サーバー側アプリケーション内での Jet OLEDB プロバイダとしての使用。
Web アプリケーションのようなサーバー側シナリオで、Office ファイルの読み書きをする場合は、Open XML を使用する必要があります。


Office system ドライバは、以下を含む特定のシナリオ下でのみ、使用がサポートされています。

Microsoft Office Access、Microsoft Office Excel、およびテキスト ファイルを含む各種ファイル形式の読み書きを行うデスクトップ アプリケーション。


おっと。。。実装方法変更。
最初に思いついたのはNPOIだったんだけど、2007形式以降を対応していないことが判明。


で、他の案をググってたら、EPPlusなるものを知る。
ココのサイトが比較表もあり、分かりやすいです。
NPOIはOpenXML対応はver.1.3からか。


EPPlusで、EXCELの中身を表示するコード書いてみたらいけそう。
ライセンスはLGPLです。


以下、サンプルコード。C#ではなく、VB.NETです。


NPOIの場合。

Imports System.IO
Imports NPOI.HSSF.UserModel

Module Module1

    Sub Main()

        Dim filePath As String = "C:\Book1.xls"

        Using fs As New FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)
            Dim book As HSSFWorkbook
            Dim sheet As HSSFSheet
            Dim row As HSSFRow
            Dim cell As HSSFCell

            book = New HSSFWorkbook(fs)
            sheet = DirectCast(book.GetSheetAt(0), HSSFSheet)

            Diagnostics.Debug.WriteLine("----- Start XLS-----")
            For i = 0 To sheet.LastRowNum
                Diagnostics.Debug.WriteLine("--- " & i + 1 & "行目")
                row = DirectCast(sheet.GetRow(i), HSSFRow)
                For Each cell In row.Cells
                    Diagnostics.Debug.WriteLine(cell.ToString)
                Next
            Next
            Diagnostics.Debug.WriteLine("----- End -----")
        End Using
    End Sub

End Module


EPPlusの場合。

Imports OfficeOpenXml
Imports System.IO

Module Module1

    Sub Main()
        Dim filePathAs String = "C:\Book1.xlsx"

        Dim existingFile = New FileInfo(filePath)
        Using package As New ExcelPackage(existingFile)
            Dim worksheet As ExcelWorksheet = package.Workbook.Worksheets(1)

            Diagnostics.Debug.WriteLine("----- Start XLSX-----")
            For i = 1 To worksheet.Dimension.End.Row
                Diagnostics.Debug.WriteLine("--- " & i & "行目")
                For j = 1 To worksheet.Dimension.End.Column
                    Diagnostics.Debug.WriteLine(worksheet.Cells(i, j).Value)
                Next
            Next
            Diagnostics.Debug.WriteLine("----- End -----")
        End Using
    End Sub

End Module


注意点としては
NPOIは*.xlsはOKだけど、*.xlsxは読み込めない。
EPPlusは*.xlsxはOKだけど、*.xlsは読み込めない。


出来れば一つのライブラリで解決したいのだが。。