ここでは、C#からExcelを利用する例を記載しています。
C#からExcelを利用するサンプル例はたくさんネット上に存在しますが、 記述方法が幾通りにもわかれています。
その中で2016年現在、最も利用価値が高いのは、Excelのバージョンなどに依存しない 下記のようなType.GetTypeFromProgIDとdynamicとを使った形です。 この形をベースにネットを検索してみましょう。
using System; using System.Collections.Generic; using System.Runtime.InteropServices; public class MyExcel { string fileName = @"C:\work\samplebook.xls"; dynamic excelApp = null; dynamic workBooks = null; dynamic workBook = null; dynamic workSheets = null; dynamic workSheet = null; dynamic range = null; public MyExcel() { try { Type excelApplication = Type.GetTypeFromProgID("Excel.Application"); excelApp = Activator.CreateInstance(excelApplication); excelApp.DisplayAlerts = false; workBooks = excelApp.WorkBooks; workBook = workBooks.Open(fileName); workSheets = workBook.Sheets; workSheet = workSheets[1]; range = workSheet.Cells; range[1, 1] = "Hello Excel!!"; workBook.Save(); workBook.Close(); } finally { releaseObject(range); releaseObject(workSheet); releaseObject(workSheets); // releaseObject(workBook); // 本来いけるハズだがエラーが出る releaseObject(workBooks); releaseObject(excelApp); } } private void releaseObject(object obj) { try { System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj); obj = null; } catch (Exception e) { obj = null; Console.WriteLine("オブジェクトを解放できない" + e.ToString()); } finally { GC.Collect(); } } }
Excelは他のプログラムとの連携において、IOが非常に遅いアプリケーションであるため、 書き込み、読み込みは可能な限り広範囲で一括で行うことが求められます。
using System; using System.Collections.Generic; using System.Runtime.InteropServices; public class MyExcel { string fileName = @"C:\work\samplebook.xls"; dynamic excelApp = null; dynamic workBooks = null; dynamic workBook = null; dynamic workSheets = null; dynamic workSheet = null; dynamic range = null; public MyExcel() { try { Type excelApplication = Type.GetTypeFromProgID("Excel.Application"); excelApp = Activator.CreateInstance(excelApplication); excelApp.DisplayAlerts = false; workBooks = excelApp.WorkBooks; workBook = workBooks.Open(fileName); workSheets = workBook.Sheets; workSheet = workSheets[1]; // 一括でデータを仕込み object[,] data = new object[10, 20]; for (int i = 0; i < 10; i++) { for (int n = 0; n < 20; n++) { data[i, n] = "(" + i.ToString() + "," + n.ToString() + ")"; } } // 範囲を取得 // 左上 dynamic cellTopLeft = workSheet.Cells[1, 1]; // 右下 dynamic cellBottomRight = workSheet.Cells[10, 20]; // 範囲 dynamic range = workSheet.Range[cellTopLeft, cellBottomRight]; // 一括で反映 range.Value = data; workBook.Save(); workBook.Close(); } finally { releaseObject(range); releaseObject(workSheet); releaseObject(workSheets); // releaseObject(workBook); // 本来いけるハズだがエラーが出る releaseObject(workBooks); releaseObject(excelApp); } } private void releaseObject(object obj) { try { System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj); obj = null; } catch (Exception e) { obj = null; Console.WriteLine("オブジェクトを解放できない" + e.ToString()); } finally { GC.Collect(); } } }