SQLの窓

2020年11月26日


Python : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する



pywin32 の利用

Python で Excel を扱うパッケージは openpyxl ですが、Excel の仕様に合わせてファイルを作成しているだけなので、Autofill が利用できません。そこで、ここでは pywin32 を使用して Excel.Application を直接操作します( 実行する PC は Windows で Excel がインストールされている必要があります )。

その前に pip そのものの更新確認

python -m pip install --upgrade pip
先日 pip からアップグレードしようとしたら、見事にバグって pip が無くなってしまいました。その場合は https://bootstrap.pypa.io/get-pip.py から get-pip.py をダウンロードして python get-pip.py を実行します。 それ以降、python から アップグレードするようにしています。

pywin32 のインストール

pip install pywin32
pywin32 は、Windows の COM を処理する為のブリッジです。ですから、Excel.Application に限らず 以下のようなクラスを利用できるようになります。 ✅ ADODB.Connection ✅ ADODB.Recordset ✅ ADODB.Stream ✅ WScript.Shell ✅ Shell.Application ✅ Scripting.FileSystemObject ✅ Msxml2.ServerXMLHTTPCDO.Message ✅ Scripting.Dictionary ▼ pip list

excel-autofill.py

Autofill する為に範囲を選択していますが、Sheet.Cells(1, 2) のように数字で全て表現できるようにしています。これはプログラミングを容易にする事が目的ですが、視認しやすいように Range("A1:A2") と言うような記述方法も可能です
import win32com.client
import traceback
import sys
import os

ExcelApp = win32com.client.Dispatch("Excel.Application")
# デバッグ時は、Excel の本体を表示させて状況が解るようにする
ExcelApp.Visible = True
# UI でチェックさせるようなダイアログを表示せずに実行する
ExcelApp.DisplayAlerts = False

try:
    # ****************************
    # ブック追加
    # ****************************
    Book = ExcelApp.Workbooks.Add()

    # 通常一つのシートが作成されています
    Sheet = Book.Worksheets( 1 )

    # ****************************
    # シート名変更
    # ****************************
    Sheet.Name = "Pythonの処理";

    # ****************************
    # セルに値を直接セット
    # ****************************
    for i in range(1, 11):
        Sheet.Cells(i, 1).Value = f"処理 : {i}"

    # ****************************
    # 1つのセルから
    # AutoFill で値をセット
    # ****************************
    Sheet.Cells(1, 2).Value = "子"
    # 基となるセル範囲
    SourceRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(1,2))
    # オートフィルの範囲(基となるセル範囲を含む )
    FillRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(10,2))
    SourceRange.AutoFill(FillRange)

    # ****************************
    # 保存
    # ****************************
    Book.SaveAs( os.getcwd() + "\\sample.xlsx" )

except Exception:
    ExcelApp.Quit()
    traceback.print_exc()
    sys.exit( )


ExcelApp.Quit()
print("処理を終了します")

openpyxl で Autofill 無しの処理

import openpyxl
import traceback
import sys

try:
    # ****************************
    # 新しいブックを作成
    # ****************************
    Book = openpyxl.Workbook()

    # ****************************
    # 通常一つのシートが作成されています
    # ****************************
    Sheet = Book.worksheets[0]

    # ****************************
    # シート名変更
    # ****************************
    Sheet.title = "Pythonの処理"

    # ****************************
    # セルに値を直接セット
    # ****************************
    for i in range(1, 11):
        Sheet.cell(i, 1, f"処理 : {i}")

    Sheet.merge_cells("C1:F1")
    Sheet.cell(1, 3).value = "結合されたセル"

    Book.save('sample.xlsx')

except Exception:
    traceback.print_exc()
    sys.exit( )

print("処理を終了します")

関連する記事

JScript : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する

関連する Microsoft ドキュメント

Application オブジェクト Workbook オブジェクトのコレクション Workbook オブジェクト Worksheet オブジェクトのコレクション Worksheet オブジェクト Cells プロパティ
【Pythonの最新記事】
posted by lightbox at 2020-11-26 16:03 | Python | このブログの読者になる | 更新情報をチェックする

C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する



Range オブジェクトの作成に数値を使用します

プログラミングで処理を行うので、Range("A1:A20") というような表現を使わずに、Cells(行,列) を使って Range オブジェクトを作成しています。
using System;

namespace excel_2020_11_26
{
	class Program
	{
		static void Main(string[] args)
		{
			// Excel アプリケーション
			dynamic ExcelApp = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
			// Excel のパス
			string path = Environment.CurrentDirectory + @"\sample.xlsx";

			// Excel を表示( 完成したらコメント化 )
			ExcelApp.Visible = true;
			// 警告を出さない
			ExcelApp.DisplayAlerts = false;

			try
			{
				// ****************************
				// ブック追加
				// ****************************
				dynamic Book = ExcelApp.Workbooks.Add();

				// 通常一つのシートが作成されています
				dynamic Sheet = Book.Worksheets(1);

				// ****************************
				// シート名変更
				// ****************************
				Sheet.Name = "C#の処理";

				// ****************************
				// セルに値を直接セット
				// ****************************
				for (int i = 1; i <= 10; i++)
				{
					Sheet.Cells(i, 1).Value = "処理 : " + i;
				}

				// ****************************
				// 1つのセルから
				// AutoFill で値をセット
				// ****************************
				Sheet.Cells(1,2).Value = "子";
				// 基となるセル範囲
				dynamic SourceRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(1, 2));
				// オートフィルの範囲(基となるセル範囲を含む )
				dynamic FillRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(10, 2));
				SourceRange.AutoFill(FillRange);


				// ****************************
				// 保存
				// ****************************
				Book.SaveAs(path);
			}
			catch (Exception ex)
			{
				ExcelApp.Quit();
				System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp);
				Console.WriteLine(ex.Message);
				return;
			}

			ExcelApp.Quit();
			// 解放
			System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp);

			Console.WriteLine("処理を終了します");

		}
	}
}


関連する記事

JScript : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する

関連する Microsoft ドキュメント

Application オブジェクト Workbook オブジェクトのコレクション Workbook オブジェクト Worksheet オブジェクトのコレクション Worksheet オブジェクト Cells プロパティ
posted by lightbox at 2020-11-26 13:47 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2020年11月23日


JScript : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する




Range オブジェクトの作成に数値を使用します

プログラミングで処理を行うので、Range("A1:A20") というような表現を使わずに、Cells(行,列) を使って Range オブジェクトを作成しています。
// ****************************
// 初期処理
// ****************************
WScript.Echo( "処理を開始します" );
var WshShell = new ActiveXObject("WScript.Shell");
var ExcelApp = new ActiveXObject( "Excel.Application" );

// デバッグ時は、Excel の本体を表示させて状況が解るようにする
ExcelApp.Visible = true;
// UI でチェックさせるようなダイアログを表示せずに実行する
ExcelApp.DisplayAlerts = false;

