【C#】Excelの読み込みと書き込みをしてみる(その1)

C#,開発

おはようございます。

久しぶりのC#ネタ。

Excelの読み書きは最近では COM は利用せずに、Open Xml SDK、ClosedXML、NPOI などが主流っぽいですが、

xls、xlsx 両方に対応するのは COM の方がサクッとできそうなので昔ながらの方法を試します。

スポンサーリンク

画面

画面

Windows Forms でプロジェクトを作成し、画面にテキストボックス、ボタン等を配置。

参照ライブラリの追加

参照ライブラリの追加1
参照ライブラリの追加2

ソリューションエクスプローラーからプロジェクトの「参照」を右クリックし、「参照の追加」を選択。

参照マネージャーで、「Microsoft Excel xx.x Object Library」にチェックし、「OK」ボタンをクリックします。

プログラム

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;

namespace SampleExcel
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 参照ボタンクリック
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_file_Click(object sender, EventArgs e)
        {

            OpenFileDialog ofDialog = new OpenFileDialog();
            ofDialog.InitialDirectory = @"C:\wk\tmp";
            ofDialog.RestoreDirectory = true;
            ofDialog.Title = "対象ファイルを選択";

            //ダイアログを表示する
            if (ofDialog.ShowDialog() == DialogResult.OK)
            {
                this.txb_file.Text = ofDialog.FileName;

            }
        }

        /// <summary>
        /// 書き込みボタンクリック
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_output_Click(object sender, EventArgs e)
        {
            // Excel起動
            Excel.Application app = new Excel.Application();
            app.DisplayAlerts = false;
            app.Visible = false;

            // ブック、シート定義
            Excel.Workbook book = null;
            Excel.Worksheet sheet = null;

            try
            {

                // ブック選択
                book = app.Workbooks.Open(txb_file.Text);
                // シート選択
                sheet = book.ActiveSheet;
                try
                {
                    string value = "";
                    // セル値読み込み
                    var obj = sheet.Range[txb_cell_range.Text].Value;
                    if (obj is string)
                    {
                        value = obj;  
                    }
                    else if (obj is double)
                    {
                        value = ((double)obj).ToString();
                    }

                    sheet.Range[txb_cell_range.Text].Value = txb_value.Text;
                }
                finally
                {
                    Marshal.ReleaseComObject(sheet);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (book != null)
                {
                    book.Close(true, Type.Missing, Type.Missing);
                    Marshal.ReleaseComObject(book);
                }
                if (app != null)
                {
                    app.Quit();
                    Marshal.ReleaseComObject(app);
                }
            }
        }

        /// <summary>
        /// 読み込みボタンクリック
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_input_Click(object sender, EventArgs e)
        {
            // Excel起動
            Excel.Application app = new Excel.Application();
            app.DisplayAlerts = false;
            app.Visible = false;

            // ブック、シート定義
            Excel.Workbook book = null;
            Excel.Worksheet sheet = null;

            try
            {

                // ブック選択
                book = app.Workbooks.Open(txb_file.Text);
                // シート選択
                sheet = book.ActiveSheet;
                try
                {
                    string value = "";

                    // セル値読み込み
                    var obj = sheet.Range[txb_cell_range.Text].Value;
                    if (obj is string)
                    {
                        value = obj;
                    }
                    else if (obj is double)
                    {
                        value = ((double)obj).ToString();
                    }

                    MessageBox.Show(value, "Excelサンプル");
                }
                finally
                {
                    Marshal.ReleaseComObject(sheet);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (book != null)
                {
                    book.Close(true, Type.Missing, Type.Missing);
                    Marshal.ReleaseComObject(book);
                }
                if (app != null)
                {
                    app.Quit();
                    Marshal.ReleaseComObject(app);
                }
            }
        }
    }
}

ビジュアルエディタにて、ボタンのイベントを追加して処理を記述していきます。

とりあえず、対象の Excel を選択させる「参照」ボタン、読み込み処理の「読み込み」ボタン、書き込み処理の「書き込み」ボタンにイベントを追加。

※デザイナーソースは割愛

起動してみる

サンプルの Excel を用意し、「C:\wk\temp」に格納しておきます。

サンプルファイル
読み込みボタン押下

起動後、ファイル選択、対象に「C2」を指定して読み込みボタン押下で、内容が表示されました。

書き込み後再度読み込み

値に「test」を指定して書き込み後、再度読み込みボタンを押下で、表示が変わったことを確認。

Excelを開いてもちゃんと反映されていましたので、無事完了。

まとめ

COMの場合、しっかりプログラミングしないと Excel のプロセスが残ってしまう問題が

まあ多発するらしいので、次回はそこら辺をやってみようかと思います。

何かのお役に立てれば。

ではでは。

 

スポンサーリンク


関連するコンテンツ