今回の記事の発端は下記のQiita投稿。
・Excelファイルを C# と VB.NET で読み込む “正しい” 方法 – Qiita
http://qiita.com/midori44/items/acab9106e6dad9653e73
.NETからExcelファイルを扱う → Interop → プロセスが残り続ける、これを経験した人は結構多いのではないかと思います。
このInterop問題に対して、上記投稿ではClosedXMLやNPOIといったライブラリの利用を薦めています。
たしかにExcelを利用しないライブラリであれば、Excelのインストールは不要だし、処理速度も早そうです。
というわけで、今回はClosedXMLとEPPlusを使って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の方が色々処理できそうな感じです。
おわりに
今回ClosedXMLとEPPlusの2つのライブラリを試してみましたが、どちらもお手軽で簡単にExcelファイルを操作するコードが書けました。
Excelのインストールの有無やCOMオブジェクトの解放を気にしなくて良いので、非常に便利です。
WordやPowerPoint用の似たようなライブラリも無いものかと検索してみたのですが、こちらは有償のものしかヒットしませんでした。
今のところ、WordやPowerPointファイルを操作するのは「NetOffice」がお手軽なのかな?と思います。
関連Webページ
- OpenXML を簡単にする ClosedXML
- http://www.infoq.com/jp/news/2011/07/ClosedXML
- NPOIもEPPLUSもClosedXMLもなんかいまいち。
- http://nnspaces.sblo.jp/article/88907504.html
- COM クライアント実装の道程 for TaskScheduler その番外編2 ~ COM オブジェクトと GC とファイナライザ
- http://hongliang.seesaa.net/article/14551716.html
この記事へのコメントはありません。