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)



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




