【C#】C#のコンボボックスでWordファイルの表を選択して表の値をdataGridViewに表示させるには

この記事では、C#のコンボボックスでWordファイルの表を選択して表の値をdataGridViewに表示させる方法についてご説明します。

【動画】C#のコンボボックスでWordファイルの表を選択して表の値をdataGridViewに表示させる実際の動き

本題に入る前に、まずは次の動画をご覧ください。


Wordアプリケーションのインスタンスを生成し、Wordファイルを開きます。

Wordファイルを開いたら、コンボボックスの値を参照してdataGridViewにどの表の値を出力するかを特定します。

どの表か特定できたら、その表の値をdataGridViewに出力します。

参照設定が必要

今回のコードを実行するのに参照設定が必要です。

今回は以下の参照設定を行います。

  1. Microsoft.Office.Interop.Word(Microsoft.Office.Interop.Word.dll)
  2. System.Configuration(System.Configuration.dll)

①Microsoft.Office.Interop.Word(Microsoft.Office.Interop.Word.dll)

Microsoft.Office.Interop.Wordを参照設定すると、Wordファイルに対して様々な操作を行うことができるようになります。

今回はWordファイルから表のデータを取得するので、この参照設定が必要になります。

②System.Configuration(System.Configuration.dll)

System.Configurationを参照設定すると、アプリケーションの設定をapp.configのような外部の設定ファイルに分けることができ、コンパイルの必要が無く設定値を変更することができるようになります。

System.Configurationを参照設定しないと、「ConfigurationManager」が存在しないとのことでエラーになってしまうので、この参照設定が必要になります。

コードの流れ

STEP.1
必要な名前空間をインポートする
必要な名前空間をインポートします。
インポートする名前空間には、Word操作や設定情報の取得などがあります。
STEP.2
Wordファイルを開く
Wordファイルを開きます。
STEP.3
dataGridViewにWordファイルのどの表を出力するか特定する
dataGridViewにWordファイルのどの表を出力するか特定します。
今回はコンボボックスの値でどの表を出力するかを特定しています。
STEP.4
Wordファイルの表の列をdataGridViewに追加する
Wordファイルの表にある列名をdataGridViewに追加します。
STEP.5
Wordファイルの表の値を追加する行をdataGridViewに追加する
Wordファイルの表の値を追加する行をdataGridViewに追加します。
STEP.6
Wordファイルの表の値をdataGridViewに追加する
Wordファイルの表の値をdataGridViewに追加します。
STEP.7
Wordファイルを閉じる
Wordファイルを閉じます。
STEP.8
COMオブジェクトへの参照を解放する
COMオブジェクトへの参照を解放します。

WordファイルとC#のフォームの例

Wordファイル

今回は下のWordファイルを用意しました。

Wordファイルに3つ表が存在しています。

C#のフォーム

今回は下のフォームを用意しました。

ボタンとコンボボックス、dataGridViewが設置されています。

このボタンをクリックすると、コンボボックスの値を参照してdataGridViewにどの表の値を出力するかを特定し、Wordファイルの表の値が取得されてdataGridViewに出力されます。

C#のコード(例)

App.configのコード

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<startup>
		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
	</startup>
	<appSettings>
		<!-- Wordファイルのフルパス -->
		<add key="wdFilePath" value="C:\work\10_勉強\21_C#\0076\0076.docx" />
	
	</appSettings>
</configuration>

注目すべきコード

見て頂きたいのは8行目です。

8行目は、Wordファイルのフルパスを「wdFilePath」というキーに設定しているコードです。

「wdFilePath」のキーの値をフォーム側のコードが参照して使います。

