74.オブジェクト向けLotusScript(十六)のHtmlレポート


需要と全体的な考え方
37.オブジェクト向けLotusScript(九)のエクスポートExcel(一)、38.オブジェクト向けLotusScript(九)のエクスポートExcel(二)から39.オブジェクト向けLotusScript(十一)の書き出しExcel(三)いくつかの記事で,筆者はMS Excelをターゲットフォーマットとしてレポートを作成することについて述べた.ほとんどの場合、これは良い選択ですが、WebページやダイナミックなNotesテーブルなど、「レポート」が他のフォーマットでより便利または適切に表示される場合もあります.理由はいろいろあるかもしれませんが、Excelソフトウェアをインストールしていないから、結果をHtmlメールに埋め込みたいから、Notesクライアントに直接見せたいまで、いろいろあります.筆者はウェブページとNotes表の2つのフォーマットを使用したことがある.
今、ページをターゲットフォーマットとしてレポートを作成するフレームワークを整理したいのですが、仕事中にこのようなニーズに遭遇する可能性があるか、興味のある友人だけに役立つことを望んでいます.整理といえば、考古学者が文献資料に基づいて歴史上の馬車鎧を複製したように、当時のコードは残っていなかったからだ.
利用するためにオブジェクト向けLotusScript(8)の継承という考え方から,筆者はまず基本的なテーブル作成クラスを抽象化し,その後HtmlやNotesリッチテキストドメインの動的テーブルを目標とした具体的な実装がこのクラスを継承する.
Public Class TableWriter
	%REM
		Description: Comments for Function
	%END REM
	Public Function WriteHeader(headers As Variant)
			
	End Function 
	
	%REM
		Description: Comments for Function
	%END REM
	Public Function WriteLine(values As Variant)
		
	End Function

	%REM
		Description: Comments for Function
	%END REM
	Public Function EndTable()	
		
	End Function	

	%REM
		Description: Finishes the report and shows it.
	%END REM
	Public Function Show()

	End Function

End Class

4つの空の関数は、それぞれ表のヘッダーを書き、表の行を書き、表を終了し、レポートを表示します.それからHTML表を書くクラスを見てみましょう.これにより、最初はHTMLのエスケープ文字、2番目はHTMLファイルがどこに作成され、自動的に開くかという2つの前置き問題が発生します.
HTMLエスケープ文字
まず最初の質問ですが、HTMLのテキストノード、つまり<>タグ以外の内容で、エスケープが必要な文字は<、>と&の3文字、<>タグ内需エスケープの文字には'と"があります.この5文字に対して、次のようなエスケープ関数を書くことができます.
Public Function HtmlEscape(source As String) As String
	Dim find(4) As String
	find(0)="&"
	find(1)=""""
	find(2)="'"
	find(3)="<"
	find(4)=">"
	Dim replacement(4) As String
	replacement(0)="&"
	replacement(1)="""
	replacement(2)="'"
	replacement(3)="<"
	replacement(4)=">"
	HtmlEscape=Replace(source, find, replacement)
End Function

レポート・ファイルの場所と自動開く
2つ目の問題は2つの点に関連している.HTMLファイルの保存場所は、呼び出されたプログラムによって指定されるべきであり、Windowsの環境ではTemp環境変数で設定できるパスなど、指定せずにデフォルトの場所を使用することも可能である.ファイルの名前は、新しいレポートが古いレポートを上書きしないように一意性を保証するために現在の時間を使用します.HTMLレポートを作成した後、ユーザーが自分から見たり、ファイルを送ったりする場合があります.例えば、添付ファイルとしてメールを送ったり、すぐにユーザーに開く場合があります.ブラウザでこれらのページを開くにはどうすればいいですか?LotusScriptが提供する外部プロセスを呼び出すShell関数が役立ちます.IEブラウザへのインストールパスにHTMLファイルパスを直接入力できます.例えば、「C:Program FilesInternet Exploreriexplore.exe C:tempreport 1.html」です.IEのインストールパスが不確定な場合や、システムのデフォルトのブラウザを使用したい場合は、Windowsのファイルマネージャプロセス「explorer.exe C:tempreport 1.html」を使用することもできます.explorer.ExceはWindowsの自動検索位置にあり、入力プログラムが存在するパスも省けます.
サンプルとコード
このようなHTMLのテーブル・レポートを呼び出すテスト・プログラムと結果を見てみましょう.
Sub Initialize
	Dim htw As New HtmlTableWriter("e:")
	Dim headers
	headers=Split("First^Second^Third^Fourth^Fifth^Sixth^Seventh", "^")
	Call htw.WriteHeader(headers)
	Dim i As Integer, j As Integer, data(6) As Long 
	For i=0 To 6
		For j=0 To 6
			data(j)=(j+1)*10^i
		Next
		Call htw.WriteLine(data)
	Next
	Dim characters
	characters=Split("~!@^#$%^&*(^)_+^<>?^'"";^:,.", "^")
	Call htw.WriteLine(characters)
	Call htw.EndTable()
	Call htw.Show()
