使用Spring Boot导出CSV文件

因为我已经成功地在Java+SpringBoot中实现了能够将搜索结果以CSV格式下载的功能,所以我将其留作备忘录。

スクリーンショット 2020-11-29 16.06.35.png

当你点击这个CSV按钮时,会将所有的搜索结果以CSV文件的形式下载下来。

首先,当搜索按钮被点击后,将记录信息保存在隐藏的

内。

        <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>

当CS按钮被按下时,将发送此所有信息进行邮寄,并在控制器端接收并格式化为CSV格式,并提供下载。但是,在这种情况下,如果将CSV记录更改为List记录,则会引发错误,而不知道原因… 暂时来说,为了接收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;
  }

广告
将在 10 秒后关闭
bannerAds