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.namefor i in range(1, sheet.rows):
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を使ってみた。で、使ってみると「JythonとJavaには以外とギャップがあるなぁ」と思った。
pythonの書式で定義したリストが#foreachで使えなかったり、JavaBeanのクラスの定義がJythonでは結構面倒だったり。
何かうまいやり方があるのかなぁ…