Excel

ClosedXMLやEPPlusでExcelファイルを読み書きしてみた。

今回の記事の発端は下記のQiita投稿。

・Excelファイルを C# と VB.NET で読み込む “正しい” 方法 – Qiita
http://qiita.com/midori44/items/acab9106e6dad9653e73

.NETからExcelファイルを扱う → Interop → プロセスが残り続ける、これを経験した人は結構多いのではないかと思います。

このInterop問題に対して、上記投稿ではClosedXMLNPOIといったライブラリの利用を薦めています。

たしかにExcelを利用しないライブラリであれば、Excelのインストールは不要だし、処理速度も早そうです。

というわけで、今回はClosedXMLEPPlusを使ってExcelファイルの読み書きを行ってみることにしました。

ClosedXMLによるExcelファイル操作

まずはライブラリのインストールですが、CodePlexにもファイルはありますが、NuGetからファイルを取得した方がお手軽です。
(DocumentFormat.OpenXmlも必要なので忘れずに取得)

ClosedXML.dll」と「DocumentFormat.OpenXml.dll」ファイルの準備ができたら、あとはそれらを参照してコードを書くだけです。

using System;
using ClosedXML.Excel;

namespace ClosedXMLSample
{
  class Program
  {
    public static void Main(string[] args)
    {
      using (var book = new XLWorkbook(@"C:\Test\Sample.xlsx", XLEventTracking.Disabled)) {
        var sheet = book.Worksheet(1);
        var address = sheet.RangeUsed().RangeAddress.LastAddress;
        //セル内容列挙
        for (int i = 1; i <= address.RowNumber; i++) {
          for (int j = 1; j <= address.ColumnNumber; j++) {
            Console.WriteLine("Address:{0}, Value:{1}", sheet.Cell(i, j).Address, sheet.Cell(i, j).Value);
          }
        }
        //セルに書き込んで別名保存
        sheet.Range("C1").Value = "漢字テスト";
        sheet.Cell(2, 3).Value = "abcde";
        book.SaveAs(@"C:\Test\Sample2.xlsx");
      }
      Console.WriteLine("-- 処理が終了しました --");
      Console.ReadKey(true);
    }
  }
}

「Sample.xlsx」ファイルを読み込んでセルの値を取得・書き込みをした後に別名保存するだけの簡単なコードです。

コードを見れば分かる通り、VBAのコードに雰囲気が似ているので、VBAに慣れている方はすんなりコードを書けそうです。

EPPlusによるExcelファイル操作

今度はEPPlusを使ってみます。
こちらもNuGetから取得した方が楽です(EPPlus.dll)。

using System;
using System.IO;
using OfficeOpenXml;

namespace EPPlusSample
{
  class Program
  {
    public static void Main(string[] args)
    {
      using (var excel = new ExcelPackage(new FileInfo(@"C:\Test\Sample.xlsx"))) {
        var sheet = excel.Workbook.Worksheets[1];
        var address = sheet.Dimension;
        //セル内容列挙
        for (int i = address.Start.Row; i <= address.End.Row; i++) {
          for (int j = address.Start.Column; j <= address.End.Column; j++) {
            Console.WriteLine("Address:{0}, Value:{1}", sheet.Cells[i, j].Address, sheet.Cells[i, j].Value);
          }
        }
        //セルに書き込んで別名保存
        sheet.Cells["C1"].Value = "漢字テスト";
        sheet.Cells[2, 3].Value = "bbbbb";
        excel.SaveAs(new FileInfo(@"C:\Test\Sample3.xlsx"));
      }
      Console.WriteLine("-- 処理が終了しました --");
      Console.ReadKey(true);
    }
  }
}

ClosedXMLの動作確認で書いたコードとほぼ同じ処理内容ですが、コードの書き方は若干異なります。

ClosedXMLの方がVBAっぽくて個人的には書きやすかったのですが、「EPPlusの基本的な使い方メモ (xlsx形式, Excelのインストール必要ない, COM使わない)」や「Creating Reports in Excel 2007 using EPPlus」を見ると、EPPlusの方が色々処理できそうな感じです。

おわりに

今回ClosedXMLEPPlusの2つのライブラリを試してみましたが、どちらもお手軽で簡単にExcelファイルを操作するコードが書けました。
Excelのインストールの有無やCOMオブジェクトの解放を気にしなくて良いので、非常に便利です。

WordやPowerPoint用の似たようなライブラリも無いものかと検索してみたのですが、こちらは有償のものしかヒットしませんでした。
今のところ、WordやPowerPointファイルを操作するのは「NetOffice」がお手軽なのかな?と思います。

関連Webページ

関連記事

  1. アイコン一覧

    Office 2013 アイコン一覧(F)

    ・Office 2013 アイコン一覧 NUM…

  2. Excel

    [Officeアドイン]ワークシートで選択範囲を変更したときに発生するイベント

    ワークシート上で選択範囲の変更を検知する際、VBAでは通常「Works…

  3. Office関連

    Office 2016関連資料のリンク(2)

    「Office 2016関連資料のリンク」では主にサポートサイトのリン…

  4. Office関連

    「個人用テンプレートの既定の場所」を設定するWordマクロ

    前回の記事で、Word 2013で個人用テンプレート(カスタム テンプ…

  5. Office関連

    スライドショーをループ再生設定するPowerPointマクロ

    PowerPointでスライドショーを作成するとき、投影した後流しっぱ…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP