SQLの窓

2017年12月17日


C# : dynamic 型 による Excel へのアクセス

dynamic 型のオブジェクトは静的な型チェックをバイパスします。 なので、そのオブジェクトに対して熟練している必要がありますが、COM を使用する事を想定している場合、プログラマはそのメソッドに対して良く経験しているはすです。

▼ テンプレートのダウンロード


Excel の初期化部分と終了部分
		// *********************
		// 初期処理
		// *********************
		private void Form1_Load(object sender, EventArgs e) {

			excelApp = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
			excelApp.Visible = true;

		}

		// *********************
		// 終了処理
		// *********************
		private void Form1_FormClosed(object sender, FormClosedEventArgs e) {

			if (excelApp != null) {
				if (workBook != null) {
					// 保存した事にする
					workBook.Saved = true;
				}
				excelApp.Quit();
			}
			System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);

		}
Excel.Application は、VBScript では CreateObject で使用する ID です。excelApp は、dynamic 型で定義されており、excelApp.Visible = true; は、Excel が表示される事を意味します。



本来は、非表示でなければなりませんが(ユーザが直接操作するとエラーが発生します)、アプリケーション側(C#)が完成せずにテスト段階でエラーを起こしてしまうと、Excel が終了せずにメモリに残ってしまうので(その場合はタスクマネージャより終了させる)、このようにしています。

実装している機能

Excel には気の遠くなるほど、機能がたくさんあります。その中でも基本となる部分を実装しました。
1) セルへの書き込み。

2) Book を開いて、シート名の一覧をコンボボックスに表示

3) 各 シートをアクティブにする

4) Book を閉じる

5) Book を保存して閉じる

6) 最大化・最小化・標準表示
ソースコード
	public partial class Form1 : Form {

		private dynamic excelApp = null;
		private dynamic workBook = null;
		private string path = null;

		public Form1() {
			InitializeComponent();
		}

		// *********************
		// 書き込みテスト
		// *********************
		private void buttonTest_Click(object sender, EventArgs e) {

			if (workBook == null) {
				return;
			}

			// セル用変数
			dynamic cell;
			// 行と列より、セルオブジェクト(アクティブシート)
			cell = workBook.ActiveSheet.Cells(numericRow.Value, numericColumn.Value);
			// セルに値をセット
			cell.Value = textString.Text;

		}

		// *********************
		// アクティブにする
		// *********************
		private void buttonActive_Click(object sender, EventArgs e) {

			if (workBook == null) {
				return;
			}

			string sheetName = listBoxSheet.Text;
			workBook.Sheets(sheetName).Activate();

		}

		// *********************
		// 初期処理
		// *********************
		private void Form1_Load(object sender, EventArgs e) {

			excelApp = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
			excelApp.Visible = true;

		}

		// *********************
		// 終了処理
		// *********************
		private void Form1_FormClosed(object sender, FormClosedEventArgs e) {

			if (excelApp != null) {
				if (workBook != null) {
					// 保存した事にする
					workBook.Saved = true;
				}
				excelApp.Quit();
			}
			System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);

		}

		// *********************
		// ブックを開く
		// *********************
		private void 開く_Click(object sender, EventArgs e) {

			if (workBook != null) {
				MessageBox.Show(this, "ブックは一つしか開く事ができません");
				return;
			}

			path = Helper.OpenFileDialog();
			if (path != null) {
				workBook = excelApp.Workbooks.Open(path);
				listBoxSheet.Items.Clear();
				// シートの数によりループ
				for (int i = 1; i <= workBook.Sheets.Count; i++) {
					// シート名をコンボボックスにセット
					listBoxSheet.Items.Add(workBook.Sheets(i).Name);
				}
				// コンボボックスを使用可能にして
				listBoxSheet.Enabled = true;
				// 先頭を選択する
				listBoxSheet.SelectedIndex = 0;
			}

		}

		// *********************
		// 閉じる
		// *********************
		private void 閉じる_Click(object sender, EventArgs e) {

			if (workBook != null) {
				// 保存した事にする
				workBook.Saved = true;
			}
			workBook.Close();
			workBook = null;

			// クリア
			listBoxSheet.Items.Clear();
			// リストボックスを使用不可にして
			listBoxSheet.Enabled = false;
			// 選択しない
			listBoxSheet.SelectedIndex = -1;

		}

		// *********************
		// 保存して閉じる
		// *********************
		private void 保存して閉じる_Click(object sender, EventArgs e) {

			if (workBook != null) {
				workBook.Save();
			}
			workBook.Close();
			workBook = null;

			// クリア
			listBoxSheet.Items.Clear();
			// リストボックスを使用不可にして
			listBoxSheet.Enabled = false;
			// 選択しない
			listBoxSheet.SelectedIndex = -1;

		}

		// *********************
		// 最大化
		// *********************
		private void 最大化_Click(object sender, EventArgs e) {

			excelApp.WindowState = Helper.xlMaximized;

		}

		// *********************
		// 最小化
		// *********************
		private void 最小化_Click(object sender, EventArgs e) {

			excelApp.WindowState = Helper.xlMinimized;

		}

		// *********************
		// 標準
		// *********************
		private void 標準_Click(object sender, EventArgs e) {

			excelApp.WindowState = Helper.xlNormal;

		}


	}



Helpre クラス
	class Helper {

		// https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/application-object-excel
		public const int xlMaximized = -4137;
		public const int xlMinimized = -4140;
		public const int xlNormal = -4143;

		public static string OpenFileDialog() {

			OpenFileDialog ofd = new OpenFileDialog();

			ofd.Filter = "Excel(*.xls;*.xlsx;*.xlsm)|*.xls;*.xlsx;*.xlsm|すべてのファイル(*.*)|*.*";
			ofd.FilterIndex = 1;
			ofd.Title = "Excel ブックを選択してください";
			ofd.RestoreDirectory = true;

			if (ofd.ShowDialog() != DialogResult.OK) {
				return null;
			}

			return ofd.FileName;
		}
	}


関連する記事

C# : Excel を データベースとして DataGridView に読み込む



タグ:C# EXCEL
【VS(C#)の最新記事】
posted by lightbox at 2017-12-17 20:29 | Comment(0) | VS(C#) | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり