ネットで”VB.Net Excel 読み書き"など検索すると、Excel Comオブジェクト(Microsoft.Office.Interop)を使った例が多く出てきます。しかし、あまりおすすめされていません

Excel Comオブジェクトは、バックグラウンドでExcelのプロセス(EXE)が実行されており、解放がしっかり行われていないとプロセスが残ったままになったりします。また、すでに起動しているExcelとの干渉を考慮しないといけません。

EXCELファイルの操作系ライブラリ(DLL)を使用することにより、自身のアプリケーションにライブラリをリンクできるため余計なプロセスを管理しなくても済みます。
Excel2007/2010形式からは、ファイルの中身がOffice Open XMLとなり、仕様が一般公開されているためライブラリは色々あります。(中身はXMLファイルで構成され、ファイル全体はZIP圧縮されている)

ライブラリの種類

.Net対応のEXCELファイル操作系ライブラリの有名どころは、NPOIEPPlusClosedXMLなどがあります。 機能が豊富で人気が高いEPPlusを今回を紹介します。

EPPlusは、過去のファイル形式である.xlsは読み書きできませんが、.xlsx形式は対応しています。
今後.xlsファイル形式を作成することも少ないですし、.xlsxが主流のシステムはすでに多いはずです。
また、ライセンスはLGPL ライセンスですし、フリー(無償)で使えるメリットは大きいです。

インストール方法

★このライブラリを使うにあたってMicrosoft OfficeのExcelはインストール不要である。

以下、2つインストール方法があるがお好みでどうぞ!

・Visua lStudioのNuGetで検索"EPPlus"を検索してインストール。
 →対外は安定板をダウンロードすることになると思います。

・サイトからDLLをダウンロード
http://epplus.codeplex.com/
 →右のダウンロードボタンより


Visual Studioのソリューションエクスプローラの[参照]の参照タブよりダウンロードしたEPPlus.dllを追加する。
対象アプリのプラットフォームが.Net3.5なら.Net3.5版。.Net4シリーズは.Net4版のDLLを使用する。

これを書いた時のEpPlusバージョンは、4.1.0でした。

XLSXファイル作成と値書込み

VB.NET

'// Imports OfficeOpenXml'
   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      Dim fi As IO.FileInfo = New IO.FileInfo("test.xlsx")
      If fi.Exists = True Then fi.Delete()
      Using pkg As New ExcelPackage(fi)
         Dim sheet1 As ExcelWorksheet = pkg.Workbook.Worksheets.Add("Sheet1")
         '// セルを指定して代入(ExcelVBA同様1から始まる)'
         sheet1.Cells(1, 1).Value = "write time" 
         sheet1.Cells(2, 1).Value = Now.ToString("yyyy/MM/dd")
         sheet1.Cells(3, 1).Value = Now.ToString("HH:mm:ss")
         Call pkg.Save()  '// 保存。名前を変えて保存はSaveAs()'
         sheet1.Dispose()
      End Using
      MessageBox.Show("出力OK!!")
   End Sub 

C#

        // using OfficeOpenXml
        private void button1_Click(object sender, EventArgs e)
        {
            System.IO.FileInfo fi = new System.IO.FileInfo("test.xlsx");
            if (fi.Exists == true) { fi.Delete(); }
            using (ExcelPackage pkg = new ExcelPackage(fi))
            {
                ExcelWorksheet sheet1 = pkg.Workbook.Worksheets.Add("Sheet1");
                // セルを指定して代入(ExcelVBA同様1から始まる)
                sheet1.Cells[1, 1].Value = "write time";
                sheet1.Cells[2, 1].Value = DateTime.Now.ToString("yyyy/MM/dd");
                sheet1.Cells[3, 1].Value = DateTime.Now.ToString("HH:mm:ss");
                pkg.Save();  // 保存。名前を変えて保存はSaveAs()
                sheet1.Dispose();
            }
            MessageBox.Show("出力OK!!");
        }

エクセルのVBAライクな書き方が可能ですね!
ExcelPackageはExcel全体の操作に使い、ExcelWorksheetで各セルへの操作が出来ます。

XLSXファイルの読み込み

VB.NET

'// Imports OfficeOpenXml'
   Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
      Dim fi As IO.FileInfo = New IO.FileInfo("test.xlsx")
      If fi.Exists = False Then
         MessageBox.Show("ファイルなし")
         Return
      End If
      Dim strVal = String.Empty
      Using pkg As New ExcelPackage(fi)
         Dim sheet1 As ExcelWorksheet = pkg.Workbook.Worksheets("Sheet1")
         '// Valueでもよいが表示されている値をとりたければText'
         strVal = sheet1.Cells(2, 1).Text & Space(1) & sheet1.Cells(3, 1).Text 
         sheet1.Dispose()
      End Using
      MessageBox.Show(strVal)
   End Sub

C#

        private void button2_Click(object sender, EventArgs e)
        {
            System.IO.FileInfo fi = new System.IO.FileInfo("test.xlsx");
            if (fi.Exists == false) { MessageBox.Show("ファイルなし"); return; }
            var strVal = String.Empty;
            using (ExcelPackage pkg = new ExcelPackage(fi)) {
                ExcelWorksheet sheet1 = pkg.Workbook.Worksheets["Sheet1"];
                // Valueでもよいが表示されている値をとりたければText
                strVal = sheet1.Cells[2, 1].Text + " " + sheet1.Cells[3, 1].Text;
                sheet1.Dispose();
            }
            MessageBox.Show(strVal);
        }

