この記事では、C#のコンボボックスでWordファイルの表を選択して表の値をdataGridViewに表示させる方法についてご説明します。
【動画】C#のコンボボックスでWordファイルの表を選択して表の値をdataGridViewに表示させる実際の動き
本題に入る前に、まずは次の動画をご覧ください。
Wordアプリケーションのインスタンスを生成し、Wordファイルを開きます。
Wordファイルを開いたら、コンボボックスの値を参照してdataGridViewにどの表の値を出力するかを特定します。
どの表か特定できたら、その表の値をdataGridViewに出力します。
参照設定が必要
今回のコードを実行するのに参照設定が必要です。
今回は以下の参照設定を行います。
- Microsoft.Office.Interop.Word(Microsoft.Office.Interop.Word.dll)
- 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」が存在しないとのことでエラーになってしまうので、この参照設定が必要になります。
コードの流れ
インポートする名前空間には、Word操作や設定情報の取得などがあります。
今回はコンボボックスの値でどの表を出力するかを特定しています。
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アプリケーションオブジェクトのリソースを解放する処理のコードです。
以上のコードを実行することでリソースの解放を適切に行い、不要なメモリの使用を避けます。
動作確認
最後に
この記事では、C#のコンボボックスでWordファイルの表を選択して表の値をdataGridViewに表示させる方法についてご説明しました。
C#のコンボボックスでWordファイルの表を選択して表の値をdataGridViewに表示させたいときは本記事を参考にしてみてくださいね。
プログラミングのスキルを習得するなら
プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。
プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。