ssCAROのブログ

色んなとこで見つけたプログラムのメモ置き場っぽい

Excelの操作用ライブラリ(NPOI)の使い方

Excelの操作にCOMを使っていたけど、プロセスが解放されたりされなかったりとどうにもこうにもなので、Excelの操作用ライブラリ「NPOI」を使ってみることにした。

参考URL
【C#】NPOIを使ってExcelファイルを作成・編集する

Visual Studio 2013を使いました。

  1. メニューの[Tool]→[NuGetパッケージマネージャー]→[ソリューションのNuGetパッケージの管理]と押す。
  2. 右上にあるオンラインの検索から「NPOI」と入力し検索をする。
  3. 見つかれば「インストール」ボタンを押してインストールをする。
Imports NPOI.SS.UserModel

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    'Excelを開く
    Dim book As IWorkbook = WorkbookFactory.Create("C:\Test.xls")
    '最初のシートを選択
    Dim sheet As ISheet = book.GetSheetAt(0)
    'セルに値の書き込み
    WriteCell(sheet, 2, 1, 12345)
    WriteCell(sheet, 2, 2, "あいうえお")
    WriteCell(sheet, 2, 3, DateTime.Now)
    'セルの値を読み込み
    Dim value As String = ""
    GetCell(sheet, 2, 1, value)
    GetCell(sheet, 2, 2, value)
    GetCell(sheet, 2, 3, value)
    'Excelの保存
    SavedBook(book, path)
    'Excelを閉じる
    book.Close()

End Sub

Private Sub SavedBook(ByRef book As IWorkbook, ByVal filePath As String)

    Using fs As New System.IO.FileStream(filePath, IO.FileMode.Create)
        book.Write(fs)
    End Using

End Sub

Private Sub GetCell(ByRef sheet As ISheet, ByVal columnIndex As Integer, ByVal rowIndex As Integer, ByRef value As String)

    Dim row As IRow = If(sheet.GetRow(rowIndex - 1), sheet.CreateRow(rowIndex - 1))
    Dim cell As ICell = If(row.GetCell(columnIndex - 1), row.CreateCell(columnIndex - 1))
    'Cellのタイプを判断して対応するメソッドを呼ばないと値が取れないので
    'とりあえず全部文字列で取得する。
    'ただし、日付はExcelで見た時と取得した値が違っている
    'ユーザー定義の書式を見て、自分で変換する?
    'cell.DateCellValue の値を取得して自分で変換した方が良いかも
    'Excelに指定されているユーザー定義は cell.CellStyle.GetDataFormatString() で取得できる
    Dim formatter As DataFormatter = New DataFormatter()
    value = formatter.FormatCellValue(cell)

End Sub

Private Sub WriteCell(ByRef sheet As ISheet, ByVal columnIndex As Integer, ByVal rowIndex As Integer, ByVal value As String)

    '空白のセルとかだとrow、cellがnullになるので、その対応
    Dim row As IRow = If(sheet.GetRow(rowIndex - 1), sheet.CreateRow(rowIndex - 1))
    Dim cell As ICell = If(row.GetCell(columnIndex - 1), row.CreateCell(columnIndex - 1))

    cell.SetCellValue(value)

End Sub

Private Sub WriteCell(ByRef sheet As ISheet, ByVal columnIndex As Integer, ByVal rowIndex As Integer, ByVal value As Double)

    Dim row As IRow = If(sheet.GetRow(rowIndex - 1), sheet.CreateRow(rowIndex - 1))
    Dim cell As ICell = If(row.GetCell(columnIndex - 1), row.CreateCell(columnIndex - 1))

    cell.SetCellValue(value)

End Sub

Private Sub WriteCell(ByRef sheet As ISheet, ByVal columnIndex As Integer, ByVal rowIndex As Integer, ByVal value As DateTime)

    Dim row As IRow = If(sheet.GetRow(rowIndex - 1), sheet.CreateRow(rowIndex - 1))
    Dim cell As ICell = If(row.GetCell(columnIndex - 1), row.CreateCell(columnIndex - 1))

    cell.SetCellValue(value)

End Sub