読み取りも書き込み同様にアクセスできます。

計算式やスタイル関連

171207_epplus_smple
▲画像のような書式設定をソースコードで書くと↓こんな感じです

VB.NET

'// Imports OfficeOpenXml'
   Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
      Dim fi As IO.FileInfo = New IO.FileInfo("test2.xlsx")
      If fi.Exists = True Then fi.Delete()
      Using pkg As New ExcelPackage(fi)
         Dim sheet1 As ExcelWorksheet = pkg.Workbook.Worksheets.Add("Sheet1")

         sheet1.Cells(1, 1).Value = "成績"
         sheet1.Cells(2, 1).Value = "科目"
         sheet1.Cells(2, 2).Value = "点数"
         sheet1.Cells("A3").Value = "国語"   '// Range形式で入れられる'
         sheet1.Cells("B3").Value = 64
         sheet1.Cells("A4").Value = "算数"
         sheet1.Cells("B4").Value = 72
         sheet1.Cells("A5").Value = "理科"
         sheet1.Cells("B5").Value = 84
         sheet1.Cells("A6").Value = "社会"
         sheet1.Cells("B6").Value = 45
         sheet1.Cells(7, 1).Value = "計"
         sheet1.Cells(7, 2).Formula = "=SUM(B3:B6)/4" '// 計算式代入の場合'

         '// 全セルフォント'
         sheet1.Cells().Style.Font.SetFromFont(New Font("MS ゴシック", 11, FontStyle.Regular))
         '// 線を引く'
         Dim allcell = sheet1.Cells(1, 1, 7, 2) '// 全体を選択'
         allcell.Style.Border.Top.Style = Style.ExcelBorderStyle.Thin
         allcell.Style.Border.Bottom.Style = Style.ExcelBorderStyle.Thin
         allcell.Style.Border.Left.Style = Style.ExcelBorderStyle.Thin
         allcell.Style.Border.Right.Style = Style.ExcelBorderStyle.Thin
         '// 位置'
         allcell.Style.HorizontalAlignment = Style.ExcelHorizontalAlignment.Center
         '// 背景色'
         sheet1.Cells(1, 1, 2, 2).Style.Fill.PatternType = Style.ExcelFillStyle.Solid
         sheet1.Cells(1, 1, 2, 2).Style.Fill.BackgroundColor.SetColor(Color.LightBlue)
         sheet1.Cells(7, 1, 7, 2).Style.Fill.PatternType = Style.ExcelFillStyle.Solid
         sheet1.Cells(7, 1, 7, 2).Style.Fill.BackgroundColor.SetColor(Color.LightPink)
         '// セル結合'
         sheet1.Cells("A1:B1").Merge = True

         Call pkg.Save()
         sheet1.Dispose()
      End Using
      MessageBox.Show("出力OK!!")
   End Sub

C#

// Imports OfficeOpenXml
private void button3_Click(object sender, EventArgs e)
{
    System.IO.FileInfo fi = new System.IO.FileInfo("test2.xlsx");
    if (fi.Exists == true) { fi.Delete(); }
    using (var pkg = new ExcelPackage(fi)) {
        ExcelWorksheet sheet1 = pkg.Workbook.Worksheets.Add("Sheet1");

        sheet1.Cells[1, 1].Value = "成績";
        sheet1.Cells[2, 1].Value = "科目";
        sheet1.Cells[2, 2].Value = "点数";
        sheet1.Cells["A3"].Value = "国語";   // Range形式で入れられる
        sheet1.Cells["B3"].Value = 64;
        sheet1.Cells["A4"].Value = "算数";
        sheet1.Cells["B4"].Value = 72;
        sheet1.Cells["A5"].Value = "理科";
        sheet1.Cells["B5"].Value = 84;
        sheet1.Cells["A6"].Value = "社会";
        sheet1.Cells["B6"].Value = 45;
        sheet1.Cells[7, 1].Value = "計";
        sheet1.Cells[7, 2].Formula = "=SUM(B3:B6)/4";// 計算式代入の場合

        // 全セルフォント
        sheet1.Cells.Style.Font.SetFromFont(new Font("MS ゴシック", 11, FontStyle.Regular));
        // 線を引く
        ExcelRange allcell = sheet1.Cells[1, 1, 7, 2]; // 全体を選択'
        allcell.Style.Border.Top.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
        allcell.Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
        allcell.Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
        allcell.Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
        // 位置
        allcell.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
        // 背景色
        sheet1.Cells[1, 1, 2, 2].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
        sheet1.Cells[1, 1, 2, 2].Style.Fill.BackgroundColor.SetColor(Color.LightBlue);
        sheet1.Cells[7, 1, 7, 2].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
        sheet1.Cells[7, 1, 7, 2].Style.Fill.BackgroundColor.SetColor(Color.LightPink);
        // セル結合
        sheet1.Cells["A1:B1"].Merge = true;

        pkg.Save();
        sheet1.Dispose();
}
    MessageBox.Show("出力OK!!");
}

感想

Excel COMオブジェクトより簡単に実装できる感じでした。
PDFの出力などは出来ませんが、読み書きくらいならライブラリで十分だと思います。

サーバーサイドアプリやWEBサービスでばしばし使っていきたいですねっ♪

スポンサードリンク