Excelの操作用ライブラリ(NPOI)の使い方
Excelの操作にCOMを使っていたけど、プロセスが解放されたりされなかったりとどうにもこうにもなので、Excelの操作用ライブラリ「NPOI」を使ってみることにした。
参考URL
【C#】NPOIを使ってExcelファイルを作成・編集する
Visual Studio 2013を使いました。
- メニューの[Tool]→[NuGetパッケージマネージャー]→[ソリューションのNuGetパッケージの管理]と押す。
- 右上にあるオンラインの検索から「NPOI」と入力し検索をする。
- 見つかれば「インストール」ボタンを押してインストールをする。
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