【C#】Excelファイル操作読み書きreadwriteサンプルコード.NET

C#.NET

ad2

【C#】Excelファイル操作読み書きreadwriteサンプルコード.NET

参照追加

まずは、C#windowsFormプロジェクトを作成して、

Excelを操作する為に、ExcelのObject Libraryを参照追加します。

seemlibrary

参照追加でCOMを選択して、Excelと検索すると、『Microsoft Excel 16.0 Object Library』がヒットするので、それにチェックを入れて、OKを押下。

これで参照追加完了。

ファイル開く閉じるFileOpenClose

まず初めに、Excelファイルを開くのと閉じるコードをご紹介いたします。

画面にボタンを配置。

excel_control_screen_sample

Excelファイルを開いて閉じるだけのソースコード。

using Microsoft.Office.Interop.Excel;
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;

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

        /// <summary>
        /// Excel_btn1 ファイル 開く/閉じる open / close
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //アプリケーションのオブジェクト
            Microsoft.Office.Interop.Excel.Application excel;
            //ブックのオブジェクト
            Workbook workbook;


            //アプリケーションのインスタンス作成
            excel = new Microsoft.Office.Interop.Excel.Application
            {
                //アプリケーションの表示設定 Visible=true:Excel表示 false:Excel非表示(バックグラウンド処理)
                Visible = false
            };

            try
            {
                //Excelファイルの場所
                string file_path = @"C:\Excel_test\excel_sample.xlsx";

                //ファイルを開く
                workbook = excel.Workbooks.Open(Path.GetFullPath(file_path));

                ///*********///
                //Excelファイル操作処理~~
                ///*********///

                //ブック閉じる
                workbook.Close();

                Marshal.ReleaseComObject(workbook);

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();

                // アプリケーションのオブジェクトの解放
                excel.Quit();
                Marshal.ReleaseComObject(excel);
            }
            catch (Exception)
            {

            }
            finally
            {
                
                //ガベージコレクションの実行
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
            }
        }
    }
}

try-catch-finallyでしっかりと、Excelのプロセスを終了してあげないと、ずっと残ったままになる。

※以外に盲点だった。

値の読取書込 read_write

続いては、Excelファイルから値を取得したり、書き込んだりするソースコードをご紹介します。

前提に、Excelファイルを用意します。今回は、下記の図のようなExcelに表を作りました。

excel_data_sample1

数式を表示しさせると下記の通りに合計行にSUM関数が入ってます。

excel_data_sample2

では、C#からExcelを操作して、空欄に値を書き込んで、合計値を取得してみましょう。

画面のデザインはこんな感じに配置してみました。

excel_read_write_design

ソースコードはこんな感じで作ってみました。

