Spring Boot에서 CSV 출력

Java + SpringBoot로 검색 결과를 CSV 다운로드 할 수있는 기능을 구현할 수 있었으므로 비망록으로 남겨 둡니다.

우선, 이런 식으로 검색 결과가 있었다고 합니다.


이 CSV 버튼을 누르면 모든 검색 결과가 CSV 파일로 다운로드됩니다.

1 - 우선 이런 식으로 검색 버튼을 누른 후의 레코드 정보를 hidden의
에 넣어 유지해 둡니다.
        <form id="csvform" method="post" th:action="@{/asset/csv}" th:object="${csvForm}">
          <div th:each="asset:${assets}">
            <input type="hidden" name="id" th:value="${asset.id}" />
            <input type="hidden" name="categoryId" th:value="${asset.categoryId}" />
            <input type="hidden" name="adminName" th:value="${asset.adminName}" />
            <input type="hidden" name="assetName" th:value="${asset.assetName}" />
            <input type="hidden" name="remarks" th:value="${asset.remarks}" />
          </div>
          <button type="submit">CSV</button>
        </form>

2 - 에서, CS 버튼을 누르면 이 정보 전부를 포스트 송신해, 컨트롤러측에서 받고 CSV 형식으로 정형해, 다운로드해 줍니다. 이때 CSV records 가 아니라 List<CSV> records 라고 하면 에러가 일어나 버리는 것은 왜인지 모르겠다... 우선 List 를 받으려면 List 를 필드에 더 클래스를 준비 해 두지 않으면 안 되는 것 같다.
  @PostMapping(value = "/csv", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE
      + "; charset=UTF-8; Content-Disposition: attachment")
  @ResponseBody
  public Object csvDownload(@ModelAttribute("csvForm") CSV records) throws JsonProcessingException {
    List<CsvColumn> csvList = new ArrayList<>();
    for (int i = 0; i < records.getId().size(); i++) { // レコードの数ぶんだけループ回して
      csvList.add(new CsvColumn(records.getId().get(i), records.getCategoryId().get(i), records.getAdminName().get(i), records.getAssetName().get(i), records.getRemarks().get(i)));
    }
    CsvMapper mapper = new CsvMapper();
    CsvSchema schema = mapper.schemaFor(CsvColumn.class).withHeader();
    return mapper.writer(schema).writeValueAsString(csvList);
  }
@Data
public class CSV {

  List<Integer> id;

  List<Integer> categoryId;

  List<String> adminName;

  List<String> assetName;

  List<String> remarks;

}
@JsonPropertyOrder({"資産ID", "資産種別", "管理者名", "資産名", "備考"})
@Data
public class CsvColumn {

  @JsonProperty("資産ID")
  private Integer id;

  @JsonProperty("資産種別")
  private Integer categoryId;

  @JsonProperty("管理者名")
  private String adminName;

  @JsonProperty("資産名")
  private String assetName;

  @JsonProperty("備考")
  private String remarks;

  public CsvColumn () {}

  public CsvColumn (Integer id, Integer categoryId, String adminName, String assetName, String remarks) {
    this.id = id;
    this.categoryId = categoryId;
    this.adminName = adminName;
    this.assetName = assetName;
    this.remarks = remarks;
  }

좋은 웹페이지 즐겨찾기