ホーム > Java > Spring Framework > Webアプリケーション > CSVダウンロード機能

CSVダウンロード機能

検索結果などをCSV形式のファイルとしてダウンロードする機能を作成する。

1. コントローラクラス

  • 以下の例ではformに検索条件が格納されており、 paintService.findByCondition(form)で 検索結果がList<PaintDetailDto>形式で取得されるものとする。

例)コントローラクラスのメソッド例


・・・略
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
・・・略

    @PostMapping(path = "/paint/search", params = {"csv"})
    @ResponseBody
    public ResponseEntity<byte[]> downloadCsv(
      PaintSearchForm form, 
      Model model) throws JsonProcessingException, UnsupportedEncodingException {
      
        List<PaintDetailDto> list = paintService.findByCondition(form);

        CsvMapper mapper = new CsvMapper();
        // Header有り
        CsvSchema schema = mapper.schemaFor(PaintDetailDto.class).withHeader();
        // CSVに変換し、さらにMS932のバイト配列に変換
        byte[] data = 
          mapper.writer(schema).writeValueAsString(list).getBytes("MS932");

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDisposition(ContentDisposition.attachment()
                .filename("しーえすぶい.csv", StandardCharsets.UTF_8).build());

        return new ResponseEntity<>(data, headers, HttpStatus.OK) ;
    }
  • 上記PaintDetailDtoは以下の通りで、CsvMapperによりCSV形式に変換している。
package com.ziqoo.demo.service.paint.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

import lombok.Data;

@JsonPropertyOrder({"色コード", "色名称", "数量", "商品名"})
@Data
public class PaintDetailDto {
    @JsonProperty("色コード")
    private String colorCd;
    @JsonProperty("色名称")
    private String colorName;
    @JsonProperty("数量")
    private Integer quantity;
    @JsonProperty("商品名")
    private String productName;
}
  • CsvMapperを使用するにはbuild.gradleのdependencies {}に以下を追加する。
    implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-csv';

2. 実行結果

  • 実行結果は以下の様なCSVファイルがダウンロードされる。
色コード,色名称,数量,商品名
XF-53,ニュートラルグレイ,0,タミヤカラーアクリル
X-1,ブラック,0,タミヤカラーエナメル
XF-1,フラットブラック,0,タミヤカラーエナメル
AS-7,ニュートラルグレイ,0,タミヤカラースプレー
TS-8,イタリアンレッド,0,タミヤカラースプレー

リンク

コーポレートサイトにちょうどいいCMS、baserCMS