End Sub

上のコードでは、HTMLファイルがE:ディスクの下に作成されます.表は7列あり、それぞれFirst、SecondからSeventhをタイトルとする.1行から7行のデータはサイクルで生成された数字であり、最後の行は各種記号を書き込んでエスケープの効果をテストする.末尾呼び出しレポートのShow()メソッドが即時に表示されます.
フォルダの下にある複数のレポート文を指定します.
開いているHTMLレポート
最後にこのHTMLレポートクラスのコードを見てみると、主な方法にはコメントがあります.
Public Class HtmlTableWriter As TableWriter
	Private ns As NotesStream
	Private path As String
 	
	%REM
		Description: Create a new html file in the specified folder.
		The file name consists of the current date and time.
	%END REM
	Public Sub New(folder As String )
		Dim s As New NotesSession
		Set ns=s.CreateStream()
		If folder="" Then
			path=Environ("Temp") & "\"
		Else
			Dim tmp
			tmp=Dir(folder) 'Check if the given directory exists
			path=folder
			If Right(path, 1)><"\" Then
				path=path & "\"
			End If
		End If
		path=path & Format(Today(), "yyyy-mm-dd") & " " & CDbl(Time())*86400
		path=path & ".html"
		Call ns.Open(path)
		
		Dim html As String
		html={<!doctype html><HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><TITLE> New Document </TITLE></HEAD><BODY>}
		Call ns.WriteText(html, 3)
	End Sub
	
	%REM
		Description: Write the header of the table with the given titles.
		Params: headers is a variant containing an array of titles.
	%END REM
	Public Function WriteHeader(headers As Variant)
		If Not IsArray(headers) Then Exit Function 
		Call ns.Writetext("<table border=1 cellspacing=0 style=''><thead><tr>", 3)
		ForAll h In headers
			Call ns.Writetext("<th>" & HtmlEscape(CStr(h)) & "</th>", 3)
		End ForAll
		Call ns.Writetext("</tr></thead>", 3)
	End Function
	
	%REM
		Description: Append a line to the table with the given values.
		Use HtmlEscape() to escape html charaters.
		Params: values is a variant containing an array of values to be written to the table.
	%END REM
	Public Function WriteLine(values As Variant)
		If Not IsArray(values) Then Exit Function 
		Call ns.Writetext("<tr>", 3)
		ForAll v In values
			Call ns.Writetext("<td>" & HtmlEscape(CStr(v)) & "</td>", 3)
		End ForAll
		Call ns.Writetext("</tr>", 3)
	End Function
	
	%REM
		Description: Closes the table.
	%END REM
	Public Function EndTable()
		Call ns.Writetext("</table>", 3)		
	End Function
	
	%REM
		Description: Finishes the HTML page that the table resides in.
		Use Shell() to open the page.
	%END REM
	Public Function Show()
		Call ns.Writetext("</BODY></HTML>")
		Call ns.Close()
		Dim result
		result=Shell("explorer.exe " & path)
	End Function
	
	%REM
		Description: Append some html snippets to the table.
	%END REM
	Public Function WriteHtml(html As String)
		Call ns.Writetext(html, 3)		
	End Function
	
End Class

Notesリッチテキストフィールドのダイナミックテーブル
Notesドキュメントのリッチテキストフィールドにテーブルを作成してレポートを表示するには、NotesRichTextItem、NotesRichTextNavigator、およびNotesRichTextTableのようなクラスを作成する方法を使用します.基本的な手順は、NotesRichTextItem内にNotesRichTextTableを作成し、このNotesRichTextTableを使用して新しい行を動的に追加し、NotesRichTextNavigatorでセルに順次配置し、NotesRichTextItemを呼び出します.AppendText()書き込み値.明らかに、このテーブルAPIは不器用で、実際の実行速度も速くありません.利点はサードパーティのソフトウェアを必要とせず、Lotus Notesプラットフォーム内で完全に完成することである.レポートはドキュメント形式で簡単に保存できます.読者の友人が興味を持っているか、実際に需要がある場合は、この方法を採用することができます.HtmlTableWriterと同様にTableWriterから継承されるため、共通メソッドは同じであり、呼び出し元はTableWriterの変数を宣言し、必要に応じて特定のサブクラスを作成し、その後呼び出しメソッドに違いはありません.