try {

	// ****************************
	// ブック追加
	// ****************************
	var Book = ExcelApp.Workbooks.Add();

	// 通常一つのシートが作成されています
	var Sheet = Book.Worksheets( 1 );

	// ****************************
	// シート名変更
	// ****************************
	Sheet.Name = "JScriptの処理";

	// ****************************
	// セルに値を直接セット
	// ****************************
	for( var i = 1; i <= 10; i++ )
	{
		Sheet.Cells(i, 1) = "処理 : " + i;
	}

	// ****************************
	// 1つのセルから
	// AutoFill で値をセット
	// ****************************
	Sheet.Cells(1, 2) = "子";
	// 基となるセル範囲
	var SourceRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(1,2));
	// オートフィルの範囲(基となるセル範囲を含む )
	var FillRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(10,2));
	SourceRange.AutoFill(FillRange);

	// ****************************
	// 保存
	// ****************************
	Book.SaveAs( WshShell.CurrentDirectory + "\\sample.xlsx" );
 
} catch (error) {
	ExcelApp.Quit();
	ExcelApp = null;
	WshShell.Popup(error.description);
	WScript.Quit();	
}

ExcelApp.Quit();
ExcelApp = null;

// ****************************
// ファイルの最後
// ****************************
WshShell.Popup("処理を終了します");

関連する記事

JScript : Visual Studio Code で、WSH を使用する準備

JScript でエラーが発生した行を知る方法

実行プログラムが cscript.exe や wscript.exe の場合、try 〜 catch 内のエラー発生の行番号を知る事ができないので、以下の手順で処理します。
1) 拡張子を hta に変更する
2) WScript を使った実行をコメントにする
3) ソースの先頭に <script> ソースの最後に </script> を記述する
4) さらにソースの先頭に <meta http-equiv="x-ua-compatible" content="ie=edge"> を記述する
5) catch の中で、error.stack を表示する
6) エクスプローラからこのソースをダブルクリックする
    ( HTML アプリケーションホストで実行させる )




.hta 用コード

<meta http-equiv="x-ua-compatible" content="ie=edge">
<script>
// ****************************
// 初期処理
// ****************************
//WScript.Echo( "処理を開始します" );
var WshShell = new ActiveXObject("WScript.Shell");
var ExcelApp = new ActiveXObject( "Excel.Application" );

// デバッグ時は、Excel の本体を表示させて状況が解るようにする
ExcelApp.Visible = true;
// UI でチェックさせるようなダイアログを表示せずに実行する
ExcelApp.DisplayAlerts = false;

try {

    // ****************************
    // ブック追加
    // ****************************
    var Book = ExcelApp.Workbooks.Add();

    // 通常一つのシートが作成されています
    var Sheet = Book.Worksheets( 1 );

    // ****************************
    // シート名変更
    // ****************************
    Sheet.Name = "JScriptの処理";

    // ****************************
    // セルに値を直接セット
    // ****************************
    for( var i = 1; i <= 10; i++ )
    {
        Sheet.Cells(i, 1) = "処理 : " + i;
    }

    // ****************************
    // 1つのセルから
    // AutoFill で値をセット
    // ****************************
    Sheet.Cells(1, 2) = "子";
    // 基となるセル範囲
    var SourceRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(1,2));
    // オートフィルの範囲(基となるセル範囲を含む )
    var FillRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(10,2));
    SourceRange.utoFill(FillRange);

    // ****************************
    // 保存
    // ****************************
    Book.SaveAs( WshShell.CurrentDirectory + "\\sample.xlsx" );


} catch (error) {
    ExcelApp.Quit();
    ExcelApp = null;
    WshShell.Popup(error.description + error.stack);
    WScript.Quit();    
}

ExcelApp.Quit();
ExcelApp = null;

// ****************************
// ファイルの最後
// ****************************
WshShell.Popup("処理を終了します");
</script>


関連する Microsoft ドキュメント

Application オブジェクト Workbook オブジェクトのコレクション Workbook オブジェクト Worksheet オブジェクトのコレクション Worksheet オブジェクト Cells プロパティ
posted by lightbox at 2020-11-23 19:47 | WSH JScript | このブログの読者になる | 更新情報をチェックする

2020年11月15日


JScript / VBScript : WEBのファイルをコマンドラインからダウンロードするスクリプト

バッチ処理に使うのであれば
cscript httpget.js "URL"
cscript httpget.vbs "URL"

対話で、エラー時にメッセージボックスが出ても良い場合は

httpget "URL"

※ URL だけを指定すると、URL の最後をファイル名としてカレントにダウンロード
※ URL の後にパスを指定するとそこへダウンロードです
( httpget "URL" "保存ファイル名のパス" )

JScript : httpget.js

// ****************************
// 初期処理
// ****************************
if ( WScript.Arguments.length == 0 ) {
	WScript.Echo( "httpget url [savepath]" );
	WScript.Quit();
}

// ****************************
// ダウンロード用のオブジェクト
// ****************************
var http = new ActiveXObject("Msxml2.ServerXMLHTTP")

// ****************************
// 第1引数は URL
// ****************************
var file;
var url = WScript.Arguments(0);
if ( WScript.Arguments.length == 1 ) {
	// 第2引数が無い場合は、URL の最後の部分
	// ( カレントにダウンロード )
	var aData = url.split("/");
	file = aData[aData.length-1];
}
else {
	// 第2引数がある場合はそれをローカルファイルとする
	file = Wscript.Arguments(1);
}

// ****************************
// ダウンロード要求
// ****************************
WScript.Echo( url );
http.open("GET", url, false );
http.send();
try {
} catch (error) {
	WScript.Echo( error.description );
	WScript.Quit();
}

if ( http.status == 404  ) {
	WScript.Echo( "URL が正しくありません(404)" );
	WScript.Quit();
}

// ****************************
// バイナリデータ保存用オブジェクト
// ****************************
var stream = new ActiveXObject("ADODB.Stream");
stream.Open();
stream.Type = 1	// バイナリ
// 戻されたバイナリをファイルとしてストリームに書き込み
stream.Write( http.responseBody );
// ファイルとして保存
stream.SaveToFile( file, 2 );
stream.Close

// ****************************
// ファイルの最後
// ****************************


VBScript : httpget.vbs

if Wscript.Arguments.Count = 0 then
	Wscript.Echo "httpget url [savepath]"
	Wscript.Quit
end if

' *****************************
' ダウンロード用のオブジェクト
' *****************************
Set objSrvHTTP = Wscript.CreateObject("Msxml2.ServerXMLHTTP")

' *****************************
' 第1引数は URL
' *****************************
strUrl = Wscript.Arguments(0)
if Wscript.Arguments.Count = 1 then
	' 第2引数が無い場合は、URL の最後の部分
	' ( カレントにダウンロード )
	aData = Split(strUrl,"/")
	strFile = aData(Ubound(aData))
else
	' 第2引数がある場合はそれをローカルファイルとする
	strFile = Wscript.Arguments(1)
end if

' *****************************
' ダウンロード要求
' *****************************
on error resume next
Call objSrvHTTP.Open("GET", strUrl, False )
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if
objSrvHTTP.Send
if Err.Number <> 0 then
	' おそらくサーバーの指定が間違っている
	Wscript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