ちなみに、今回扱うWordファイルは下の画像のファイルです。(C:\work\10_勉強\21_C#\0076\0076.docx)

フォームのコード

using System;
using System.Windows.Forms;
using System.Configuration;
using Microsoft.Office.Interop.Word;
using Application = Microsoft.Office.Interop.Word.Application;

namespace wfcs_0076
{
    public partial class Form1 : Form
    {
        // Privateのメンバ変数としてDocumentを宣言する
        private Document document;

        // Privateのメンバ変数としてwordAppを宣言する
        private Application wordApp;

        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            // 表の行の数だけ処理を繰り返すFor文(データ部は2行目からなのでカウンタに2を設定)
            for (int cnt = 1; cnt <= 3; cnt++)
            {
                // コンボボックスに値を追加する
                comboBox1.Items.Add(cnt);
            }

            // 0番目のインデックス(つまり「1」)をデフォルト値として選択
            comboBox1.SelectedIndex = 0;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            // App.configのappSettingsタグ内に記述した「wdFilePath」のキーの値を取得して変数「wdFilePath」に格納する
            string wdFilePath = ConfigurationManager.AppSettings["wdFilePath"];

            // Wordアプリケーションのインスタンスを生成する
            wordApp = new Application();

            // Wordファイルを開く
            document = wordApp.Documents.Open(wdFilePath);

            // Wordファイルの1つ目の表を取得する
            var table = document.Tables[int.Parse(comboBox1.SelectedItem.ToString())];

            // 表示されている列を削除するため、DataGridViewの列をクリアする
            dataGridView1.Columns.Clear();

            // 表の列の数だけ処理を繰り返すFor文
            for (int cntC = 1; cntC <= table.Columns.Count; cntC++)
            {
                // 列名をdataGridViewに追加する
                dataGridView1.Columns.Add("Column" + cntC, table.Cell(1, cntC).Range.Text.TrimEnd('\r', '\a'));
            }

            // 表の行の数だけ処理を繰り返すFor文(データ部は2行目からなのでカウンタに2を設定)
            for (int cntR = 2; cntR <= table.Rows.Count; cntR++)
            {
                // DataGridViewの行を新規作成する
                var row = new DataGridViewRow();

                // セルを追加する
                row.CreateCells(dataGridView1);

                // 表の列の数だけ処理を繰り返すFor文
                for (int cntC = 1; cntC <= table.Columns.Count; cntC++)
                {
                    // 表の値をDataGridViewの変数rowに設定する
                    row.Cells[cntC - 1].Value = table.Cell(cntR, cntC).Range.Text.TrimEnd('\r', '\a');
                }

                // (表の値が設定された)変数rowをDataGridViewに追加する
                dataGridView1.Rows.Add(row);
            }

            // Wordファイルを閉じる
            document.Close(false);

            // Wordアプリケーションを終了する
            wordApp.Quit();

            // documentインスタンスのリソースを解放する
            System.Runtime.InteropServices.Marshal.ReleaseComObject(document);

            // Wordアプリケーションオブジェクトのリソースを解放する
            System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp);
        }
    }
}

注目すべきコード①

最初に見て頂きたいのは1行目から4行目です。

using System;
using System.Windows.Forms;
using System.Configuration;
using Application = Microsoft.Office.Interop.Word.Application;

コードの説明

以上のコードは、必要な名前空間の使用宣言およびエイリアス宣言のコードです。

コードの詳細

1行目は、.NET Frameworkの基本クラスのセットを参照する名前空間です。

2行目は、ウィンドウやダイアログボックスを使う名前空間です。

3行目は、アプリケーションの実行時設定やカスタム設定を読み込み、保存することができる名前空間です。

アプリケーションの設定をapp.configのような外部の設定ファイルに分けることができ、コンパイルの必要が無く設定値を変更することができるようになります。

4行目は、Microsoft.Office.Interop.Word.Applicationクラスに対してApplicationという名前を定義しています。

次に見て頂きたいのは17行目から24行目です。

            // 表の行の数だけ処理を繰り返すFor文(データ部は2行目からなのでカウンタに2を設定)
            for (int cnt = 1; cnt <= 3; cnt++)
            {
                // コンボボックスに値を追加する
                comboBox1.Items.Add(cnt);
            }

            // 0番目のインデックス(つまり「1」)をデフォルト値として選択
            comboBox1.SelectedIndex = 0;

コードの説明

以上のコードは、コンボボックスへの値設定、およびデフォルト値を設定する処理のコードです。

今回のWordファイルのサンプルは表が3つあるので、1から3の3つの値をコンボボックスに設定しています。

また、デフォルト値は1つ目の値を設定しています。(SelectedIndexに0を設定)

注目すべきコード②

次に見て頂きたいのは29行目です。

            // App.configのappSettingsタグ内に記述した「wdFilePath」のキーの値を取得して変数「wdFilePath」に格納する
            string wdFilePath = ConfigurationManager.AppSettings["wdFilePath"];

コードの説明

以上のコードは、App.configのappSettingsタグ内に記述した「wdFilePath」のキーの値を取得して変数に格納するコードです。

「wdFilePath」のキーの値は変数「wdFilePath」に格納します。

注目すべきコード③

次に見て頂きたいのは32行目から35行目です。

            // Wordアプリケーションのインスタンスを生成する
            Application wordApp = new Application();

            // Wordファイルを開く
            var document = wordApp.Documents.Open(wdFilePath);

