<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>C#でExcelを読み込んで操作する方法を公開｜C# Excel操作テクニック.NET &#187; Excel操作クラス</title>
	<atom:link href="http://excelcsharp.lance40.com/category/class/feed" rel="self" type="application/rss+xml" />
	<link>http://excelcsharp.lance40.com</link>
	<description>メソッドに貼り付けるだけで機能するソースコードを多数用意しています。</description>
	<lastBuildDate>Sun, 08 Nov 2015 04:41:39 +0000</lastBuildDate>
	<language>ja</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.7.41</generator>
	<item>
		<title>クラスを作成する</title>
		<link>http://excelcsharp.lance40.com/class.html</link>
		<comments>http://excelcsharp.lance40.com/class.html#comments</comments>
		<pubDate>Tue, 19 Nov 2013 13:03:12 +0000</pubDate>
		<dc:creator><![CDATA[Janga]]></dc:creator>
				<category><![CDATA[Excel操作クラス]]></category>
		<category><![CDATA[クラス作成]]></category>
		<category><![CDATA[動的クラス]]></category>

		<guid isPermaLink="false">http://excelcsharp.lance40.com/?p=73</guid>
		<description><![CDATA[このページでは、メソッドを登録するためのクラスを作成します。 クラス名はExcelManagerとなってますので、お好きな名前に変えて使用してください。 &#160; &#160; このクラスは、Excelファイルの1シ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>このページでは、メソッドを登録するためのクラスを作成します。</p>
<p>クラス名はExcelManagerとなってますので、お好きな名前に変えて使用してください。</p>
<p>&nbsp;</p>
<pre class="brush: csharp; title: ; notranslate">

using Microsoft.Office.Interop.Excel;

    class ExcelManager : IDisposable
    {
        // Excel操作用オブジェクト
        private Application xlApp = null;
        private Workbooks xlBooks = null;
        private Workbook xlBook = null;
        private Sheets xlSheets = null;
        private Worksheet xlSheet = null;

        // ------------------------------------------------------
        // 　コンストラクタ／デストラクタ・プロパティ・メソッド　
        // ------------------------------------------------------

    }

</pre>
<p>&nbsp;</p>
<p>このクラスは、Excelファイルの1シートに対して様々な操作ができるように定義するクラスですので、クラス全体が参照できる変数としてExcelアプリケーション～WorkSheetまでを定義します。</p>
<p>また、VBやC#でコーディングをする際、私はUsing～を多用するので、最後にリソースの解放処理（Dispose）が必ず実行されるように、IDsiposableを実装しています。</p>
<p>&nbsp;</p>
<p>COMオブジェクトの解放について、もうすこし詳しく知りたい方は「「「こちら」」」のページをご覧ください。</p>
<p>&nbsp;</p>
<p>また、面倒なCOMオブジェクトの解放処理を簡略化するためのメソッドも「「「こちら」」」で公開していますので、よかったらあわせてご覧ください。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://excelcsharp.lance40.com/class.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>コンストラクタとデストラクタ</title>
		<link>http://excelcsharp.lance40.com/clsconstdest.html</link>
		<comments>http://excelcsharp.lance40.com/clsconstdest.html#comments</comments>
		<pubDate>Sun, 17 Nov 2013 13:30:31 +0000</pubDate>
		<dc:creator><![CDATA[Janga]]></dc:creator>
				<category><![CDATA[Excel操作クラス]]></category>
		<category><![CDATA[コンストラクタとデストラクタ]]></category>
		<category><![CDATA[Dispose]]></category>
		<category><![CDATA[コンストラクタ]]></category>
		<category><![CDATA[デストラクタ]]></category>

		<guid isPermaLink="false">http://excelcsharp.lance40.com/?p=81</guid>
		<description><![CDATA[「クラスを作成する」のページにも記載しましたが、クラスを操作する際にUsingの使用を可能にするため、作成するクラスにはコンストラクタとDisposeを実装します。 コンストラクタとデストラクタの概要についてはこちらに記 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>「<a title="クラスを作成する" href="http://excelcsharp.lance40.com/class.html">クラスを作成する</a>」のページにも記載しましたが、クラスを操作する際にUsingの使用を可能にするため、作成するクラスにはコンストラクタとDisposeを実装します。</p>
<p><a title="コンストラクタとデストラクタ" href="http://excelcsharp.lance40.com/cnstdst.html">コンストラクタとデストラクタの概要についてはこちら</a>に記述しました。使い分け方や各メソッドの意味など確認したい方は一読ください。</p>
<pre class="brush: csharp; title: ; notranslate">

#region &quot;コンストラクタとデストラクタ&quot;

        /// &lt;summary&gt;
        /// コンストラクタ
        /// &lt;/summary&gt;
        public ExcelManager()
        {
            xlApp = new Application();
        }

        /// &lt;summary&gt;
        /// 解放
        /// &lt;/summary&gt;
        public void Dispose()
        {
            // ExcelManagerが使われなくなったときに破棄する資源
            ReleaseExcelComObject(EnumReleaseMode.App);

            // dispose判定フラグON
            isDispose = true;

            // Dispose()が明示的に呼ばれたときは、GCからFinalize()呼び出しをさせない。
            GC.SuppressFinalize(this);
        }

        /// &lt;summary&gt;
        /// デストラクタ
        /// &lt;/summary&gt;
        ~ExcelManager()
        {
            // 呼出し側がDispose()してなかったらここでDispose
            if (isDispose == false)
            {
                Dispose();
            }
        }

#endregion

</pre>
<p><span style="font-size: medium;">■ コンストラクタ（public [クラス名]()）</span></p>
<p><strong>public [クラス名]() { 処理 }  </strong>はコンストラクタといい、ほかのクラスでNew()を宣言したときに呼ばれる処理です。</p>
<p>コンストラクタの処理では、クラス変数で宣言したxlAppのインスタンスを生成します。</p>
<p>&nbsp;</p>
<p><span style="font-size: medium;">■ デストラクタ（~[クラス名]()）</span></p>
<p><strong>~[クラス名]() { 処理 }</strong> は、コンストラクタとは対象に、クラスが破棄されるときに実行される処理です。しかし、C#ではガベージコレクタが機能しているため、ほとんどのクラスで実装する必要はありません。</p>
<p>明示的に解放が必要なリソースや、.NET Frameworkで管理されていないアンマネージリソースを使用するときに実装することがあります。</p>
<p>&nbsp;</p>
<p><span style="font-size: medium;">■ Dispose</span></p>
<p><strong>public void Dispose() { 処理 }</strong> は、クラスのインスタンスが破棄されるときに呼ばれる処理です。</p>
<p>デストラクタと混同してしまいがちですが、自動的に呼ばれる処理を記述するデストラクタに対して、Disposeは明示的に呼ぶ必要のある処理を記述します。</p>
<p>デストラクタはガベージコレクタが実行されたタイミングで呼ばれる処理のため実行されるタイミングが不明です。</p>
<p>通常はDisposeを実装して、ソースコード上では都度解放するようにしたほうが良いでしょう。</p>
<p>&nbsp;</p>
<p>クラスの準備は以上で完了です。</p>
<p>あとはプロパティ・メソッドカテゴリーから、必要な処理を移植すれば、Excelの操作が可能になります。</p>
]]></content:encoded>
			<wfw:commentRss>http://excelcsharp.lance40.com/clsconstdest.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>COMプロセスが残る現象を防ぐためのクラス作成</title>
		<link>http://excelcsharp.lance40.com/comrelease.html</link>
		<comments>http://excelcsharp.lance40.com/comrelease.html#comments</comments>
		<pubDate>Sat, 16 Nov 2013 14:18:11 +0000</pubDate>
		<dc:creator><![CDATA[Janga]]></dc:creator>
				<category><![CDATA[COM解放処理]]></category>
		<category><![CDATA[Excel操作クラス]]></category>
		<category><![CDATA[COM管理]]></category>
		<category><![CDATA[解放管理]]></category>

		<guid isPermaLink="false">http://excelcsharp.lance40.com/?p=87</guid>
		<description><![CDATA[このページで紹介するのは、単純に1つのExcelファイルを編集するときに、私がいつも使っているクラスの構成ルールです。 以下のルールに従って作成すれば、「COMの解放ができずにタスクマネージャにプロセスが残ってしまう。」 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>このページで紹介するのは、単純に1つのExcelファイルを編集するときに、私がいつも使っているクラスの構成ルールです。</p>
<p>以下のルールに従って作成すれば、「COMの解放ができずにタスクマネージャにプロセスが残ってしまう。」という現象を軽減させることができるはずです。</p>
<p></br><br />
<strong>１．クラスの構成</strong></p>
<p>まず、Excelファイルの操作クラスを作成するときは、「<a title="クラスの作成" href="http://excelcsharp.lance40.com/class.html">クラスの作成</a>」ページで公開しているように、クラス変数でWorksheetオブジェクトまでを宣言します。</p>
<p></br></p>
<p><strong>２．メソッド・プロパティのルール</strong></p>
<p>メソッドやプロパティを定義し、必要に応じてRangeやCellsを作って処理を作成します。</p>
<p>基本的にメソッド内で定義するオブジェクトはSheet以下のCellsやRangeのみとし、同じメソッド内で確実に解放します。</p>
<p></br></p>
<p><strong>３．COM解放メソッド</strong></p>
<p>これは私の中でいつも使っている手法ですので、上の2つとは少し違いますが・・・。</p>
<p>私がExcel操作クラスを作成するときに、いつも作成しているCOMオブジェクト解放用のメソッドです。</p>
<p></br></p>
<p>「２．メソッド・プロパティのルール」に書いた通り、メソッドやプロパティ内はCellsやRangeをメインで操作しますが、</p>
<p>シート切り替えやファイルを閉じるときなどの処理では、WorkSheetより上位のオブジェクトを操作することがあります。</p>
<p></br></p>
<p>例えばWorkBookを閉じる処理であれば、</p>
<p>WorkSheet → Sheets → WorkBook → WorkBooks</p>
<p>の順でオブジェクトを解放し、WorkBookを開くときは逆の順番でインスタンスを生成してあげる必要があります。</p>
<p></br></p>
<p>そこで私は、以下のようなEnumとメソッドを用意して、解放処理を1行で済ませられるように作成しています。</p>
<p><strong>＜Enum＞</strong><br />
クラス変数で定義したオブジェクトに対応させて宣言しておきます。</p>
<pre class="brush: csharp; title: ; notranslate">

        /// &lt;summary&gt;
        /// リリース対象
        /// &lt;/summary&gt;
        private enum EnumReleaseMode
        {
            Sheet,
            Sheets,
            Book,
            Books,
            App
        }

</pre>
<p><strong>＜メソッド＞<br />
</strong>定義したEnumを引数に設定し、呼び出し側では「どこまで解放すればいいか」を指定できるようにしておきます。</p>
<pre class="brush: csharp; title: ; notranslate">

        /// &lt;summary&gt;
        /// Excelリソース解放
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;ReleaseMode&quot;&gt;リリース対象Enum&lt;/param&gt;
        private void ReleaseExcelComObject(EnumReleaseMode ReleaseMode)
        {
            try
            {
                // xlSheet解放
                if (xlSheet != null)
                {
                    Marshal.ReleaseComObject(xlSheet);
                    xlSheet = null;
                }
                if (ReleaseMode == EnumReleaseMode.Sheet)
                    return;

                // xlSheets解放
                if (xlSheets != null)
                {
                    Marshal.ReleaseComObject(xlSheets);
                    xlSheets = null;
                }
                if (ReleaseMode == EnumReleaseMode.Sheets)
                    return;

                // xlBook解放
                if (xlBook != null)
                {
                    try
                    {
                        xlBook.Close();
                    }
                    finally
                    {
                        Marshal.ReleaseComObject(xlBook);
                        xlBook = null;
                    }
                }
                if (ReleaseMode == EnumReleaseMode.Book)
                    return;

                // xlBooks解放
                if (xlBooks != null)
                {
                    Marshal.ReleaseComObject(xlBooks);
                    xlBooks = null;
                }
                if (ReleaseMode == EnumReleaseMode.Books)
                    return;

                // xlApp解放
                if (xlApp != null)
                {
                    try
                    {
                        // アラートを戻して終了
                        xlApp.DisplayAlerts = true;
                        xlApp.Quit();
                    }
                    finally
                    {
                        Marshal.ReleaseComObject(xlApp);
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

</pre>
]]></content:encoded>
			<wfw:commentRss>http://excelcsharp.lance40.com/comrelease.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>デストラクタとコンストラクタの使い方</title>
		<link>http://excelcsharp.lance40.com/cnstdst.html</link>
		<comments>http://excelcsharp.lance40.com/cnstdst.html#comments</comments>
		<pubDate>Fri, 15 Nov 2013 11:33:32 +0000</pubDate>
		<dc:creator><![CDATA[Janga]]></dc:creator>
				<category><![CDATA[Excel操作クラス]]></category>
		<category><![CDATA[コンストラクタとデストラクタ]]></category>
		<category><![CDATA[Dispose]]></category>
		<category><![CDATA[デストラクタ]]></category>

		<guid isPermaLink="false">http://excelcsharp.lance40.com/?p=100</guid>
		<description><![CDATA[このページでは、コンストラクタとデストラクタ、そしてデストラクタと混同してしまいがちなDisposeについて説明します。 &#160; ● Dispose まず初めに、Disposeとデストラクタは違うものです。よく混同 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>このページでは、コンストラクタとデストラクタ、そしてデストラクタと混同してしまいがちなDisposeについて説明します。</p>
<p>&nbsp;</p>
<p>● Dispose</p>
<p>まず初めに、Disposeとデストラクタは違うものです。よく混同して説明が書かれたページを目にするので、ここで説明を記載しておきます。</p>
<p>Disposeは、解放するクラスの中で使用していたリソースの破棄をするために実行する処理です。</p>
<p>これだけ書くとデストラクタと同じような処理内容ですが、明確な違いは、Disposeは明示的に呼び出さないと処理をしてくれないということです。</p>
<p>このDisposeを用意しないといけない場面は、クラス内で使用するリソースに.NET Frameworkの管理下にないもの（COMオブジェクトなどのアンマネージドリソース）が含まれている場合です。</p>
<p>このサイトでいうとExcelオブジェクトがそれに該当するため、ExcelオブジェクトはかならずDisposeで解放してあげる必要があるのです。これを忘れると「exeを終了したのに、exeから呼び出していたExcelアプリケーションがタスクマネージャに残ってる！」なんてことがよく起こります。</p>
<p>&lt;宣言方法&gt;</p>
<pre class="brush: csharp; title: ; notranslate">
  /// &lt;summary&gt;
  /// 解放
  /// &lt;/summary&gt;
  public void Dispose()
  {
      // ExcelManagerが使われなくなったときに破棄する資源
      ReleaseExcelComObject(EnumReleaseMode.App);

      // dispose判定フラグON
      isDispose = true;

      // Dispose()が明示的に呼ばれたときは、GCからFinalize()呼び出しをさせない。
      GC.SuppressFinalize(this);
  }
</pre>
<p>&nbsp;</p>
<p>● コンストラクタ</p>
<p>動的クラスのインスタンスが生成されるときに実行される処理で、『public [クラス名]()』で宣言されます。</p>
<p>コンストラクタについてはお馴染みの処理なので、ここでは省略します。</p>
<p>&lt;宣言方法&gt;</p>
<pre class="brush: csharp; title: ; notranslate">
    /// &lt;summary&gt;
    /// コンストラクタ
    /// &lt;/summary&gt;
    public ExcelManager()
    {
        xlApp = new Application();
    }
</pre>
<p>&nbsp;</p>
<p>● デストラクタ</p>
<p>コンストラクタと正反対の処理をします。クラスのインスタンスが破棄されると実行される処理で、記述方法は『~ [クラス名]()』です。</p>
<p>Disposeとの違いは、Disposeは明示的に呼び出したタイミングで実行する処理なのに対し、デストラクタはガベージコレクタが回収に来たタイミングで実行される処理です。</p>
<p>使い分けは、<strong><em>Finalizeは.NET Frameworkの管理下にあるリソースの解放</em></strong>処理を実装し、<strong><em>Disposeは.NET Frameworkの管理下に無いリソースの解放</em></strong>処理をすることが多いです。</p>
<p>&lt;宣言方法&gt;</p>
<pre class="brush: csharp; title: ; notranslate">
  /// &lt;summary&gt;
  /// デストラクタ
  /// &lt;/summary&gt;
  ~ExcelManager()
  {
     // マネージドリソースの解放処理
  }
</pre>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://excelcsharp.lance40.com/cnstdst.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