if objSrvHTTP.status = 404 then
	Wscript.Echo "URL が正しくありません(404)"
	Wscript.Quit
end if

' *****************************
' バイナリデータ保存用オブジェクト
' *****************************
Set Stream = Wscript.CreateObject("ADODB.Stream")
Stream.Open
Stream.Type = 1	' バイナリ
' 戻されたバイナリをファイルとしてストリームに書き込み
Stream.Write objSrvHTTP.responseBody
' ファイルとして保存
Stream.SaveToFile strFile, 2
Stream.Close





posted by lightbox at 2020-11-15 21:32 | WSH JScript | このブログの読者になる | 更新情報をチェックする

JScript / VBScript : 新しい Excel の Book を作成する

サンプルは、.xlsx で保存しています

イントラネットのWEBページで利用されるテクニックの基本的な部分です。イントラネットの場合は、フォーマットを事前に作成しておくので、Excel ブックの作成を行う事は稀ですが、簡単な運用に使う場合は新規にブックが必要になると思います

※ 複数回実行すると上書きされます

昔から、Excel.Application の扱いはけっこう厄介で、実行する毎に Quit しておくとトラブルを最低限に抑える事ができます。しかし、操作方法のルールとリカバリ方法をマニュアル化しておく事が最も重要になります( トラブル時は、非表示のままメモリに残るので、タスクマネージャからタスクの終了をする必要があります )


Jscript
// ****************************
// 初期処理
// ****************************
var App = new ActiveXObject( "Excel.Application" );
var WshShell = new ActiveXObject("WScript.Shell");

App.DisplayAlerts = false;
//App.Visible = true;

// ****************************
// ブック追加
// ****************************
App.Workbooks.Add();

// ****************************
// 追加したブックを取得
// ****************************
var Book = App.Workbooks( App.Workbooks.Count  );

// ****************************
// 現状、ブックにはシート一つ
// という前提で処理していますが
// 必要であれば、Book.Worksheets.Count
// で現在のシートの数を取得できます
// ****************************
var Worksheet = Book.Worksheets( 1 );
Worksheet.Activate();

// ****************************
// Add では 第二引数に指定した
// オブジェクトのシートの直後に、
// 新しいシートを追加します。
// ****************************
Book.Worksheets.Add(null,Worksheet);

// ****************************
// シート名設定
// ****************************
Book.Sheets(1).Name = "新しい情報";
Book.Sheets(2).Name = "予備情報";

// ****************************
// 参照
// 最後の 1 は、使用するフィルター
// の番号です
// ****************************
var FilePath = App.GetSaveAsFilename(null,"Excel ファイル (*.xlsx), *.xlsx", 1);
if ( FilePath == false ) {
	WshShell.Popup( "Excel ファイルの保存選択がキャンセルされました" );
	App.Quit();
	App = null;
	WScript.Quit();
}

// ****************************
// 保存
// 拡張子を .xls で保存するには
// Call ExcelBook.SaveAs( BookPath, 56 ) とします
// ****************************
try {
    Book.SaveAs( FilePath )
    
} catch (error) {
	WshShell.Popup( "ERROR : " + error.description );
}

// ****************************
// Excel をアプリケーションとして終了
// ****************************
App.Quit();

// ****************************
// Excel を VBScript から開放
// ****************************
App = null;

// ****************************
// ファイルの最後
// ****************************



VBScript
' ****************************
' Excel オブジェクト作成
' ****************************
Set App = CreateObject("Excel.Application")

' ****************************
' 警告を出さないようにする
' ****************************
App.DisplayAlerts = False

' ****************************
' ブック追加
' ****************************
App.Workbooks.Add()

' ****************************
' 追加したブックを取得
' ****************************
Set Book = App.Workbooks( App.Workbooks.Count )

' ****************************
' 現状、ブックにはシート一つ
' という前提で処理していますが
' 必要であれば、Book.Worksheets.Count
' で現在のシートの数を取得できます
' ****************************
Set Worksheet = Book.Worksheets( 1 )
Worksheet.Activate()

' ****************************
' Add では 第二引数に指定した
' オブジェクトのシートの直後に、
' 新しいシートを追加します。
' ****************************
Call Book.Worksheets.Add(,Worksheet)

' ****************************
' シート名設定
' ****************************
Book.Sheets(1).Name = "新しい情報"
Book.Sheets(2).Name = "予備情報"

' ****************************
' 参照
' 最後の 1 は、使用するフィルター
' の番号です
' ****************************
FilePath = App.GetSaveAsFilename(,"Excel ファイル (*.xlsx), *.xlsx", 1)
if FilePath = "False" Then
	MsgBox "Excel ファイルの保存選択がキャンセルされました"
	Wscript.Quit()
End If

' ****************************
' 保存
' 拡張子を .xls で保存するには
' Call ExcelBook.SaveAs( BookPath, 56 ) とします
' ****************************
on error resume next
Book.SaveAs( FilePath )
if Err.Number <> 0 then
	MsgBox( "ERROR : " & Err.Description )
end if
on error goto 0

' ****************************
' Excel をアプリケーションとして終了
' ****************************
App.Quit()

' ****************************
' Excel を VBScript から開放
' ****************************
Set App = Nothing

' ****************************
' オブジェクト変数を初期化
' ( 初期化しないとオブジェクト扱いされる )
' ****************************
App = Empty


MsgBox( "処理が終了しました" )

Microsoft ドキュメント

Application.GetSaveAsFilename メソッド (Excel)

Application.GetOpenFilename メソッド (Excel)

Worksheets.Add メソッド (Excel)

Workbook.SaveAs メソッド (Excel)

可能列挙型 (Excel) / SaveAs メソッド で使用する定数


関連する記事

VBScript : 既存の Excel を PDF に変換する ( Excel 2007以降 )





タグ:VBScript EXCEL
posted by lightbox at 2020-11-15 17:32 | WSH JScript | このブログの読者になる | 更新情報をチェックする

2020年11月14日


IE11 を アプリケーションのプラットホームとして使う為の3つの設定

この設定を行うと、インターネットにあるページからでも、Windows のディスクやリソースに直接アクセスが可能になります( ActiveX を使用します )。よく利用されるのは、Excel へのアクセスですが、 ローカルネットワークのデータベースにもアクセスが可能です。




✅ インターネット上の任意のサイトを信頼して追加します

※ ここでは localhost です。インターネット上は 自分のサイト業務上のサイト になります

✅ ActiveX の使用を許可します( この設定で多くの処理が可能になります )

✅ 以下は ADO でのデーターベースアクセスに必要です

✅ クリップボードからの貼り付けができるのは IE11 のみです。

