2016年09月26日

Apache POIによるメモリ消費の少ないExcel出力

WEBサーバでExcelを出力することがあったのでメモ。
 
DBからのマスタ情報の大量のデータ出力を想定して
SXSSFWorkbookを利用する。
テンプレートの1行目を読込、タイトルとして文字情報のみ取得しています。
catchの処理が古くさいのは古いJDKで実装しているためです。

   public boolean downloadExcelFile(HttpServletResponse response, String filename, ResultSet resultSet){
  //一部割愛

        // 新規EXCELファイルを作成
        FileInputStream fi = null;

        int lineFeedInsCnt = 1;
        XSSFWorkbook templatewb = null;
        SXSSFWorkbook wb = null;
    try {
            fi = new FileInputStream(filePath);
            templatewb = new XSSFWorkbook(fi);
            Sheet templateSheet = templatewb.getSheetAt(0);
            wb = new SXSSFWorkbook();
            Sheet sheet1 = wb.createSheet();

            row = sheet1.createRow((short) 0);
            Row templateRow = templateSheet.getRow(0);

            int cellcount = 0;
            for (Cell cell : templateRow) {
                row.createCell(cellcount).setCellValue(getStr(cell));
                cellcount++;
            }

            while (resultSet.next()) {
                row = sheet1.createRow((short) lineFeedInsCnt);
                for (int i = 0; i < resultSet.getMetaData().getColumnCount(); i++) {
                    row.createCell(i).setCellValue(getStr(resultSet.getString(i + 1)));
                }
                lineFeedInsCnt++;
            }

            wb.write(response.getOutputStream());
        } catch (IOException e) {
            log.error(e.getMessage(), e);
            throw e;
        } catch (EncryptedDocumentException e) {
            log.error(e.getMessage(), e);
            throw e;
        } catch (SQLException e) {
            log.error(e.getMessage(), e);
            throw e;
        } finally {
            if (templatewb != null) {
                try {
                    templatewb.close();
                } catch (Exception e) {
                    //処理なし
                }
            }
            if (wb != null) {
                try {
                    wb.dispose();
                } catch (Exception e) {
                    //処理なし
                }
            }
            if (fi != null) {
                try {
                    fi.close();
                } catch (IOException e) {
                    //処理なし
                }
            }
            try {
                response.getOutputStream().close();
            } catch (IOException e) {
                //処理なし
            }
        }
         return true;
    }
    • 0 Comment |
    • 0 Trackback |
2012年06月11日

Oracle10gのBLOBをVARCHAR2型に変更して中身を確かめる

ほぼ1年ぶりの更新になってしまいました。これからちびちび更新をしていきたいと思います。

この前、OracleでBLOB型(バイナリデータ) に保存していた内容で、抽出したいレコードがあり、それについての話です。

1.まずはBLOBのデータの抽出としてDBMS_LOB.SUBSTR関数を利用します。

SELECT 
DBMS_LOB.SUBSTR(LOB_DATA,2000,1)
FROM LOB_TABLE
 
LOB_TABLEテーブルにある、BLOB型のカラムLOB_DATAから1バイトから最大2000バイトまでを取得するというSQL文です。これでバイナリデータのSELECTが可能になりました。

2.次に取得したバイナリデータをVARCHAR2型に変更します。

SELECT 
UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR( LOB_DATA ,2000,1)) 
FROM LOB_TABLE

UTL_RAW.CAST_TO_VARCHAR2 は1.で取得したバイナリデータをVARCHAR2型にキャストしています。

ここまで書くと非常に簡単に見えますが、ここに辿り着くまで30分ぐらいかかってしまいOracleのページでしか関数が載っていなかったので誰かの参考になればと思います。

    • 1 Comment |
    • 0 Trackback |
2011年08月24日

ベルギービール好きのヨーロッパ新婚旅行3

だいぶ空いてしまって記憶も頼りないところがありますが、新婚旅行シリーズの最終回にします。

ビール、食事と来ましたので、今回はその他気付いたこと全般についてです。

<飛行機>
行きも帰りもlufthansa(ルフトハンザ)でした。
行きは
日本→ドイツ→ベルギー、帰りはフランス→ドイツ→日本ということで、飛行時間はどちらも片道11.5時間+待ち2~3時間+1時間ぐらいです。飛行機はひたすら暇なのですが細かい振動で小説を読む気にもなれず、長距離のフライトでは映画ばっかり見てました。全部で5本見ました。時差の関係上、日本→ベルギーの場合には1日が24+7.5時間(サマータイム)になり、1日で5回も食べてしまいこれは太りやすい度になりそうだなと直感しました。

行きの飛行機です。でかい乗り物は男子なら少しテンション上がります。IMG_7100

<気候>
ベルギー、フランスにそれぞれ4日滞在してましたが、6月だったせいなのか晴れていてもその2,3時間後には突然豪雨になることもしばしばあり、安定していません。またベルギーはとても乾燥していて、空調を切っているにもかかわらず寝ていると喉の渇きで目が覚めるほどでした。
緯度の関係からお日様が出ている時間が長く、夜10時過ぎまで明るかったです。明るいけど治安も悪くなりやすいということだったのであまり夜は出歩かないようにしてました。不思議と朝は5,6時ぐらいに明るくなっていた。サマータイムの影響でしょうか。

 <観光名所>
ベルギーはブリュッセル+ブルージュ、フランスはパリのみでしたが、日本人ウェルカムなことが多かったです。フランスは日本語で挨拶されることも1日1回ぐらいありました。建築物は壮大さからするとベルギーが良かったですが、フランスは名所が多すぎて4日でも回りきれないほどです。

ベルギーの壮大さの一枚(これは実際に使われている市庁舎)
 IMG_1931

<人々や治安>
幸運だったのか、それほど危ない目には遭遇しませんでした。一度パリの地下鉄の券売機で「俺が買ってやるよー」と言われ、お願いしたら全然違う券を買われ(払って券を使った後で気付いた)少し高めの額を請求されたぐらいでしょうか。iPhone4を出して歩いていると、すぐひったくりにあうという話を旅行会社の人に聞いたので基本はずっとポケットに入れてましたが、住んでいる人はi
Phone4を普通に使っていたので旅行者丸わかりだとひったくられるようです。

<電車>
ベルギーはただ乗りし放題な印象です。入る時も出る時も改札でチェックなし(1箇所だけ自動改札でした)。
フランス(パリ)は入る時のみ自動改札ですが、出る時はご自由に。さらに地下鉄だと切符一枚(140円ぐらい)で60分間乗り継ぎし放題でした。どちらもたまーに駅員がチェックにきて、その時券がないと即罰金ということでした。どのぐらいの額になるのかは想像も尽きません。
また電車で寝ている人は一人もいません。そう考えてると日本は平和です。

<まとめ>
全体として少し緊張状態であったため、精神的にも疲れた旅になりました。日本に帰ってきてパスポートを携帯しなくていい、電車でウトウトできるし、安心できる国なんだということが身にしみてわかりました。長い休みの取得と長い飛行時間と、現地での楽しさを天秤のかけると、次があるならば韓国・台湾とか近場が良いなぁ。
    • 0 Comment |
    • 0 Trackback |