SQLの窓

2019年12月29日


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

syain.xlsx

※ Microsoft Office の Excel がインストールされている必要はありません

Microsoft.ACE.OLEDB.12.0 を使用して、OleDbConnection と OleDbCommand でデータベースとして処理します。テーブル名としては、シート名が使われますが、範囲指定して名前を定義しない限りは [シート名$] をテーブル名として使用します。( カギかっこは、Oracle で言うところのダブルクォートです )

※ ここでは : select * from [sheet1$]

Microsoft.ACE.OLEDB.12.0 がインストールされていない場合

Microsoft Access データベース エンジン 2010 再頒布可能コンポーネントをダウンロードしてインストールします。


( 32ビット版と64ビット版があるので選択してダウンロードします / ※ システム要件に 『32 ビット版の Access データベース エンジンは、Windows XP Service Pack 3 でしか使用できません』とあります。Windows7 では既にインストールされていると思われます )

▼ ダウンロードページの『インストール方法』より抜粋
OLEDB を使用するアプリケーション開発者: ConnectionString プロパティのプロバイダー引数を "Microsoft.ACE.OLEDB.12.0" に設定します。 

Microsoft Office Excel データに接続する場合は、Excel ファイル形式に基づいて OLEDB 接続文字列の適切な拡張プロパティを追加します 

ファイル形式 (拡張子)                                             拡張プロパティ
---------------------------------------------------------------------------------------------
Excel 97-2003 ブック (.xls)                                  "Excel 8.0"
Excel 2007-2010 ブック (.xlsx)                             "Excel 12.0 Xml"
Excel 2007-2010 マクロ有効ブック (.xlsm)      "Excel 12.0 Macro"
Excel 2007-2010 XML 以外のバイナリ ブック (.xlsb)      "Excel 12.0"
処理コード
using System;
using System.Data;
using System.Data.OleDb;
using System.Diagnostics;
using System.Windows.Forms;

namespace ExcelDataGridView
{
	public partial class FormExcelGridView : Form
	{

		private string path = null;

		public FormExcelGridView()
		{
			InitializeComponent();
		}

		private void loadExcelButton_Click(object sender, EventArgs e)
		{
			path = Helper.OpenFileDialog();
			if (path == null)
			{
				return;
			}

			LoadExcel();
		}

		// *********************
		// Excel の読み込み
		// *********************
		private void LoadExcel()
		{

			using (OleDbConnection myCon = new OleDbConnection())
			using (OleDbCommand myCommand = new OleDbCommand())
			{

				// SQL文字列格納用
				string myQuery = "select * from [sheet1$]";

				// 接続文字列の作成
				myCon.ConnectionString = string.Format($"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={path};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\"");
				Debug.WriteLine(myCon.ConnectionString);

				// *********************
				// 接続
				// *********************
				try
				{
					// 接続文字列を使用して接続
					myCon.Open();
					// コマンドオブジェクトに接続をセット
					myCommand.Connection = myCon;
					// コマンドを通常 SQL用に変更
					myCommand.CommandType = System.Data.CommandType.Text;
				}
				catch (Exception ex)
				{
					MessageBox.Show(this, ex.Message);
					return;
				}

				// *********************
				// 実行 SQL
				// *********************
				myCommand.CommandText = myQuery;

				// *********************
				// レコードセット取得
				// *********************
				try
				{
					using (OleDbDataReader myReader = myCommand.ExecuteReader())
					{

						DataTable dataTable = new DataTable();
						dataTable.Load(myReader);
						dataGridView.DataSource = dataTable;

						// リーダを使い終わったので閉じる
						myReader.Close();
					}
				}
				catch (Exception ex)
				{
					myCon.Close();
					MessageBox.Show(this, ex.Message);
					return;
				}

				// 接続解除
				myCon.Close();

			}   // 最外の using の終わり

			// カラム幅の自動調整
			dataGridView.AutoResizeColumns();

		}
	}
}



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;
	}
}