通常でもクリップボードへのコピーは可能で、他のブラウザでもクリップボードへのコピーは可能です。 18年前より IE を使用して、イントラネットの IIS のページ上に表示されたデータを Excel に転送して印刷に使うという処理を今も続けています。Excel でフォーマットを作っておくと、イレギュラーが発生しても Excel を直接変更すれば対応可能です。 大量な単独データが印刷が必要な場合はさすがに PDF( TCPDF ) を使用していますが、単票なら Excel に勝るものはありません。 IIS のタイムアウトを避けるような処理であれば、ADO で直接データーベースにアクセスして様々なデータをローカルに出力できます。 また、Excel のデータを複数セルでコピーして、IE11 の入力フィールドに貼り付けたり直接初期データを登録する事も可能になります。 さらにこれらのページ処理は、HTML だけで完結できる場合は拡張子を .hta として使う事もできます( 最初から HTA 目的で作成するのならば、IE11 の設定は必要ありませんが、HTA のデフォルトを最新にしておく為の META 要素が必要になります。 )
<meta http-equiv="x-ua-compatible" content="ie=edge">
❎ 注意事項として、IE11 のデフォルト状態では、VBSCript は利用できないので、VBScript が必要な場合は META 要素で IE10 以下を設定する必要があります。
<meta http-equiv="X-UA-Compatible" content="IE=8">

関連する記事

IE11 で VBScript のクラスを使用して Excel(Excel.Application) の処理を検証 HTML Application : JavaScript で新しい Excel の Book を作成する

IE11 上でコマンドプロントを模したページ

コマンドプロンプト on IE11( サイトを信頼して設定した場合 )

関連する記事

HTA / ADO / Jscript : Access( .accdb .mdb ) の読み込みと表示
タグ:HTA IE
posted by lightbox at 2020-11-14 08:23 | IE | このブログの読者になる | 更新情報をチェックする

2020年11月12日


HTA / ADO / Jscript : Access( .accdb .mdb ) の読み込みと表示

データベースは Access です。こちらからダウンロードしてください。ダウンロードして解凍した .accdb または .mdb へのパスは以下のようにしてソースコード上で固定で設定しています
 var db_path = "C:\\temp\\hanbaic.accdb";
ドライバが無い場合はこちらからダウンロードして AccessDatabaseEngine.exe を実行します ※ HTA は 32ビットです この HTA を localhost の IE11 で実行する事ができます。その場合は、IE11 の設定が必要です。その方法はこちらをご覧ください。 ※ IE11 で動かす最も大きな目的は、開発者ツールでデバッグができるからです。
<!DOCTYPE html>
<html>
<head>
<!-- edge : 主に hta 用 / VBScript を混在する場合は IE11 で IE10 ) -->
<meta http-equiv="x-ua-compatible" content="ie=edge">

<meta charset="utf-8">

<title>utf-8 ADO 問合せ処理</title>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.4.1/css/bootstrap.css">

<script>
// ***********************
// カンマ編集
// ***********************
String.prototype.number_format = 
function (prefix) {
	var num = this.valueOf();
	prefix = prefix || '';
	num += '';
	var splitStr = num.split('.');
	var splitLeft = splitStr[0];
	var splitRight = splitStr.length > 1 ? '.' + splitStr[1] : '';
	var regx = /(\d+)(\d{3})/;
	while (regx.test(splitLeft)) {
		splitLeft = splitLeft.replace(regx, '$1' + ',' + '$2');
	}
	return prefix + splitLeft + splitRight;
}
// ***********************
// カンマ編集削除
// ***********************
String.prototype.remove_number_format = 
function () {
	var num = this.valueOf();
	return num.replace(/([^0-9\.\-])/g, '');
}

// ********************************************************
// ADO オブジェクト
// 3 : クライアント側カーソル
// https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/cursorlocationenum
// ********************************************************
var cn = new ActiveXObject( "ADODB.Connection" );
cn.CursorLocation = 3;
var rs = new ActiveXObject( "ADODB.Recordset" );

// ***********************
// このパスを変更
// ***********************
var db_path = "C:\\temp\\hanbaic.accdb";
// ***********************

// ********************************************************
// https://www.microsoft.com/ja-jp/download/details.aspx?id=13255 ( ドライバ )
// 接続文字列 : ODBC用
// https://docs.microsoft.com/ja-jp/dotnet/api/system.data.odbc.odbcconnection.connectionstring
// ********************************************************
var connection_string = "Provider=MSDASQL;Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" + db_path + ";";

// ***********************
// エラー制御
// ***********************
var error_flg = false;

// ***********************
// 実行 SQL
// ***********************
var query = "select * from 社員マスタ";

$(function(){

	// **************************************
	// Windows を中央に移動
	// **************************************
	var target = window.location + "";

	if ( target.indexOf("file:") != -1 ) {

		try {
			var w = screen.width - 400;
			var h = screen.height - 200;
			top.resizeTo( w, h );
			top.moveTo((screen.width-w)/2, (screen.height-h)/2 );
		}
		catch( e ) {}

	}

	// **************************************
	// ADO 処理( ここから )
	// **************************************
	try {
		// ***********************
		// DB 接続
		// ***********************
		cn.open( connection_string );
	}
	catch (e) {
		error_flg = true;
		alert(e.description);
	}
	
	if ( error_flg ) {
		return;
	}

	try {
		// ***********************
		// レコードセット取得
		// ***********************
		rs.open( query, cn );
	}
	catch (e) {
		error_flg = true;
		alert(e.description);
	}

	var table_body = $("#tbl");
	var row_unit = $("<tr></tr>");

	// ***********************
	// タイトル部用、列名取得
	// ***********************
	for( loop_idx = 0; loop_idx < rs.fields.count; loop_idx++ ) {
		$("<th></th>")
			.text( rs.fields(loop_idx).name )
			.appendTo( row_unit );
	}
	row_unit.appendTo( table_body );


	// ***********************
	// 行取得ループ
	// ***********************
	while( !rs.EOF ) {

		// 行オブジェクト
		row_unit = $("<tr></tr>");
		
		// *********************************************
		// 列オブジェクトを作成して行オブジェクトに追加
		// *********************************************
		$("<td></td>")
			.text( rs.fields("社員コード").value )
			.appendTo( row_unit );

		$("<td></td>")
			.text( rs.fields("氏名").value )
			.appendTo( row_unit );

		$("<td></td>")
			.text( rs.fields("フリガナ").value )
			.appendTo( row_unit );

		$("<td></td>")
			.text( rs.fields("所属").value )
			.appendTo( row_unit );

		$("<td></td>")
			.text( rs.fields("性別").value )
			.appendTo( row_unit );
			
		date_work = new Date( rs.fields("作成日").value );
		date_string = date_work.getFullYear() + "/" + (date_work.getMonth()+1) + "/" + date_work.getDate();
		$("<td></td>")
			.text( date_string )
			.appendTo( row_unit );

		date_work = new Date( rs.fields("更新日").value );
		date_string = date_work.getFullYear() + "/" + (date_work.getMonth()+1) + "/" + date_work.getDate();
		$("<td></td>")
			.text( date_string )
			.appendTo( row_unit );


		$("<td></td>")
			.text( rs.fields("給与").value )
			.appendTo( row_unit );

		$("<td></td>")
			.text( rs.fields("手当").value )
			.appendTo( row_unit );

		$("<td></td>")
			.text( rs.fields("管理者").value )
			.appendTo( row_unit );
			
		date_work = new Date( rs.fields("生年月日").value );
		date_string = date_work.getFullYear() + "/" + (date_work.getMonth()+1) + "/" + date_work.getDate();
		$("<td></td>")
			.text( date_string )
			.appendTo( row_unit );

		// 行オブジェクトを テーブルオブジェクトに追加
		row_unit.appendTo( table_body );

		// ***********************
		// 次の行を取得
		// ***********************
		rs.MoveNext();
	}
	
	// ***********************
	// レコードセットを閉じる
	// ***********************
	rs.close();

	// ***********************
	// 接続解除
	// ***********************
	cn.close();

	// ***********************
	// オブジェクトの解放
	// ***********************
	cn = null;
	// **************************************
	// ADO 処理( ここまで )
	// **************************************


	// **************************************
	// テーブルに対する処理
	// **************************************
	$("#tbl tr").each(function(idx){

		// **************************************
		// イベント登録
		// **************************************
		$(this).on("dblclick", function(idx){

			var text = "";

			$(this).find("td").each(function(idx){
				console.log( idx + ":" + $(this).text() );

				if ( idx == 7 || idx == 8 ) {
					text += idx + ":" + ($(this).text()).remove_number_format() + " ";
				}
				else {
					text += idx + ":" + $(this).text() + " ";
				}
			});

			$("#result").text( text );

		});

		// **************************************
		// データ部分のフォーマットと右寄せ
		// **************************************
		$(this).find("td").each(function(idx){

			switch( idx ) {
				case 7:
					$(this).css({"text-align": "right" });
					$(this).text( ($(this).text()).number_format() );
					break;
				case 8:
					$(this).css({"text-align": "right" });
					$(this).text( ($(this).text()).number_format() );
					break;
			}

		});

		// **************************************
		// タイトル部分の右寄せ
		// **************************************
		$(this).find("th").each(function(idx){

			switch( idx ) {
				case 7:
					$(this).css({"text-align": "right" });
					break;
				case 8:
					$(this).css({"text-align": "right" });
					break;
			}

		});

	});
	// **************************************
	// テーブルに対する処理
	// **************************************


});

