shokosブログ

プログラミング

CSV出力

きょうは久しぶりにjavaの日記!!!!!!!!!!!!!!!

CSV出力の方法を書きます。

supercsvを使います。

SuperCSV API


まずはsupercsvをダウンロード。いつものようにプロジェクトのpom.xmlに以下を追加して、mvn eclipse:eclipse

        <dependency>
                <groupId>net.sourceforge.supercsv</groupId>
                <artifactId>supercsv</artifactId>
                <version>1.52</version>
        </dependency>


今回は「名前・年齢・部署」が載った簡単なCSVファイルの作成です。



ダウンロードするページのclass

package jp.ne.hatena.syoko_sasaki;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget;
import org.apache.wicket.util.resource.AbstractResourceStreamWriter;

public class HomePage extends WebPage {

	private static final long serialVersionUID = 1L;

	public HomePage(final PageParameters parameters) {
		add(new Label("message", "CSVをダウンロードするよ!!!"));
		final List<ChargePerson> ChargePersonList = createChargePerson();
		add(new Link("chargePersonDownloadButton", null) {

			private static final long serialVersionUID = 1L;

			@Override
			public void onClick() {
				this.getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(new AbstractResourceStreamWriter() {
					private static final long serialVersionUID = 1L;

					public String getContentType() {
						return "application/octet-stream;charset=MS932";
					}
					public void write(OutputStream output) {
						try {
							ChargePersonCsv.write(output, ChargePersonList);
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}, "chargePerson.csv"));
			}
		});
	}

	//CSVに表示させるデータ作成
	private List<ChargePerson> createChargePerson() {
		List<ChargePerson> result = new ArrayList<ChargePerson>();
		result.add(new ChargePerson("shokos", 24, "hoge部署"));
		result.add(new ChargePerson("yoshiori", 35, "foo部署"));
		return result;
	};

}

対応するhtml

<html>
    <head>
        <title>CSVダウンロード</title>
    </head>
    <body>
        <span wicket:id="message">メッセージ</span>
    	<button wicket:id="chargePersonDownloadButton">CSV出力</button>
    </body>
</html>

出力するデータ型class

package jp.ne.hatena.syoko_sasaki;

import java.io.Serializable;

public class ChargePerson implements Serializable{

	private static final long serialVersionUID = 1L;

	private String name;
	private int old;
	private String department;
	/**
	 * @param name
	 * @param old
	 * @param department
	 */
	public ChargePerson(String name, int old, String department) {
		super();
		this.name = name;
		this.old = old;
		this.department = department;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getOld() {
		return old;
	}
	public void setOld(int old) {
		this.old = old;
	}
	public String getDepartment() {
		return department;
	}
	public void setDepartment(String department) {
		this.department = department;
	}
	public static long getSerialversionuid() {
		return serialVersionUID;
	}

}


CSVをつくるclass

package jp.ne.hatena.syoko_sasaki;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.wicket.util.lang.PropertyResolver;
import org.supercsv.io.CsvMapWriter;
import org.supercsv.io.ICsvMapWriter;
import org.supercsv.prefs.CsvPreference;

public class ChargePersonCsv {

	//ヘッダを作成
	static final Map<String,String> HEADER_MAP = new LinkedHashMap<String, String>();
	static{
		HEADER_MAP.put("name", "名前");
		HEADER_MAP.put("old", "年齢");
		HEADER_MAP.put("department", "部署");
	};

	public static void write(OutputStream output, List<ChargePerson> chargePersonList) throws IOException {
		ICsvMapWriter writer = new CsvMapWriter(new BufferedWriter(new OutputStreamWriter(output,"MS932")), CsvPreference.EXCEL_PREFERENCE);
		String[] nameMappings = HEADER_MAP.keySet().toArray(new String[0]);
		try {
			writer.write(HEADER_MAP,nameMappings);
			for(ChargePerson chargePerson : chargePersonList){
				Map<String,Object> map = new HashMap<String, Object>();
				for(String key : HEADER_MAP.keySet()){
					Object result = PropertyResolver.getValue(key,chargePerson);
					if(result == null){
						result = "";
					}
					map.put(key, result);
				}
				writer.write(map, nameMappings);
			}
		} finally {
			writer.close();
		}
	}

}


実行結果

f:id:syoko_sasaki:20101110130558j:image:left



わーいできた