【C#】Wordファイルにある表の値をC#のdataGridViewに表示させるには

この記事では、Wordファイルにある表の値をC#のグラフに表示させる方法についてご説明します。

【動画】Wordファイルにある表の値をC#のグラフに表示させる実際の動き

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


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

Wordファイルを開いたら、Wordファイル内にある表のデータを取得し、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
Wordファイルの表の列をdataGridViewに追加する
Wordファイルの表にある列名をdataGridViewに追加します。
STEP.4
Wordファイルの表の値を追加する行をdataGridViewに追加する
Wordファイルの表の値を追加する行をdataGridViewに追加します。
STEP.5
Wordファイルの表の値をdataGridViewに追加する
Wordファイルの表の値をdataGridViewに追加します。
STEP.6
Wordファイルを閉じる
Wordファイルを閉じます。
STEP.7
COMオブジェクトへの参照を解放する
COMオブジェクトへの参照を解放します。

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

Wordファイル

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

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

C#のフォーム

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

ボタンと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#\0074\0074.docx" />
	
	</appSettings>
</configuration>

注目すべきコード

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

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

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

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

フォームのコード

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

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

        private void button1_Click(object sender, EventArgs e)
        {
            // App.configのappSettingsタグ内に記述した「wdFilePath」のキーの値を取得して変数「wdFilePath」に格納する
            string wdFilePath = ConfigurationManager.AppSettings["wdFilePath"];

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

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

            // Wordファイルの1つ目の表を取得する
            var table = document.Tables[1];

            // 表示されている列を削除するため、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という名前を定義しています。

注目すべきコード②

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

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

コードの説明

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

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

注目すべきコード③

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

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

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

コードの説明

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

コードの詳細

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

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

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

注目すべきコード④

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

            // Wordファイルの1つ目の表を取得する
            var table = document.Tables[1];

コードの説明

以上のコードは、Wordファイルの1つ目の表を取得するコードです。

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

もし2つ目の表を対象にしたい場合は2を指定します。

今回サンプルで用意したWordファイルに1つだけ表が存在しているのでTablesに1を指定しています。

注目すべきコード⑤

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

            // 表の列の数だけ処理を繰り返す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に追加する処理のコードです。

コードの詳細

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

今回のサンプルのWordファイルの表には列が7列あるので、7回処理を繰り返します。

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

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

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

注目すべきコード②

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

            // 表の行の数だけ処理を繰り返す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に追加する処理のコードです。

コードの詳細

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

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

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

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

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

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

注目すべきコード④

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

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

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

コードの説明

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

注目すべきコード⑤

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

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

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

コードの説明

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

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

動作確認

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

最後に

この記事では、Wordファイルにある表の値をC#のグラフに表示させる方法についてご説明しました。

Wordファイルにある表の値をC#のグラフに表示させたいときは本記事を参考にしてみてくださいね。

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

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

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

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