</script>

<style>
/* ****************************
1) 列のカーソルは常に矢
2) 改行コードを有効
******************************/
td,th {
	cursor: default!important;
	white-space: pre;
}

body {
	margin: 0;
	padding: 16px;
}

/* ****************************
テーブル内のデータを選択不可
( ダブルクリック対応 )
******************************/
#tbl {
	user-select: none;
	-moz-user-select: none;
	-webkit-user-select: none;
	-ms-user-select: none;
}

/* ****************************
スクロール無しの状態時の
最上部にデータ表示場所を用意
******************************/
table {
	margin-top: 36px;
}

/* ****************************
ダブルクリック時に内容を表示
するブロックの表示方法
******************************/
#result {
	font-weight: bold;	/* 太文字 */
	color: navy;	/* 文字色 */
	position: fixed;	/* 表示位置固定 */
	height: 34px;	/* ブロック高さ */
	background-color: #fff;	/* ブロック背景色 */
	padding: 5px;	/* ブロック内側余白 */
}

</style>
</head>
<body>

	<!-- ダブルクリックの結果を表示する / fixed で位置固定 -->
	<div id="result"></div>

	<table class="table table-hover">
		<!-- bootstrap 対応の為、tbody に対して処理 -->
		<tbody id="tbl">
		</tbody>
	</table>

</body>
</html>


以下は、列情報を自動取得しています
( ※ 自由な SELECT 文で表示可能です )
<!DOCTYPE html>
<html>
<head>
<!-- edge : 主に hta 用 / VBScript を混在する場合は IE11 で IE10 ) -->
<meta http-equiv="x-ua-compatible" content="ie=edge">

<meta charset="utf-8">

<title>utf-8 ADO 問合せ処理</title>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.4.1/css/bootstrap.css">

<script>
// ***********************
// カンマ編集
// ***********************
String.prototype.number_format = 
function (prefix) {
	var num = this.valueOf();
	prefix = prefix || '';
	num += '';
	var splitStr = num.split('.');
	var splitLeft = splitStr[0];
	var splitRight = splitStr.length > 1 ? '.' + splitStr[1] : '';
	var regx = /(\d+)(\d{3})/;
	while (regx.test(splitLeft)) {
		splitLeft = splitLeft.replace(regx, '$1' + ',' + '$2');
	}
	return prefix + splitLeft + splitRight;
}
// ***********************
// カンマ編集削除
// ***********************
String.prototype.remove_number_format = 
function () {
	var num = this.valueOf();
	return num.replace(/([^0-9\.\-])/g, '');
}

// ********************************************************
// ADO オブジェクト
// 3 : クライアント側カーソル
// https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/cursorlocationenum
// ********************************************************
var cn = new ActiveXObject( "ADODB.Connection" );
cn.CursorLocation = 3;
var rs = new ActiveXObject( "ADODB.Recordset" );

// ***********************
// このパスを変更
// ***********************
var db_path = "C:\\temp\\hanbaic.accdb";
// ***********************

// ********************************************************
// https://www.microsoft.com/ja-jp/download/details.aspx?id=13255 ( ドライバ )
// 接続文字列 : ODBC用
// https://docs.microsoft.com/ja-jp/dotnet/api/system.data.odbc.odbcconnection.connectionstring
// ********************************************************
var connection_string = "Provider=MSDASQL;Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" + db_path + ";";

// ***********************
// エラー制御
// ***********************
var error_flg = false;

// ***********************
// 実行 SQL
// ***********************
var query = "select * from 得意先マスタ";

