CSV出力(サーブレット/サーバサイド)

CSV出力はどの言語でもよく使います。業務系のシステムを作ると、実績や計画、予定情報をどうしても外部連携するという必要性がでてきます。単純にBIツール等を使って出力する場合もありますが、業務仕様によって複雑な編集等が必要になるケースがあり、自分で作成するケースが多いです。項目ごとに修正しやすいようにあえて複雑な構文を使わず、愚直で簡単なCSV出力について掲載します。

  • CSV出力(サーブレット/サーバサイド)
// 出力データを編集
List<TestEntity> listData = new ArrayList<TestEntity>();

// CSVデータ(1レコード分)のオブジェクトをインスタンス化する
TestEntity testEntity = new TestEntity();

// CSV項目を編集
testEntity.cd = "100";
testEntity.name = "名称";

// CSVデータ(データEntity)を追加する
listData.add(testEntity);

// 対象データが存在する場合は、CSV出力を行う
if (listData != null && listData.size() > 0) {

    // フォルダ名を設定
    String strCsvFolder = "csv" + "/" + "dirName";
    String strCsvFileName = "";

    // ファイルシステム上の絶対パスを返す。
    String strCsvPath = RequestUtil.getRequest().getSession().getServletContext().getRealPath(strCsvFolder);

    // フォルダが存在しない場合作成する。
    File csvDirFile = new File(strCsvPath);

    if(!csvDirFile.exists()) {
        csvDirFile.mkdir();
    }

    // CSVのサーバのURLを取得する場合
    String strCsvUrl = RequestUtil.getRequest().getSession().getServletContext().getContextPath() + "/" + strCsvFolder + "/";

    // 既にあるCSVファイルを削除する場合
    // ※前回出力したファイル等を削除する際に利用しています。
    File delFile = new File(strCsvPath+"/"+"csvFileName");
    delFile.delete();

    // 保持期間が過ぎたその他CSVファイルが存在する場合は削除する。
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    Date nowDate = new Date();

    // 保持期間を算出する。
    Calendar cal = Calendar.getInstance();

    // 現在時刻を設定
    cal.setTime(nowDate);

    // 保持期間(10日)を減算
    cal.add(Calendar.DATE, -10);
    int delDay = Integer.parseInt(sdf.format(cal.getTime()));

    // 保持期間が過ぎた出力CSVファイルを出力フォルダのファイルリストを検索し削除する。
    File dir = new File(strCsvPath);
    File[] files = dir.listFiles();

    if (files != null) {

        // ファイルリストの件数分、処理する
        for (int i = 0; i < files.length; i++) {

            File file = files[i];

            // ファイルの更新日時取得
            Date upDate = new Date(file.lastModified());
            int iUpDate = Integer.parseInt(sdf.format(upDate));

            // 保持期間が過ぎたファイルは削除する。
            if (iUpDate < delDay) {

                // ファイルを削除する。
                file.delete();
            }
        }
    }

    // CSVファイル名を作成する。(ファイル名に日時を結合する)
    SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd_HHmmssSSS");
    strCsvFileName = "csvFileName_"+sdf2.format(nowDate)+".csv";

    // CSV出力データが存在する場合は、CSV出力する
    File fileWork = null;
    PrintWriter pw = null;
    int iWriteCnt = 0;
    String strLineData = "";

    try {
        // 出力ファイルオブジェクトを生成する
        fileWork = new File(strCsvPath+"/"+strCsvFileName);

        // ストリームよりPrintWriterを生成(文字コード:Windows-31J)
        pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileWork),"Windows-31J")));

        // 出力対象データの件数分、処理を繰り返す(ループ)
        for (int i=0;i<listData.size();i++) {

            // CSV1レコードを取得する。
            TestEntity testEntityWork = (TestEntity) listData.get(i);

            // 1件目は見出しを編集する。
            if (iWriteCnt == 0) {

                // 見出しを編集する。
                strLineData = "";
                strLineData = strLineData + "コード";
                strLineData = strLineData + ",";
                strLineData = strLineData + "名称";

                // CSVを出力(1行分)する。
                pw.println(strLineData);

                // 出力件数をカウントアップする
                iWriteCnt++;
            }

            //--------------------------------------------------------------------
            // CSVデータを編集する。
            strLineData = "";
            strLineData = strLineData + testEntityWork.cd;
            strLineData = strLineData + ",";
            strLineData = strLineData + testEntityWork.name;

            // CSVを出力(1行分)する。
            pw.println(strLineData);

            // 出力件数をカウントアップする
            iWriteCnt++;
        }

        //--------------------------------------------------------------------
        // ファイルをクローズする。
        pw.close();

    } catch (IOException e) {
        // 異常時
    }
}
package test.entity;

/**
 * CSVエンティティ
 * 
 */
public class TestEntity {

    /*
     * CSVデータの1レコード項目
     */

    /*
     * コード
     */
    public String cd;

    /*
     * 名称
     */
    public String name;
}

※CSV出力時には、以下のような事が必要となるケースが多いです。

  • ファイル名に日時を付与する
  • 同一ファイル名がある場合は削除する(または上書きする)
  • 保持期間によるファイル削除(バッチ等、別プロセスでやる事が多い)

Leave a Reply

Your email address will not be published. Required fields are marked *