最終更新日 2024-09-25

Excelの活用

概要

ここでは、C#からExcelを利用する例を記載しています。

C#からExcelを利用するサンプル例はたくさんネット上に存在しますが、
記述方法が幾通りにもわかれています。

その中で2016年現在、最も利用価値が高いのは、Excelのバージョンなどに依存しない
下記のようなType.GetTypeFromProgIDdynamicとを使った形です。
この形をベースにネットを検索してみましょう。

Type.GetTypeFromProgIDとdynamic

Type.GetTypeFromProgIDとdyamicを使い、Excelに書き込み
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();
        }
    }
}


範囲(range)で一括で書き込む

Excelは他のプログラムとの連携において、IOが非常に遅いアプリケーションであるため、
書き込み、読み込みは可能な限り広範囲で一括で行うことが求められます。