$(function(){

	// **************************************
	// Windows を中央に移動
	// **************************************
	var target = window.location + "";

	if ( target.indexOf("file:") != -1 ) {

		try {
			var w = screen.width - 400;
			var h = screen.height - 200;
			top.resizeTo( w, h );
			top.moveTo((screen.width-w)/2, (screen.height-h)/2 );
		}
		catch( e ) {}

	}

	// **************************************
	// ADO 処理( ここから )
	// **************************************
	try {
		// ***********************
		// DB 接続
		// ***********************
		cn.open( connection_string );
	}
	catch (e) {
		error_flg = true;
		alert(e.description);
	}
	
	if ( error_flg ) {
		return;
	}

	try {
		// ***********************
		// レコードセット取得
		// ***********************
		rs.open( query, cn );
	}
	catch (e) {
		error_flg = true;
		alert(e.description);
	}

	var table_body = $("#tbl");
	var row_unit = $("<tr></tr>");

	var typeArray = [];

	// ***********************
	// タイトル部用、列名取得
	// ***********************
	for( loop_idx = 0; loop_idx < rs.fields.count; loop_idx++ ) {
		$("<th></th>")
			.text( rs.fields(loop_idx).name )
			.appendTo( row_unit );
		typeArray.push( rs.fields(loop_idx).type );
	}
	row_unit.appendTo( table_body );


	// ***********************
	// 行取得ループ
	// データ型
	// https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/datatypeenum
	// ***********************
	while( !rs.EOF ) {

		// 行オブジェクト
		row_unit = $("<tr></tr>");
		for( loop_idx = 0; loop_idx < rs.fields.count; loop_idx++ ) {
			if( typeArray[loop_idx] == 133 || typeArray[loop_idx] == 135 ) {
				var date_work = new Date( rs.fields(rs.fields(loop_idx).name).value );
				var date_string = date_work.getFullYear() + "/" + (date_work.getMonth()+1) + "/" + date_work.getDate();
				$("<td></td>")
					.text( date_string )
					.appendTo( row_unit );
			}
			else {
				$("<td></td>")
				.text( rs.fields(rs.fields(loop_idx).name).value )
				.appendTo( row_unit );
			}
		}
		row_unit.appendTo( table_body );

		// ***********************
		// 次の行を取得
		// ***********************
		rs.MoveNext();
	}
	
	// ***********************
	// レコードセットを閉じる
	// ***********************
	rs.close();

	// ***********************
	// 接続解除
	// ***********************
	cn.close();

	// ***********************
	// オブジェクトの解放
	// ***********************
	cn = null;
	// **************************************
	// ADO 処理( ここまで )
	// **************************************


	// **************************************
	// テーブルに対する処理
	// **************************************
	$("#tbl tr").each(function(idx){

		// **************************************
		// イベント登録
		// **************************************
		$(this).on("dblclick", function(idx){

			var text = "";

			$(this).find("td").each(function(idx){
				console.log( idx + ":" + $(this).text() );
				text += idx + ":" + $(this).text() + " ";
			});

			$("#result").text( text );

		});

		// **************************************
		// データ部分のフォーマットと右寄せ
		// **************************************
		$(this).find("td").each(function(idx){

			if ( typeArray[idx] == 3 ) {
				$(this).css({"text-align": "right" });
				$(this).text( ($(this).text()).number_format() );
			} 

		});

		// **************************************
		// タイトル部分の右寄せ
		// **************************************
		$(this).find("th").each(function(idx){

			if ( typeArray[idx] == 3 ) {
				$(this).css({"text-align": "right" });
			}

		});

	});
	// **************************************
	// テーブルに対する処理
	// **************************************


});

</script>

<style>
/* ****************************
1) 列のカーソルは常に矢
2) 改行コードを有効
******************************/
td,th {
	cursor: default!important;
	white-space: pre;
}

body {
	margin: 0;
	padding: 16px;
}

/* ****************************
テーブル内のデータを選択不可
( ダブルクリック対応 )
******************************/
#tbl {
	user-select: none;
	-moz-user-select: none;
	-webkit-user-select: none;
	-ms-user-select: none;
}

/* ****************************
スクロール無しの状態時の
最上部にデータ表示場所を用意
******************************/
table {
	margin-top: 36px;
}

/* ****************************
ダブルクリック時に内容を表示
するブロックの表示方法
******************************/
#result {
	font-weight: bold;	/* 太文字 */
	color: navy;	/* 文字色 */
	position: fixed;	/* 表示位置固定 */
	height: 34px;	/* ブロック高さ */
	background-color: #fff;	/* ブロック背景色 */
	padding: 5px;	/* ブロック内側余白 */
}

</style>
</head>
<body>

	<!-- ダブルクリックの結果を表示する / fixed で位置固定 -->
	<div id="result"></div>

	<table class="table table-hover">
		<!-- bootstrap 対応の為、tbody に対して処理 -->
		<tbody id="tbl">
		</tbody>
	</table>

</body>
</html>




タグ:HTA IE
posted by lightbox at 2020-11-12 15:20 | HTA ( HTMLアプリケーション ) | このブログの読者になる | 更新情報をチェックする

2020年11月02日


ロリポップ用ログインブックマークレット( ユーザ専用ページ・phpMyAdmin・WEBメーラ )

※ パスワード等の情報をブラウザに保存するので、自宅の PC で利用してくださいユーザ専用ページphpMyAdminWEBメーラ

ユーザ専用ページ

ドメインID は自分のアカウントです。ドメイン番号は、ロリポップで選んだ自分のドメインをコンボボックスで選択して Chrome の コンソールで以下のように入力してください
$("#domain-id").val()
※ 画像の例ですと、410 をドメイン番号と差し替えます
javascript:$("input[name='account']").val("ドメインID");$('#domain-id').val(ドメイン番号);$("input[name='passwd']").val("パスワード");jf_Login();

出来上がったコードを ブックマークバーに適当に作成したブックマークの URL に入力すると使用可能になります

phpMyAdmin

アカウント文字列は ユーザー名( DB ページでの呼び名 )です。サーバの選択は自分のサーバをコンボボックスで選択して Chrome の コンソールで以下のように入力してください
$("#select_server").val()
※ 画像の例ですと、192 をサーバー番号と差し替えます
javascript:$('#select_server').val(サーバー番号);$('#input_username').val("アカウント文字列");$('#input_password').val("パスワード");$('#input_go').click();

WEBメーラ

javascript:document.getElementsByName("mail_add")[0].value="メールアドレス";document.getElementsByName("mail_pass")[0].value="パスワード";jf_LoginMail();




posted by lightbox at 2020-11-02 10:46 | Pleiades | このブログの読者になる | 更新情報をチェックする

2020年10月27日


Java : WEB上のテキストファイルを取得する

キャラクタセットを指定してテキストとして取得

テキストファイルの入出力はこちらを参照して下さい。 InputStream の扱いはテキストファイルを基本に考えれば良いと思います。 WEB 上のデータも結局 InputStream で取得しています。
import java.net.*;
import java.io.*;

public class Main {

	public static void main(String[] args) {

		try {

			// 書き込みファイル名
			String filename = "index.html";
			// テキストで書き込み為の俊美
			BufferedWriter bw = new BufferedWriter(
					new OutputStreamWriter(
						new FileOutputStream(filename), "UTF8"
					) 
			);			

			// URL文字列
			String str = "https://lightbox.sakura.ne.jp/demo/template/basic/basic-html/req/basic-req-2div.html";
			// ターゲット
			URL url = new URL( str );
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			// GET メソッド 
			http.setRequestMethod("GET");
			// 接続 
			http.connect();
			 
			// UTF-8 でリーダーを作成
			InputStreamReader isr = new InputStreamReader(http.getInputStream(), "utf8");   
			// 行単位で読み込む為の準備   
			BufferedReader br = new BufferedReader(isr);   
			String line_buffer;   
			// BufferedReader は、readLine が null を返すと読み込み終了   
			while ( null != (line_buffer = br.readLine() ) ) {   
				// 書き込み
				bw.write( line_buffer + "\r\n" );
			}
 
			// 閉じる   
			br.close();		// BufferedReader
			isr.close();	// InputStreamReader
			http.disconnect();		// HttpURLConnection
			bw.close();		// BufferedWriter

		}
		catch( Exception e ) {
			System.out.println( e.getMessage() );
		}
	}
}

バイナリデータとしてそのままファイル化したものを使う

単純にダウンロードするだけならば、キャラクタセットを考慮する必要はありません
import java.net.*;
import java.io.*;
import java.util.*;

public class Main {

