@Controller public class ExportController { @Autowired private PanekVehicleRepository repository; @Autowired private CSVPanekWriter panekWriter; private static final Integer LIMIT = 750; @RequestMapping(value = "/export", method = RequestMethod.GET) public String getExport(Model model) throws Exception { model.addAttribute("period", new Period()); return "export"; } @RequestMapping(value = "/export", method = RequestMethod.POST, produces = "text/csv") public String postExport(HttpServletResponse httpServletResponse, @ModelAttribute(value = "period") Period period) throws Exception { List panekVehicleList = new ArrayList<>(); Long recordAmount = repository.countByPeriod(period.getDateFrom(), period.getDateTo()); int pageNr = 0; while (pageNr*LIMIT < recordAmount) { List page = repository.findByPeriod(period.getDateFrom(), period.getDateTo(), new PageRequest(pageNr, LIMIT)); pageNr++; panekVehicleList.addAll(page); } CSVPrinter csvPrinter = panekWriter.transformResourcesToCSVPrinter(new BufferedWriter(httpServletResponse.getWriter()), panekVehicleList); httpServletResponse.setContentType("application/csv"); httpServletResponse.setHeader("Content-Disposition", "attachment; filename="file.csv""); csvPrinter.flush(); csvPrinter.close(); return "export"; } }