DataGridView のプロパティ



			// 
			// dataGridView
			// 
			this.dataGridView.AllowUserToAddRows = false;
			this.dataGridView.AllowUserToDeleteRows = false;
			this.dataGridView.AllowUserToOrderColumns = true;
			this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
			this.dataGridView.Location = new System.Drawing.Point(12, 67);
			this.dataGridView.MultiSelect = false;
			this.dataGridView.Name = "dataGridView";
			this.dataGridView.ReadOnly = true;
			this.dataGridView.RowTemplate.Height = 21;
			this.dataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
			this.dataGridView.Size = new System.Drawing.Size(776, 371);
			this.dataGridView.TabIndex = 1;


関連する記事

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

このページの PDF


posted by lightbox at 2019-12-29 00:12 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2019年12月26日


Atom、Visual Studio Code、Notepad++ をエクスプローラのフォルダの右クリックから開く為の設定

Atom は、『ファイル』=>『設定』より以下の場所にチェックする事で、Open with Atom というメニューが登録されます。



Visual Studio Code は同様のオプションがインストール時に選択できます


Notepad++ を登録するレジストリファイルは以下のようになります
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\notepadpp]
@="Notepad++"
"Icon"="\"C:\\app\\npp\\notepad++.exe\""


[HKEY_CLASSES_ROOT\Directory\Background\shell\notepadpp\command]
@="\"C:\\app\\npp\\notepad++.exe\" -openFoldersAsWorkspace \"%V\""






このページの PDF





posted by lightbox at 2019-12-26 14:37 | Visual Studio Code | このブログの読者になる | 更新情報をチェックする

SQLExpress バッチ DB バックアップ

タスクスケジューラにバッチファイルを登録して運用しています。Windows Server に登録していますが、注意するのは『開始オプション』のフィールドにバッチファイルが存在するフォルダを指定する事と、ユーザのログオンの有無にかかわらず実行可能にするという事です( 可能なら最上位の特権で )

バックアップなので、同じ PC 上に保存しても意味無いのでネットワーク上の別のサーバーへコピーしています。このバッチを2種類作り、保存フォルダも二つ作って1日おきに交互にコピーするようにしています。

backup.sql
use DB名
go
BACKUP DATABASE DB名 TO DISK = 'C:\保存場所\DB保存名.dat'
go


バッチファイル
del C:\保存場所\DB保存名.dat

sqlcmd -E -S .\SQLEXPRESS -t 3600 -i C:\batch\db\backup.sql

net use x: \\PC名\共有名 パスワード /USER:ユーザ名

copy C:\保存場所\DB保存名.dat X:\共有内保存フォルダ

net use x: /DELETE /yes

※ 3600 は タイムアウト設定

関連する情報

リストア

このページの PDF



posted by lightbox at 2019-12-26 14:05 | SQLExpress | このブログの読者になる | 更新情報をチェックする

clip.exe ( クリップボードにコマンドラインからのコマンドの出力をリダイレクトします )

使用方法は clip /? で表示されます
C:\Users\sworc>clip /?

CLIP

説明:
    コマンド ライン ツールの出力を Windows クリップボードにリダイレクトします。
    その出力されたテキストをほかのプログラムに貼り付けることができます。

パラメーター一覧:
    /?                  このヘルプを表示します。

例:
    DIR | CLIP          現在のディレクトリ一覧のコピーを Windows クリップボード
                        に貼り付けます。

    CLIP < README.TXT   readme.txt ファイルのテキストのコピーを Windows
                        クリップボードに貼り付けます。
一番有用で手近な利用方法は、レジストリに以下のように登録する事です。
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Folder\shell\flistcopy]
@="ファイル一覧をコピー"

[HKEY_CLASSES_ROOT\Folder\shell\flistcopy\command]
@="cmd.exe /c pushd \"%V\" & dir /a-d /b | sort | clip"


こうすると、フォルダを右クリックして現れる『ファイル一覧をコピー』を選択すると、そのフォルダ内の全てのファイルのみ( フォルダは排除しています )を、ファイル名のみでソートしてクリップボードにコピーします。



cmd.exe /c pushd "%V" & dir /a-d /b | sort | clip
Microsoft のドキュメント クリップ( Windows サーバー ) このページの PDF
posted by lightbox at 2019-12-26 11:21 | コマンド : コマンド | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



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

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり