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

C#,開発

おはようございます。

久しぶりのC#ネタ。

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

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

スポンサーリンク

画面

画面
画面

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

参照ライブラリの追加

参照ライブラリの追加1
参照ライブラリの追加1
参照ライブラリの追加2
参照ライブラリの追加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 のプロセスが残ってしまう問題が

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

何かのお役に立てれば。

ではでは。

 

スポンサーリンク


関連するコンテンツ