Office関連

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ページ

Microsoft Edgeの拡張機能を使って短縮URLを取得してみる(2)前のページ

【まほうのルミティア】ルミティアジュエルを買ってきたよ。次のページ

関連記事

  1. Office関連

    住所から郵便番号を取得するVBAマクロ

    「住所から郵便番号 VBA」といったキーワード検索でのアクセスがあった…

  2. Office関連

    64ビット環境かどうかを判別するVBAマクロ

    2年以上前にMicrosoft Community(当時はMicros…

  3. Excel

    起動中のMicrosoft EdgeからタイトルとURLを取得するVBAマクロ(UI Automat…

    当ブログでは、Microsoft Edgeを外部から操作するプログラム…

  4. Office関連

    各スライドに配置されたオートシェイプからテキストを取得するPowerPointマクロ

    各スライドに配置されたオートシェイプからテキストを抜き出す処理を考えて…

  5. Office関連

    Outlook REST APIに会議室情報を取得するAPIが追加されました。

    松崎さんのツイートで、Outlook REST APIのベータエンドポ…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP