CSV(Comma-Separated Values) 파일은 데이터를 저장하기 위해 사용하는 간단한 텍스트 파일 형식이다.
각 데이터 항목을 콤마(,)로 구분하여 한 줄에 하나의 레코드를 저장한다.
주로 데이터를 테이블 형식(행과 열)으로 저장하는 데 사용되며, Excel, 데이터베이스, 스프레드시트 등 다양한 프로그램에서 쉽게 사용할 수 있다.
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.7.1</version>
</dependency>
public void exportCsv1(HttpServletResponse response) throws Exception {
String filename = URLEncoder.encode("UserList.csv", "UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/csv; charset=UTF-8");
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"");
List<User> list = userRepository.findAll();
List<String[]> listStrings = new ArrayList<>();
listStrings.add(new String[]{"ID", "E-mail", "이름", "비밀번호"});
for (User user: list) {
String[] rowData = new String[4];
rowData[0] = String.valueOf(user.getUserId());
rowData[1] = user.getEmail();
rowData[2] = user.getUsername();
rowData[3] = user.getPassword();
listStrings.add(rowData);
}
response.getOutputStream().write(0xEF);
response.getOutputStream().write(0xBB);
response.getOutputStream().write(0xBF);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(response.getOutputStream(), StandardCharsets.UTF_8);
outputStreamWriter.write('\uFEFF');
CSVWriter csvWriter = new CSVWriter(outputStreamWriter);
csvWriter.writeAll(listStrings);
csvWriter.close();
outputStreamWriter.close();
}
String filename = URLEncoder.encode("UserList.csv", "UTF-8");
List<User> list = userRepository.findAll();
List<String[]> listStrings = new ArrayList<>();
listStrings.add(new String[]{"ID", "E-mail", "이름", "비밀번호"});
for (User user: list) {
String[] rowData = new String[4];
rowData[0] = String.valueOf(user.getUserId());
rowData[1] = user.getEmail();
rowData[2] = user.getUsername();
rowData[3] = user.getPassword();
listStrings.add(rowData);
}
response.getOutputStream().write(0xEF);
response.getOutputStream().write(0xBB);
response.getOutputStream().write(0xBF);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(response.getOutputStream(), StandardCharsets.UTF_8);
outputStreamWriter.write('\uFEFF');
CSVWriter csvWriter = new CSVWriter(outputStreamWriter);
csvWriter.writeAll(listStrings);
csvWriter.close();
outputStreamWriter.close();
public void exportCsv2(HttpServletResponse response) throws Exception {
String filename = URLEncoder.encode("UserList.csv", "UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/csv; charset=UTF-8");
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"");
response.getOutputStream().write(0xEF);
response.getOutputStream().write(0xBB);
response.getOutputStream().write(0xBF);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(response.getOutputStream(), StandardCharsets.UTF_8);
outputStreamWriter.write('\uFEFF');
StatefulBeanToCsv<User> beanToCsv = new StatefulBeanToCsvBuilder<User>(outputStreamWriter)
.withSeparator(CSVWriter.DEFAULT_SEPARATOR)
.withQuotechar(CSVWriter.DEFAULT_QUOTE_CHARACTER)
.withEscapechar(CSVWriter.DEFAULT_ESCAPE_CHARACTER)
.build();
beanToCsv.write(userRepository.findAll());
outputStreamWriter.close();
}
StatefulBeanToCsv
OpenCSV 라이브러리에서 제공하는 클래스로 객체를 CSV형식으로 변환하여 파일에 저장할 때 사용하며 내부로직에서 CSVWriter를 사용하여 파일을 작성한다.
@PostMapping(value = "/read", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<List<String[]>> uploadCsv(@RequestPart MultipartFile file) throws Exception {
List<String[]> data = new ArrayList<>();
String sOriginalFileName = file.getOriginalFilename();
String sFileName = FilenameUtils.getBaseName(sOriginalFileName);
String sExtenstion = FilenameUtils.getExtension(sFileName);
log.info("originalFilename: {}, filename: {}, extenstion: {}", sOriginalFileName, sFileName, sExtenstion);
if("csv".equals(sExtenstion)) {
return new ResponseEntity<>(data, HttpStatus.BAD_REQUEST);
}
try (CSVReader csvReader = new CSVReader(new InputStreamReader(file.getInputStream()))) {
String[] line;
while ((line = csvReader.readNext()) != null) {
data.add(line);
}
}
return new ResponseEntity<>(data, HttpStatus.OK);
}
MediaType을 multipart/form-data로 하여 Swagger로 테스트함.
try (CSVReader csvReader = new CSVReader(new InputStreamReader(file.getInputStream()))) {
String[] line;
while ((line = csvReader.readNext()) != null) {
data.add(line);
}
}
data = csvReader.readAll();
readNext(), readAll() 상황에 맞게 사용하면 된다.
CSV 파일 업로드
Jackson - ObjectMapper Custom 설정 (0) | 2024.12.24 |
---|---|
ImmutableList에 대한 고찰 (1) | 2024.10.13 |
REST API Response Format에 대한 고찰 (ResponseEntity, JSend, ResponseBodyAdvice) (0) | 2024.09.09 |
Optional 사용에 대한 고찰 (사용목적, 메서드, 주의사항) (0) | 2024.09.06 |
[JAVA] LocalDate (날짜와 시간) 내일, 월말, 월초, 년말, 년초, 윤년 구하기 (0) | 2024.08.27 |
댓글 영역