S2VeloPoiみたいなの

を作ってみようと思ったら、なんかあっと云う間だった。

VeloPoiはこちら↓から戴いてそのまんま使うとして。
http://d.hatena.ne.jp/nowokay/20050526

public class S2VeloPoiInterceptor extends AbstractInterceptor {
    private static final long serialVersionUID = 5774644597591718973L;

    public Object invoke(MethodInvocation invocation) throws Throwable {
        Method method = invocation.getMethod();
        if (!MethodUtil.isAbstract(method)) {
            return invocation.proceed();
        }
        
        Object[] arguments = invocation.getArguments();
        if (arguments == null || arguments.length == 0) {
            return null;
        }
        Object bean = arguments[0];
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("data", bean);
        Class<?> clazz = method.getDeclaringClass();
        String templatePath = clazz.getName().replaceAll("\\.", "/") + "_" + method.getName() + ".xls";
        InputStream is = ResourceUtil.getResourceAsStream(templatePath);
        POIFSFileSystem fs = new POIFSFileSystem(is);
        HSSFWorkbook wb = VeloPoi.merge(fs, map);
        
        return wb;
    }

とか、ソースの汚さは取り敢えずおいとくとして、まあ作っておいて、diconに登録しといて、インタフェースをこんな風に作って

public interface TestVeloPoi {
    HSSFWorkbook getWb(TestVeloPoiDto dto);
}

Dtoは普通のBeanで。

テンプレートは例によって、「VeloPoiインタフェース名_メソッド名.xls」って名前にして同じパッケージ内に置いておく。テンプレートには「${data.hoge}」と書くと、dtohogeプロパティが参照出来る。

あとはVeloPoiの機能が全部使える。

diconに、TestVeloPoiのaspectで上のinterceptorかましたら、出来た。もっと早くやればよかった。