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) Window の最大化・標準表示ソースコード
using System; using System.Windows.Forms; namespace ExcelBasic { public partial class Form1 : Form { // Excel アプリケーション private dynamic excelApp = null; // Excel ブック private dynamic workBook = null; // Excel のパス 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(); // 先頭へスクロール workBook.Sheets(sheetName).Range("A1").Select(); } // ********************* // 初期処理 // ********************* private void Form1_Load(object sender, EventArgs e) { // COM のロード 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; } // Helper クラスでファイルを開く path = Helper.OpenFileDialog(); if ( path != null ) { // Excel でブックを開く workBook = excelApp.Workbooks.Open(path); // リストボックス初期化 listBoxSheet.Items.Clear(); // シートの数によりループ for( int i = 1; i <= workBook.Sheets.Count; i++ ) { // シート名をリストボックスにセット listBoxSheet.Items.Add(workBook.Sheets(i).Name); // アクティブシートの場合 if (workBook.ActiveSheet.Name == workBook.Sheets(i).Name) { // 選択して listBoxSheet.SelectedIndex = i-1; // 先頭へスクロール workBook.ActiveSheet.Range("A1").Select(); } } // リストボックスを使用可能に listBoxSheet.Enabled = true; } } // ********************* // 閉じる // ********************* private void 閉じる_Click(object sender, EventArgs e) { closeExcel(1); } // ********************* // 保存して閉じる // ********************* private void 保存して閉じる_Click(object sender, EventArgs e) { closeExcel(2); } // ********************* // Excel を閉じる // ********************* private void closeExcel(int type) { if (workBook != null) { if (type == 1) { // 保存した事にする workBook.Saved = true; } if (type == 2) { // 保存 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.xlNormal; } } }
Helpre クラス
using System.Windows.Forms; namespace ExcelBasic { 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 に読み込む
|
【VS(C#)の最新記事】
- Replit : cs-list
- C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する
- C#( Form ) : ウインドウ枠の無い吹き出しの作成
- C# のタプル( Visual Studio 2017 でテスト )
- C# : インターネット上の JSON ファイルのフォーマットを クラスとして定義して1行でオブジェクト化して使用する
- C# の文法的文字列処理
- C# : System.Data.Odbc によるデータベースのテーブルからのデータ取得処理( サンプルの SQL は MySQL 用です )
- C# : Excel を データベースとして DataGridView に読み込む
- C# : フォームを表示せずに、通知領域にアイコンを表示させる常駐プログラム
- Microsoft Access に対してSQLを入力してその結果を DataGridView に表示する最も簡単なコード
- C# : System.Data.Odbc データ取得(SELECT)処理( MySQL ) : ※ using 無し( Dispose 実行 )
- C# : SQL 文を外部テキストにして、String.Format でデータ部分を置き換えて利用する
- C# コンソールアプリを AN HTTPD で実行
- C# : SQLServer( SQLExpress ) の SMO を使用してテーブルの CREATE TABLE 文 を取得する
- C# : DataGridView に TKMP.DLL の IMAP(POP3) で受信したメールを非同期に表示する( 添付ファイルも取得 )
- C# : TKMP.DLLを使った、メール送信テンプレート
- C# と VB.net : TKMP.DLL を使って IMAP でメール本文の一覧を取得する( コンソール )
- C# でDataTable と DataSource を使用して、DataGridView にデータを表示するテンプレート( 行をダブルクリックしてダイアログを表示して行データを処理 )
- (C#) / VS2010 または VS2012 : TKMP.DLL(3.1.2 または 3.1.8)を使った、『さくらインターネット』用メール送信テンプレート
- C# でDXライブラリを使って簡単なシューティングをクラス化して標準化 / メインループとプレイヤー (4)