[JAVA] Jython+JExcelApi+Velocity

Jython+JExcelApi+VelocityでExcel→JavaBean生成プログラムを作ってみた。

Excelがこんな感じ。


Jythonのコードがこんな感じ。


from jxl import *
from bean import *

xls = '../doc/bean.xls'
fin = open(xls)
book = Workbook.getWorkbook(fin)

for sheet in book.sheets:
if(sheet.name == '設定'):
continue
else:
bean = Bean(sheet)
bean.output();

fin.close();


import sys
from java.io import *
from java.util import *
from org.apache.velocity import *

class Bean:
initvm = None;

def __init__(self, sheet):
if(not Bean.initvm):
app.Velocity.init("../conf/velocity.properties")

self.template = app.Velocity.getTemplate("bean.vm");
self.props = ArrayList()
self.className = sheet.name

for i in range(1, sheet.rows):
print
prop = Prop(sheet.getRow(i))
self.props.add(prop)

def output(self, out = OutputStreamWriter(sys.stdout)):
vc = VelocityContext()
vc.put('className', self.className)
vc.put('props', self.props)
self.template.merge(vc, out)
out.flush()

class Prop(HashMap):
def __init__(self, cells):
self.put('desc', cells[0].string)
self.put('name', cells[1].string)
self.put('cname', cells[1].string.capitalize())
self.put('type', cells[2].string)

テンプレートがこんな感じ。


public class $className {
#foreach($prop in $props)

/** $prop.desc */

private $prop.type $prop.name;

public $prop.type get${prop.cname}() {
return $prop.name;
}

public void set${prop.cname}($prop.type _$prop.name) {
$prop.name = _$prop.name;
}
#end

}

実行結果。


public class FooBar {

/** ふー */

private java.lang.String foo;

public java.lang.String getFoo() {
return foo;
}

public void setFoo(java.lang.String _foo) {
foo = _foo;
}

/** ばー */

private java.lang.String bar;

public java.lang.String getBar() {
return bar;
}

public void setBar(java.lang.String _bar) {
bar = _bar;
}

}



public class Emp {

/** 名前 */

private java.lang.String name;

public java.lang.String getName() {
return name;
}

public void setName(java.lang.String _name) {
name = _name;
}

/** 年齢 */

private int age;

public int getAge() {
return age;
}

public void setAge(int _age) {
age = _age;
}

/** 資格 */

private java.util.List hat;

public java.util.List getHat() {
return hat;
}

public void setHat(java.util.List _hat) {
hat = _hat;
}

}

以前、Javaでも同様のプログラムを作ったのだが、今回はJythonを使ってみた。で、使ってみると「JythonJavaには以外とギャップがあるなぁ」と思った。

pythonの書式で定義したリストが#foreachで使えなかったり、JavaBeanのクラスの定義がJythonでは結構面倒だったり。

何かうまいやり方があるのかなぁ…