	public static void main(String[] args) {

		byte[] buffer = new byte[4096];
		int readByte = 0;

		try {
			// ターゲット
			URL url = new URL("https://lightbox.sakura.ne.jp/demo/template/basic/basic-html/req/basic-req-2div.html");
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			// GET メソッド 
			http.setRequestMethod("GET");
			// 接続 
			http.connect();
			
			DataOutputStream dataOutStream =
			new DataOutputStream(
				new BufferedOutputStream(
					new FileOutputStream("index.html")));			

			BufferedInputStream bis = new BufferedInputStream( http.getInputStream() );   
			// バイトでの読込み 
			DataInputStream dis = new DataInputStream(bis);   

			while ( -1 != (readByte = dis.read(buffer) ) ) {   
				// コマンドプロンプトに表示   
				dataOutStream.write(buffer, 0, readByte);
			}

			// 各々受け持ちクラスを閉じる   
			dis.close();
			bis.close();
			
			dataOutStream.close();

			http.disconnect();
		}
		catch( Exception e ) {
			
		}
	}
}



関連するドキュメント

サポートされるエンコーディング ( JDK 11 )
posted by lightbox at 2020-10-27 21:44 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

Java : テキストファイルの入出力



SHIFT_JIS で入力して UTF8N(UTF8) と EUC-JP で出力します

Java のテキストファイル入力は、3つのクラスを1セットで使用します FileInputStream( バイトストリーム ) ▼ InputStreamReader( キャラクタセット処理 ) ▼ BufferedReader ( 行単位で処理する ) ※ 有効なキャラクタセットはこちら 書き込みで UTF8 を指定すると、いわゆる UTF8N になりますので、 BOM( EF BB BF ) が必要な場合は、事前に自分で FileOutputStream を使用して書き込みます
package lightbox;

import java.io.*;

//*****************************************************
// サンプルテストクラス
//*****************************************************
public class Main {

	//*************************************************
	// ●● テキストファイル処理 ●●
	// 
	// 【1】FileInputStream(String name) で
	// ( InputStream => FileInputStream )
	// InputStream を作成し、
	//
	// 【2】InputStreamReader(InputStream in, String charsetName)
	// ( Reader => InputStreamReader )
	// で Reader を作成し
	//
	// 【3】BufferedReader(Reader in) に渡す
	//*************************************************
    public static void main(String[] args) {

		System.out.println("処理開始");

		String targetFile = "readme.txt";
		String resultFile_utf8n = "readme.utf8n.txt";
		String resultFile_utf8 = "readme.utf8.txt";
		String resultFile_ujis = "readme.ujis.txt";

		try {

			// 生のバイトのストリーム
			// キャラクタセットを指定して読み込む為に、使用する
			// ↓【readme.txt】
			FileInputStream fis = new FileInputStream(targetFile);

			// SHIFT_JIS として読み込む為の準備
			// ↓【 FileInputStream】
			InputStreamReader isr = new InputStreamReader(fis, "ms932");

			// 行単位で読み込む為の準備
			BufferedReader br = new BufferedReader(isr);

			String line_buffer;

			// BufferedReader は、readLine が null を返すと読み込み終了
			while ( null != (line_buffer = br.readLine() ) ) {
				// コマンドプロンプトに表示
				System.out.println(line_buffer);
			}

			// 各々受け持ちクラスを閉じる
			br.close();
			isr.close();
			fis.close();


			// *******************************************************
			// ※ "UTF8" で、UTF8N になります
			// UTF8N に変換の為、再度同じファイルを入力
			// 今度は入力は変数を使わずに書く
			// *******************************************************
			br = new BufferedReader(
					new InputStreamReader(
						new FileInputStream(targetFile), "ms932"
					) 
			);
			// *******************************************************
			// UTF8N 用の書き込み用のインスタンスを同様に作成
			// *******************************************************
			BufferedWriter bw = new BufferedWriter(
					new OutputStreamWriter(
						new FileOutputStream(resultFile_utf8n), "utf8"
					) 
			);

			while ( null != (line_buffer = br.readLine() ) ) {
				// CrLf にするには、その通りに書き込む
				bw.write( line_buffer + "\r\n" );
			}
			bw.close();
			br.close();


			// *******************************************************
			// BOM( EF BB BF ) 付きにするには自分で先に書き出す
			// *******************************************************
			br = new BufferedReader(
					new InputStreamReader(
						new FileInputStream(targetFile), "ms932"
					) 
			);
			FileOutputStream fos = new FileOutputStream(resultFile_utf8);
			fos.write( 0xef );
			fos.write( 0xbb );
			fos.write( 0xbf );
			bw = new BufferedWriter(
					new OutputStreamWriter(
						fos, "utf8"
					) 
			);

			while ( null != (line_buffer = br.readLine() ) ) {
				// CrLf にするには、その通りに書き込む
				bw.write( line_buffer + "\r\n" );
			}
			bw.close();
			fos.close();
			br.close();


			// *******************************************************
			// EUC-JP に変換の為、再度同じファイルを入力
			// *******************************************************
			br = new BufferedReader(
					new InputStreamReader(
						new FileInputStream(targetFile), "ms932"
					) 
			);
			// *******************************************************
			// EUC-JP にするには "EUC_JP" でも "EUC-JP" OK
			// *******************************************************
			bw = new BufferedWriter(
					new OutputStreamWriter(
						new FileOutputStream(resultFile_ujis), "euc-jp"
					) 
			);

			while ( null != (line_buffer = br.readLine() ) ) {
				bw.write( line_buffer + "\r\n" );
			}
			bw.close();
			br.close();

		}
		catch( Exception e  ) {
			System.out.println(e.getMessage());
		}

		System.out.println("処理終了");


	}

}





posted by lightbox at 2020-10-27 18:59 | java : テキストファイル | このブログの読者になる | 更新情報をチェックする

2020年10月18日


Java11 + Visual Studio Code + JavaMail( with JavaBeans Activation Framework )

Java Extension Pack をインストール後 Java11 へパスを通しています

詳細に JSK の参照を設定するには、Java: Configure Java Runtime で設定画面を表示させます。 JavaMail JavaBeans Activation Framework Java11 で JavaMail を使用するには、JavaBeans Activation Framework を参照する必要があります。しかし Maven を使用すれば、使用する JDK を選択して JavaBeans Activation Framework なしで実行可能です。 Maven を使用する場合は、ダウンロードしてパスを通したうえに、JAVA_HOME に JDK のバスを設定する必要があります。

🔻 Java: Configure Java Runtime

Getting Started with Java in VS Code 参考1) Visual Studio Code で Java + Maven 環境を設定してデバッグ実行する 参考2) VSCodeでMavenプロジェクトをデバッグする
import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.internet.*;

public class Main {

	// *******************************************
	// エントリポイント
	// *******************************************
	public static void main(String[] args) {
		new Main();
	}

	// *******************************************
	// コンストラクタ
	// *******************************************
	public Main() {
		my_acton();
	}