using Microsoft.Office.Interop.Excel;
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;

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

        /// <summary>
        /// Excel_btn1 ファイル 開く/閉じる open / close
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //アプリケーションのオブジェクト
            Microsoft.Office.Interop.Excel.Application excel;
            //ブックのオブジェクト
            Workbook workbook;


            //アプリケーションのインスタンス作成
            excel = new Microsoft.Office.Interop.Excel.Application
            {
                //アプリケーションの表示設定 Visible=true:Excel表示 false:Excel非表示(バックグラウンド処理)
                Visible = false
            };

            try
            {
                //Excelファイルの場所
                string file_path = @"C:\Excel_test\excel_sample.xlsx";

                //ファイルを開く
                workbook = excel.Workbooks.Open(Path.GetFullPath(file_path));

                ///*********///
                //Excelファイル操作処理~~
                ///*********///

                //ブック閉じる
                workbook.Close();

                Marshal.ReleaseComObject(workbook);

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();

                // アプリケーションのオブジェクトの解放
                excel.Quit();
                Marshal.ReleaseComObject(excel);
            }
            catch (Exception)
            {

            }
            finally
            {
                
                //ガベージコレクションの実行
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
            }
        }

        /// <summary>
        /// Excel内容の読み書き read / write
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            //アプリケーションのオブジェクト
            Microsoft.Office.Interop.Excel.Application excel;
            //ブックのオブジェクト
            Workbook workbook;
            //シートのオブジェクト
            Worksheet Sheet;

            //アプリケーションのインスタンス作成
            excel = new Microsoft.Office.Interop.Excel.Application
            {
                //アプリケーションの表示設定 Visible=true:Excel表示 false:Excel非表示(バックグラウンド処理)
                Visible = false
            };

            try
            {
                //Excelファイルの場所
                string file_path = @"C:\Excel_test\excel_sample.xlsx";

                //ファイルを開く
                workbook = excel.Workbooks.Open(Path.GetFullPath(file_path));

                // シートを取得する
                //workbook = excel.Workbooks.Open();
                Sheet = workbook.Sheets[1];      //シートの一左端のシートを選択

                /////第2四半期の各商品数を書き込む/////
                //range指定して書き込む 値は適当

                Sheet.Range["C3"].Value = 3;
                Sheet.Range["C4"].Value = 7;
                Sheet.Range["C5"].Value = 1;
                Sheet.Range["C6"].Value = 2;
                Sheet.Range["C7"].Value = 9;
                Sheet.Range["C8"].Value = 4;


                /////第3四半期の各商品数を書き込む/////
                //Offsetを使った書き込み
                //3行目の右端の列を取得
                Range rangetoright = Sheet.Cells[3, 10].End[XlDirection.xlToLeft];   //3行目の値がある右端列を選択
                Range write_D3_range = rangetoright.Offset[0, 1];                // offsetで右列を選択 ("D3")
                Range write_D4_range = write_D3_range.Offset[1, 0];              // offsetで1行増のセル選択("D4")
                Range write_D5_range = write_D3_range.Offset[2, 0];              // offsetで2行増のセル選択("D5")
                Range write_D6_range = write_D3_range.Offset[3, 0];              // offsetで3行増のセル選択("D6")
                Range write_D7_range = write_D3_range.Offset[4, 0];              // offsetで4行増のセル選択("D7")
                Range write_D8_range = write_D3_range.Offset[5, 0];              // offsetで5行増のセル選択("D8")

                write_D3_range.Value = 4;
                write_D4_range.Value = 2;
                write_D5_range.Value = 3;
                write_D6_range.Value = 2;
                write_D7_range.Value = 1;
                write_D8_range.Value = 7;


                /////第4四半期の各商品数を書き込む/////
                //countでセル数を取得してfor文で乱数を書き込む
                Random random = new Random();
                int cells_count = Sheet.Range["E3:E8"].Count;

                for (int i = 0; i < cells_count; i++)
                {
                    Sheet.Range["E" + (i + 3)].Value = random.Next(1,10);
                }


                //各合計値を取得する rangeでもcellsでも取得可
                double sum_value_1Q = Sheet.Range["B9"].Value;  //第1四半期 合計値
                double sum_value_2Q = Sheet.Cells[9, 3].Value;  //第2四半期 合計値
                double sum_value_3Q = Sheet.Range["D9"].Value;  //第3四半期 合計値
                double sum_value_4Q = Sheet.Cells[9, 5].Value;  //第4四半期 合計値

                str_1Q_textbox.Text = sum_value_1Q.ToString();
                str_2Q_textbox.Text = sum_value_2Q.ToString();
                str_3Q_textbox.Text = sum_value_3Q.ToString();
                str_4Q_textbox.Text = sum_value_4Q.ToString();

                // 保存
                workbook.Save();

                //ブック閉じる
                workbook.Close();

                Marshal.ReleaseComObject(Sheet);
                Marshal.ReleaseComObject(workbook);

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();

                // アプリケーションのオブジェクトの解放
                excel.Quit();
                Marshal.ReleaseComObject(excel);
            }
            catch (Exception)
            {

            }
            finally
            {

                //ガベージコレクションの実行
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
            }
        }
    }
}

Excel_btn2を押下した結果は下記の図の通りです。

excel_read_write_result

Excelの中身はどうなったかというと、

excel_read_write_save_result

きちんと、値の書き込みや読み取りが出来て保存までできていることがわかります。

まとめ

今回は、C#からExcelを操作してみたソースコードをご紹介しました。

簡単に値の書き込み、読み取りをしまたが、VBAみたいに色々と出来ますので、応用してみて下さい。

色々と書いて学び、C#からExcelを操作できるようなスキルを身に着けておくと、業務の効率化などで活用できるかと思います。

テンプレ作って置いて、帳票を出力するだとか、データ分析の効率化エビデンス出力など、考えればたくさんありますね。