範囲を指定してExcel表から複数の値を取り出す - C#

C#のプログラムで範囲を指定してExcel表から複数の値を取り出すコードを紹介します。

概要

Excelファイルから値を読み取るコードを紹介します。 こちらの記事では、Excelシートの単一のセルの値を読み出しましたが、 この記事ではExcelシートの範囲を指定して複数の値を読み出します。

事前準備: Microsoft.Office.Interop.Excel アセンブリの参照

Visual Studio を起動し、Windows Formアプリケーション(.NET Framework)を作成します。 プロジェクトの作成後、 Microsoft.Office.Interop.Excel アセンブリの参照を追加します。 参照の追加の手順はこちらの記事を参照してください。

元ファイル

Excelファイルを作成します。中は以下とします。A列に値を入力してあります。


UI

以下のUIを作成します。MultiLineプロパティをTrueに設定したテキストボックスとボタンを1つ配置します。また、OpenFileDialogを配置します。

コード

以下のコードを記述します。
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 Microsoft.Office.Interop.Excel;

namespace ExcelFileAccess
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
        string ExcelBookFileName = openFileDialog1.FileName;

        Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
        ExcelApp.Visible = false;
        Workbook wb = ExcelApp.Workbooks.Open(ExcelBookFileName,
          Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
          Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
          Type.Missing);

        Worksheet ws1 = wb.Sheets[1];
        ws1.Select(Type.Missing);
        Range range = ExcelApp.get_Range("A1", "A100");
        if (range != null) {
          for (int i = 1; i <= range.Count; i++) {
            decimal val = Convert.ToDecimal(range.Value2[i, 1]);
            textBox1.Text += string.Format("{0:g}\r\n", val);
          }
        }

        wb.Close();

        System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
        range = null;
        System.Runtime.InteropServices.Marshal.ReleaseComObject(ws1);
        ws1 = null;
        System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
        wb = null;

        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
        ExcelApp.Quit();

        System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp);
        ExcelApp = null;

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

      }
    }
  }
}

解説

button1_Click イベント
下記コードでExcelファイルを参照するためのOpenFileDialogを開きます。
  if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
  }

Excelファイルのファイルパスを取得し、ExcelAppオブジェクトを作成します。 ExcelAppオブジェクトのVisibleをfalseにすることでExcelアプリケーションのウィンドウを非表示にします。
  string ExcelBookFileName = openFileDialog1.FileName;

  Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
  ExcelApp.Visible = false;

ExcelAppオブジェクトのWorkbooksのOpen()メソッドを呼び出し、Excelファイルを開きます。
  Workbook wb = ExcelApp.Workbooks.Open(ExcelBookFileName,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    Type.Missing);

最初のシートを操作対象のワークシートとして選択します。
  Worksheet ws1 = wb.Sheets[1];
  ws1.Select(Type.Missing);

範囲を指定してセルを選択します。Excelシートの"A1"セルから"A100"セルを選択します。
  Range range = ExcelApp.get_Range("A1", "A100");

選択した範囲がnullでないことを確認し、選択範囲のセルの値を読み出します。
セルの値は、"range.Value2[(行番号), (列番号)]" で取得します。
  if (range != null) {
    for (int i = 1; i <= range.Count; i++) {
      decimal val = Convert.ToDecimal(range.Value2[i, 1]);
      textBox1.Text += string.Format("{0:g}\r\n", val);
    }
  }

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。ファイルを開くダイアログボックスが表示されます。先ほど作成したExcelワークシートのファイルを選択します。


Excel表から読み取られた値がテキストボックスに表示されます。

このページのキーワード
  • 範囲を指定してExcel表から複数の値を取得する
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2013-03-21
改訂日: 2024-04-13
iPentec all rights reserverd.