	// *******************************************
	// 初期処理
	// *******************************************
	private void my_acton() {

		// 通常入力用
		Scanner scan = new Scanner(System.in);
		// パスワード入力用
		Console console = System.console();

		MyTool out = new MyTool( ">>>" );
		out.println("処理開始");

		// アカウント入力
		out.println("アカウントの入力");
		String user = scan.nextLine();
		if ( user.equals("") ) {
			out.println( "処理を途中で終了します" );
			return;
		}
		out.println( user );

		// パスワード入力
		char[] pass = console.readPassword( "パスワードを入力してください : " );
		String password = new String( pass );

		// 宛先入力
		out.println("宛先の入力");
		String to = scan.nextLine();
		out.println( to );


		// *******************************************
		// プロパティオブジェクトを作成
		// プロパティオブジェクトは、
		// extends Hashtable(連想配列)
		// *******************************************
		Properties props = new Properties();
	
		// *******************************************
		// ( Gmail では、安全性の低いアプリのアクセスを有効にする必要があります )
		// ▼ G Suite では、安全性の低いアプリのアクセスは使用できません
		// https://gsuiteupdates-ja.googleblog.com/2019/12/g-suite_24.html
		// *******************************************
		props.put("mail.smtp.host","smtp.lolipop.jp");	// ロリポップ
//		props.put("mail.smtp.host","smtp.mail.yahoo.co.jp");	// Yahoo!
//		props.put("mail.smtp.host","smtp.gmail.com");	// Gmail
		
		props.put("mail.smtp.auth", "true" );	// SMTP 認証を行う

		// ▼ 465( SSL )
		props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
		props.put("mail.smtp.socketFactory.fallback", "false");
		props.put("mail.smtp.socketFactory.port", "465");

		// *******************************************
		// メール用のセッションを作成
		// *******************************************
		SimpleAuthenticator sa =
			new SimpleAuthenticator( user , password );
		Session MailSession = 
			Session.getInstance( props, sa );
	
		try {
	
			// *******************************************
			// メール用のメッセージオブジェクトを作成
			// *******************************************
			MimeMessage msg = new MimeMessage(MailSession);
	
			// *******************************************
			// 宛先
			// *******************************************
			msg.setRecipients(
				Message.RecipientType.TO, String.format("%s <%s>",
				MimeUtility.encodeText(
					"あなた",
					"iso-2022-jp",
					"B"
				), to )
			);
	
			// *******************************************
			// 送信者
			// *******************************************
			msg.setFrom(
				new InternetAddress( String.format("%s <%s>",
				MimeUtility.encodeText(
					"わたし",
					"iso-2022-jp",
					"B"
				), user )  )
			);
	
			// *******************************************
			// 件名
			// *******************************************
			msg.setSubject(
				MimeUtility.encodeText(
					"日本語件名",
					"iso-2022-jp",
					"B"
				)
			);
	
			// *******************************************
			// 本文
			// *******************************************
			msg.setContent(
				"本文\r\n本文",
				"text/plain; charset=\"iso-2022-jp\""
			);
	
			// *******************************************
			// 送信
			// *******************************************
			Transport.send( msg );
	
		}
		catch (Exception e) {
			out.println( e.getMessage() );
			out.println("送信エラー");
		}

		out.println("処理終了");

	}

	// *******************************************
	// 内部用クラス
	// *******************************************
	private class MyTool {

		private String mark = null;

		MyTool(String pm) {
			mark = pm;
		}

		public void println(String str) {
			System.out.println( this.mark + str );
		}

	}

	// ***********************************************
	// 認証用のプライベートクラス
	// ***********************************************
	private class SimpleAuthenticator extends Authenticator {
	
		private String user_string = null;
		private String pass_string = null;
	
		public SimpleAuthenticator( String user_s, String pass_s ) {
			super();
			user_string = user_s;
			pass_string = pass_s;
		}
	
		protected PasswordAuthentication getPasswordAuthentication(){
			return new PasswordAuthentication( this.user_string, this.pass_string );
		}
	}

}


JavaMail API documentation

安全性の低いアプリによる G Suite アカウントへの接続が無効に



posted by lightbox at 2020-10-18 16:57 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

2020年10月13日


clipboard.js を使用してテキストをコピーする際に clipboard.js が必要とするパーツと意味

配布ページの説明では、『トリガー要素にdata-clipboard-target属性を追加します。』とありますが、ここではトリガー要素であるボタンのコンテナである div 要素に設定しています。

Advanced Usage では、トリガー要素を直接指定してトリガーの処理の後に、new ClipboardJS であらかじめ作成されたイベントより return される文字列をクリップボードに送る事ができます。
<script>
var clipbpardText = "";

$(function(){
	var clipboard = new ClipboardJS('#button1' , {
		text: function(trigger) {
			return clipbpardText;
		}
	});

	clipboard.on('success', function(e) {
		alert("クリップボードにコピーしました");
	});

	$("#button1").on("click", function(){
		clipbpardText = $("#text").val();
	})
});
</script>
<textarea id="text"></textarea>
<button type="button" id="button1">実行</button>
以下では、new ClipboardJS('.clipboard'); で作成されたオブジェクトは、処理が成功した時のイベントの使用方法として実装していますが、作業の妨げになるのであれば削除したほうがいいでしょう。

#src_clipboard の div は、画面外に作成したテキストの一時置き場です。clipboard.js は常にここからテキストを取得してクリップボードに渡します。この手法は、clipboard.js が内部でも使っている手法です。
<!DOCTYPE html>
<html>
<head>
<title>clipboard.js</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js" integrity="sha512-hDWGyh+Iy4Mr9AHOzUP2+Y0iVPn/BwxxaoSleEjH/i1o4EVTF/sh0/A1Syii8PWOae+uPr+T/KHwynoebSuAhw==" crossorigin="anonymous"></script>
<script>
$(function () {

	// **********************************************************************
	// オブジェクトや内部イベントの構築
	// ▼ 内部イベントのパーツ
	// class に clipboard を持つコンテナ内でイベントが起きた時
	// data-clipboard-target の内容の中にあるテキストを取り出してコピーする
	// コンテナ内のイベントが終わってから処理されるので、
	// イベント内で data-clipboard-target の中に必要なテキストをセットする
	// **********************************************************************
	var clipboard = new ClipboardJS('.clipboard');

	// コピー完了後の処理( 無くてもよい )
	clipboard.on('success', function(e) {
		alert("クリップボードにコピーしました");
	});

	// クリップボードにコピーを実行する
	$("#btn").on("click", function(){
		$("#src_clipboard").text( $("textarea").val() );
	});

});
</script>

<style>
html, body {
	height:100%;
}
textarea {
	width: 800px;
	height: calc(100% - 100px);
	font-size: 18px;
	font-weight: 600;
}
#src_clipboard {
	position:absolute;
	left:-1000px;
	width:900px;
	white-space:pre-wrap;
	word-wrap:break-word;
}
</style>
</head>
<body>
<div id="src_clipboard"></div>
<div class="clipboard" data-clipboard-target="#src_clipboard">
	<input type="button" value="コピー" id="btn">
</div>
<textarea></textarea>
</body>
</html>



posted by lightbox at 2020-10-13 19:20 | JavaScript ライブラリ | このブログの読者になる | 更新情報をチェックする
container 終わり



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

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