반응형
Spring Rest Controller에서 Excel 파일을 다운로드하는 방법
Apache POI를 사용하여 .xlsx 파일을 생성하고 있습니다.
스프링 컨트롤러에서 그 파일을 반환하고 싶습니다.지금까지 제가 한 일은 다음과 같습니다.
컨트롤러:
@RequestMapping(method = RequestMethod.GET)
public HttpEntity<byte[]> createExcelWithTaskConfigurations(HttpServletResponse response) throws IOException {
byte[] excelContent = excelService.createExcel();
HttpHeaders header = new HttpHeaders();
header.setContentType(new MediaType("application", "vnd.openxmlformats-officedocument.spreadsheetml.sheet"));
header.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=my_file.xls");
header.setContentLength(excelContent.length);
return new HttpEntity<>(excelContent, header);
}
사용자가 자신의 컴퓨터에 다운로드할 수 있도록 rest 컨트롤러에서 실제 엑셀 파일을 반환하는 것이 가능합니까? 현재 컨트롤러는 바이트[]를 반환하지만 저는 실제 파일을 반환하고 싶습니다.어떻게 하면 그것을 달성할 수 있을까요?
사용할 수 있습니다.ByteArrayResource파일로 다운로드할 수 있습니다.아래는 수정된 코드 조각입니다.
@GetMapping(value="/downloadTemplate")
public HttpEntity<ByteArrayResource> createExcelWithTaskConfigurations() throws IOException {
byte[] excelContent = excelService.createExcel();
HttpHeaders header = new HttpHeaders();
header.setContentType(new MediaType("application", "force-download"));
header.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=my_file.xlsx");
return new HttpEntity<>(new ByteArrayResource(excelContent), header);
}
Apache poi를 사용하여 Excel을 생성하려는 경우 아래 코드 스니펫을 찾으십시오.
@GetMapping(value="/downloadTemplate")
public ResponseEntity<ByteArrayResource> downloadTemplate() throws Exception {
try {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
XSSFWorkbook workbook = createWorkBook(); // creates the workbook
HttpHeaders header = new HttpHeaders();
header.setContentType(new MediaType("application", "force-download"));
header.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=ProductTemplate.xlsx");
workbook.write(stream);
workbook.close();
return new ResponseEntity<>(new ByteArrayResource(stream.toByteArray()),
header, HttpStatus.CREATED);
} catch (Exception e) {
log.error(e.getMessage());
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@ JAR 덕분에.병. 콩.링크는 다음과 같습니다. 스프링 컨트롤러에서 파일 다운로드
@RequestMapping(value = "/files/{file_name}", method = RequestMethod.GET)
@ResponseBody
public FileSystemResource getFile(@PathVariable("file_name") String fileName) {
return new FileSystemResource(myService.getFileFor(fileName));
}
이것은 제가 txt 파일을 다운로드할 때 사용한 작업 코드입니다.엑셀 파일도 마찬가지입니다.
@GetMapping("model")
public void getDownload(HttpServletResponse response) throws IOException {
InputStream myStream = your logic....
// Set the content type and attachment header. for txt file
response.addHeader("Content-disposition", "inline;filename=sample.txt");
response.setContentType("txt/plain");
// xls file
response.addHeader("Content-disposition", "attachment;filename=sample.xls");
response.setContentType("application/octet-stream");
// Copy the stream to the response's output stream.
IOUtils.copy(myStream, response.getOutputStream());
response.flushBuffer();
}
이 lib 추가
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
Excel 파일/폴더 저장 위치src\main\resources
package com.example.controller;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.io.InputStream;
@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/download")
public class DownloadController {
private static final Logger LOGGER = LoggerFactory.getLogger(DownloadController.class);
// GET http://localhost:80/download/B01-DN_01_Summary.xlsx
/**
* Get all accounts belong to a specific tenant.<br/>
* GET http://localhost/account/all?tenant_id=-32768 .
*
* @return
*/
// @GetMapping("/{file_name}")
// public @ResponseBody byte[] getImage(@PathVariable("file_name") String file_name) throws IOException
// {
// LOGGER.info("Call method getAllAccounts() .");
// InputStream inputStream = getClass().getResourceAsStream("/FilesHere/ImportExcel/" + file_name);
// return IOUtils.toByteArray(inputStream);
// }
// E:\github\spring_jwt\src\main\resources\FilesHere\ImportExcel\B01-DN_01_Summary.xlsx
@GetMapping("/{file_name}")
public HttpEntity<ByteArrayResource> createExcelWithTaskConfigurations(@PathVariable("file_name") String file_name) throws IOException {
InputStream inputStream = getClass().getResourceAsStream("/FilesHere/ImportExcel/" + file_name);
byte[] excelContent = IOUtils.toByteArray(inputStream);
HttpHeaders header = new HttpHeaders();
header.setContentType(new MediaType("application", "force-download"));
header.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + file_name);
return new HttpEntity<>(new ByteArrayResource(excelContent), header);
}
}
언급URL : https://stackoverflow.com/questions/51684550/how-to-download-an-excel-file-in-spring-restcontroller
반응형
'codememo' 카테고리의 다른 글
| Spring Data에서 날짜별로 마지막으로 주문한 레코드 가져오기 (0) | 2023.08.26 |
|---|---|
| Swift UIV뷰 배경색 불투명도 (0) | 2023.08.26 |
| jQuery.ajax가 400개의 잘못된 요청을 반환합니다. (0) | 2023.08.21 |
| 크롬/j쿼리 탐지되지 않은 범위 오류: 최대 호출 스택 크기를 초과했습니다. (0) | 2023.08.21 |
| 앵커 태그가 아무것도 참조하지 않도록 만드는 방법은 무엇입니까? (0) | 2023.08.21 |