コードの説明

以上のコードは、Wordアプリケーションのインスタンスを生成してWordファイルを開き、Wordファイルにある表の数をカウントしてテキストボックスに出力するコードです。

コードの詳細

32行目のコードでは、Wordアプリケーションのインスタンスを生成しています。

このインスタンスを生成することで、Wordの操作(Wordファイルを開く、閉じるなど)を行うことができるようになります。

35行目のコードでは、Wordファイルを開きます。

注目すべきコード④

次に見て頂きたいのは38行目です。

            // Wordファイルの1つ目の表を取得する
            var table = document.Tables[int.Parse(comboBox1.SelectedItem.ToString())];

コードの説明

以上のコードは、コンボボックスの値に該当する表を取得するコードです。

もしコンボボックスの値が1の場合はWordファイルに存在する1つ目の表を指定する、という意味です。

Tablesに指定された値は、Wordファイルに存在するn番目の表を指定する、という意味です。

コンボボックスの値が1の場合は1つ目の表を、2の場合は2つ目の表をdataGridViewに出力します。

注目すべきコード⑤

次に見て頂きたいのは44行目から48行目です。

            // 表の列の数だけ処理を繰り返すFor文
            for (int cntC = 1; cntC <= table.Columns.Count; cntC++)
            {
                // 列名をdataGridViewに追加する
                dataGridView1.Columns.Add("Column" + cntC, table.Cell(1, cntC).Range.Text.TrimEnd('\r', '\a'));
            }

コードの説明

以上のコードは、列名をdataGridViewに追加する処理のコードです。

コードの詳細

44行目のコードは表の列の数だけ処理を繰り返すFor文です。

47行目のコードは、列名をdataGridViewに追加するコードです。

列名をdataGridViewに追加するにはAddメソッドを使います。

Addメソッドの引数には(一意の)カラム名と、Wordファイルの表の列名を指定します。

注目すべきコード②

次に見て頂きたいのは51行目から68行目です。

            // 表の行の数だけ処理を繰り返すFor文(データ部は2行目からなのでカウンタに2を設定)
            for (int cntR = 2; cntR <= table.Rows.Count; cntR++)
            {
                // DataGridViewの行を新規作成する
                var row = new DataGridViewRow();

                // セルを追加する
                row.CreateCells(dataGridView1);

                // 表の列の数だけ処理を繰り返すFor文
                for (int cntC = 1; cntC <= table.Columns.Count; cntC++)
                {
                    // 表の値をDataGridViewの変数rowに設定する
                    row.Cells[cntC - 1].Value = table.Cell(cntR, cntC).Range.Text.TrimEnd('\r', '\a');
                }

                // (表の値が設定された)変数rowをDataGridViewに追加する
                dataGridView1.Rows.Add(row);
            }

コードの説明

以上のコードは、Wordファイルの値をdataGridViewに追加する処理のコードです。

コードの詳細

51行目のコードは、表の行の数だけ処理を繰り返すFor文です。

なお、データ部は2行目からなのでカウンタに2を設定しています。

54行目のコードでdataGridViewの行を新規で作成し、57行目でdataGridViewに追加しています。

60行目のコードは、表の列の数だけ処理を繰り返すFor文です。

63行目のコードでは、表の値をDataGridViewの変数rowに設定します。

67行目のコードでは、(表の値が設定された)変数rowをDataGridViewに追加します。

注目すべきコード④

次に見て頂きたいのは71行目から74行目です。

            // Wordファイルを閉じる
            document.Close(false);

            // Wordアプリケーションを終了する
            wordApp.Quit();

コードの説明

以上のコードは、Wordファイルを閉じてWordアプリケーションを終了する処理のコードです。

注目すべきコード⑤

次に見て頂きたいのは77行目から80行目です。

            // documentインスタンスのリソースを解放する
            System.Runtime.InteropServices.Marshal.ReleaseComObject(document);

            // Wordアプリケーションオブジェクトのリソースを解放する
            System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp);

コードの説明

以上のコードは、documentインスタンスとWordアプリケーションオブジェクトのリソースを解放する処理のコードです。

以上のコードを実行することでリソースの解放を適切に行い、不要なメモリの使用を避けます。

動作確認

「WordファイルとC#のフォームの例」をご覧ください。

最後に

この記事では、C#のコンボボックスでWordファイルの表を選択して表の値をdataGridViewに表示させる方法についてご説明しました。

C#のコンボボックスでWordファイルの表を選択して表の値をdataGridViewに表示させたいときは本記事を参考にしてみてくださいね。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら