ExcelVBAでテンプレートを使う

转载 2012年07月16日 13:24:36

VBAでもテンプレートエンジンがあるか調べてみた。

あった。MiniTemplator

機能が限定されているので使いやすい。

テンプレートを使ってJavaのVOを生成するVBAサンプルを作ってみた。

ちなみにExcel2003で動作確認し、参照設定でMicrosoft Scripting Runtime、Microsoft ActiveX Data Object 2.8 Libraryを追加した。

package ${Package};
<!-- $BeginBlock ForeachImport -->
import ${Import};<!-- $EndBlock ForeachImport -->

/**
 * ${ClassName}。
 *
 * @author kgu
 */
public class ${Class} {
	<!-- $BeginBlock ForeachField -->
	/**
	 * ${FieldName}。
	 */
	private ${Type_} ${Field}${=Default};
	<!-- $EndBlock ForeachField -->
	<!-- $BeginBlock ForeachGetterSetter -->
	/**
	 * ${FieldName}を取得する。
	 *
	 * @return ${FieldName}
	 */
	public ${Type_} ${Getter}() {
		return ${Field};
	}

	/**
	 * ${FieldName}を設定する。
	 *
	 * @param ${Field} ${FieldName}
	 */
	public void ${Setter}(${Type_} ${Field}) {
		this.${Field} = ${Field};
	}
	<!-- $EndBlock ForeachGetterSetter -->
}
  • VO定義書イメージ

f:id:kgu:20100329230627j:image

Option Explicit

Sub CreateVO()
'------------------------------------------------------------------------------
' 定義シートからJavaのVOを生成するVBA。
'------------------------------------------------------------------------------
On Error GoTo Err_Lbl

    Dim Package As String 'パッケージ名
    Dim Import As String '型パッケージ
    Dim ClassName As String 'クラス論理名
    Dim Class As String 'クラス物理名
    Dim FieldName As String 'メンバ変数論理名
    Dim Type_ As String '型
    Dim Field As String 'メンバ変数物理名
    Dim Default As String 'デフォルト値
    Dim Getter As String 'ゲッターメソッド
    Dim Setter As String 'セッターメソッド
    
    Dim Row As Integer '行番号
    
    Dim Templator As New MiniTemplator 'テンプレートエンジン
    Dim FileObject As New ADODB.Stream 'ファイルオブジェクト
    Dim ImportMap As New Scripting.Dictionary '型パッケージ重複チェック用連想配列
    
    With ActiveSheet 'アクティブシートが処理対象
        'テンプレート埋め込みデータを取得
        Package = .Cells(1, 2)
        Class = .Cells(2, 2)
        ClassName = .Cells(2, 4)
        'テンプレートファイル読み込み
        Templator.ReadTemplateFromFile ThisWorkbook.Path & "\" & "VOTemplate.txt"
        'テンプレートファイルの${変数}にデータをセット
        Templator.SetVariable "Package", Package
        Templator.SetVariable "Class", Class
        Templator.SetVariable "ClassName", ClassName
    
        Row = 4 '処理開始行
        While .Cells(Row, 1) <> ""
            'テンプレート埋め込みデータを取得
            Field = .Cells(Row, 1)
            FieldName = .Cells(Row, 2)
            Type_ = .Cells(Row, 3)
            Import = .Cells(Row, 4)
            Default = .Cells(Row, 5)
            'テンプレートファイルの${変数}にデータをセット
            Templator.SetVariable "Field", Field
            Templator.SetVariable "FieldName", FieldName
            Templator.SetVariable "Type_", Type_
            
            Dim ImportAndType_ As String
            ImportAndType_ = Import & "." & Type_
            If Import <> "" And (Not ImportMap.Exists(ImportAndType_)) Then
                '型パッケージは同じものをインポートしないように重複チェックし、
                '<!--BeginBlock ブロック -->に追加
                Templator.SetVariable "Import", ImportAndType_
                Templator.AddBlock "ForeachImport"
                ImportMap.Add ImportAndType_, "true"
            End If
            If Default <> "" Then
                Templator.SetVariable "=Default", " = " & Default
            Else
                Templator.SetVariable "=Default", ""
            End If
            
            Dim FieldGetterSetter As String
            If Left(Field, 2) = UCase(Left(Field, 2)) Then
                'メンバ変数名は先頭の大文字が2回以上連続する場合そのまま
                FieldGetterSetter = Field
            Else
                'メンバ変数名は先頭の小文字を大文字に変換
                FieldGetterSetter = UCase(Left(Field, 1)) & Right(Field, Len(Field) - 1)
            End If
            
            Templator.SetVariable "Setter", "set" & FieldGetterSetter
            
            If UCase(Type_) = "BOOLEAN" And (Import = "" Or Import = "java.lang") Then
                ' boolean型のとき
                Templator.SetVariable "Getter", "is" & FieldGetterSetter
            Else
                Templator.SetVariable "Getter", "get" & FieldGetterSetter
            End If
            
            ' ブロックを追加
            Templator.AddBlock "ForeachField"
            Templator.AddBlock "ForeachGetterSetter"
            
            Row = Row + 1
        Wend
    
    End With
    
    Dim BytData() As Byte
    Dim JavaFileName As String
    ' ファイル名を作成
    JavaFileName = ThisWorkbook.Path & "\" & Class & ".java"
    With FileObject
        .Open
        .Charset = "UTF-8" ' 文字コード指定
        .Type = adTypeText
        .WriteText Templator.GenerateOutputToString '作成したデータをファイルに出力
        
        ' UTF-8で書き出すとBOM付きになるので解除する処理
        .Position = 0
        .Type = adTypeBinary
        .Position = 3
        BytData = .Read
        .Close
        
        .Open
        .Type = adTypeBinary
        .Write BytData
        .SaveToFile (JavaFileName), adSaveCreateOverWrite
        .Close
    End With

Exit_Lbl:
    Set Templator = Nothing
    Set FileObject = Nothing
    Exit Sub

Err_Lbl:
    MsgBox Err.Number & ":" & Err.Description
    Resume Exit_Lbl
    
End Sub
  • 作成されるJavaファイル
package root.entity;

import java.sql.Timestamp;

/**
 * 社員。
 *
 * @author kgu
 */
public class Emp {
	
	/**
	 * ID。
	 */
	private Integer id;
	
	/**
	 * 社員名。
	 */
	private String name;
	
	/**
	 * 所属部署ID。
	 */
	private Integer deptId;
	
	/**
	 * 登録日時。
	 */
	private Timestamp rgTime;
	
	/**
	 * 更新日時。
	 */
	private Timestamp upTime;
	
	/**
	 * 削除フラグ。
	 */
	private boolean delFlag = false;
	
	
	/**
	 * IDを取得する。
	 *
	 * @return ID
	 */
	public Integer getId() {
		return id;
	}

	/**
	 * IDを設定する。
	 *
	 * @param id ID
	 */
	public void setId(Integer id) {
		this.id = id;
	}
	
	/**
	 * 社員名を取得する。
	 *
	 * @return 社員名
	 */
	public String getName() {
		return name;
	}

	/**
	 * 社員名を設定する。
	 *
	 * @param name 社員名
	 */
	public void setName(String name) {
		this.name = name;
	}
	
	/**
	 * 所属部署IDを取得する。
	 *
	 * @return 所属部署ID
	 */
	public Integer getDeptId() {
		return deptId;
	}

	/**
	 * 所属部署IDを設定する。
	 *
	 * @param deptId 所属部署ID
	 */
	public void setDeptId(Integer deptId) {
		this.deptId = deptId;
	}
	
	/**
	 * 登録日時を取得する。
	 *
	 * @return 登録日時
	 */
	public Timestamp getRgTime() {
		return rgTime;
	}

	/**
	 * 登録日時を設定する。
	 *
	 * @param rgTime 登録日時
	 */
	public void setRgTime(Timestamp rgTime) {
		this.rgTime = rgTime;
	}
	
	/**
	 * 更新日時を取得する。
	 *
	 * @return 更新日時
	 */
	public Timestamp getUpTime() {
		return upTime;
	}

	/**
	 * 更新日時を設定する。
	 *
	 * @param upTime 更新日時
	 */
	public void setUpTime(Timestamp upTime) {
		this.upTime = upTime;
	}
	
	/**
	 * 削除フラグを取得する。
	 *
	 * @return 削除フラグ
	 */
	public boolean isDelFlag() {
		return delFlag;
	}

	/**
	 * 削除フラグを設定する。
	 *
	 * @param delFlag 削除フラグ
	 */
	public void setDelFlag(boolean delFlag) {
		this.delFlag = delFlag;
	}
	
}

JSP页面跳转中的问题

 页面调转有如下几种方式1   RequestDispatcher.forward()2  response.sendRedirect()3   4  修改HTTP header的Location属性...
  • tsing_dao
  • tsing_dao
  • 2006年07月20日 18:43
  • 1681

ActiveX コンポーネントはオブジェクトを作成できません。

Set OraSession = CreateObject("OracleInProcServer.XOraSession")regsvr32.exe oip9.dll
  • sirius_1980
  • sirius_1980
  • 2009年05月19日 17:44
  • 854

【Python】Linux下python科学计算库的安装

scipy系列库有相当多的依赖,导致安装过程比较痛苦。要不停的去找依赖。 发现一个小日本给出的安装过程: 原载: http://memo.yomukaku.net/entries/jbRkQkq ...
  • PhanYoung
  • PhanYoung
  • 2014年09月24日 10:54
  • 1305

'exchangecode' アプリケーションでサーバー エラーが発生しました。

 错误产生:.net中,aspx页面提交时,发生如下错误。错误信息: viewstate MAC の検証フィールドです。このアプリケーションが Web Farm またはクラスタによってホストされている...
  • lwj_2008
  • lwj_2008
  • 2009年07月13日 12:04
  • 987

other-IE セキュリティの設定

ツール → インターネット オプション → セキュリティ → 信頼済みサイト → ラベルのカスタマイズ → ActiveX コントロールとプラグイン → スクリプトを実行しても安全だとマークされていな...
  • indieinside
  • indieinside
  • 2012年07月11日 10:56
  • 976

日语语法实践篇十——新编日语第一册第十一课之前文篇

已经一半的书学完了,大家是不是觉得比较累呢。上次看了NHK上的新闻发现一句都看不懂。有点失望。不过我一定会坚持的。首先来看看前文部分: 第十一課 趣味前文 青木さんの趣味は スポーツです。青木先生的爱...
  • bendan999999999
  • bendan999999999
  • 2009年11月11日 12:57
  • 596

tomcat4.1 session load IOException

2008-07-25 15:03:47 StandardManager[/vaistaff] 持続されたセッションをロード中のIOExceptionです: java.io.EOFExceptionja...
  • cui_yihao
  • cui_yihao
  • 2008年07月25日 16:23
  • 1194

[130222]プリズム◇リコレクション![带全CG存档&日文攻略+打开存档补丁]

sankaku Y yande 公元2040年,未来世界并没有像以前的那些艺术作品中所描绘的那样发生戏剧性的变化,世界上的科学技术正常发展。 城市的中心迎来了新世纪的变革,而其周围依然留...
  • wangzi867258173
  • wangzi867258173
  • 2015年11月01日 20:03
  • 1984

'/' アプリケーションでサーバー エラーが発生しました。

问题: ァイルまたはアセンブリ 'SUK21 - コピー'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRES...
  • u012250252
  • u012250252
  • 2014年05月28日 13:30
  • 1750

centos 安装numpy,scipy,scikit-learn

之前需要下载numpy CentOSにpython 2.7.3をインストールする手順 CentOS 6.3にPython 2.7.3をインストールしてひと通りの環境を整える手順を書きます。...
  • zhouyongsdzh
  • zhouyongsdzh
  • 2014年04月23日 13:16
  • 1343
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ExcelVBAでテンプレートを使う
举报原因:
原因补充:

(最多只允许输入30个字)