- 데이터 유효성 검사 규칙을 생성하는 도우미 클래스입니다. - sheet.getDataValidationHelper()를 통해 얻을 수 있으며, 다양한 유효성 검사 제약 조건을 만드는 데 사용됩니다.
// DataValidationHelper 생성
DataValidationHelper dvHelper = sheet.getDataValidationHelper();
// 유효성 검사를 적용할 셀 범위 지정 (1행~10행, A열)
CellRangeAddressList addressList = new CellRangeAddressList(1, 10, 0, 0);
// 드롭다운 목록 옵션 설정String[] options = {"옵션1", "옵션2", "옵션3"};
DataValidationConstraint constraint = dvHelper.createExplicitListConstraint(options);
// 유효성 검사 생성 및 적용
DataValidation validation = dvHelper.createValidation(constraint, addressList);
validation.setShowErrorBox(true);
sheet.addValidationData(validation);
- 최종적으로 생성된 유효성 검사 규칙을 나타내는 클래스입니다. 오류 메시지, 입력 메시지 등을 설정하고 시트에 적용할 수 있습니다
// DataValidationHelper 생성
DataValidationHelper validationHelper = sheet.getDataValidationHelper();
// 유효성 검사를 적용할 셀 범위 설정 (A2:A10)
CellRangeAddressList addressList = new CellRangeAddressList(1, 10, 0, 0);
// 드롭다운 목록으로 사용할 데이터 설정
String[] allowedValues = {"Option 1", "Option 2", "Option 3"};
DataValidationConstraint constraint = validationHelper.createExplicitListConstraint(allowedValues);
// DataValidation 생성 및 설정
DataValidation validation = validationHelper.createValidation(constraint, addressList);
// 오류 메시지 설정
validation.setErrorStyle(DataValidation.ErrorStyle.STOP);
validation.setShowErrorBox(true);
validation.setErrorTitle("입력 오류");
validation.setError("목록에서 값을 선택해주세요.");
// 입력 메시지 설정
validation.setShowPromptBox(true);
validation.setPromptTitle("선택 안내");
validation.setPrompt("드롭다운 목록에서 항목을 선택하세요.");
// 시트에 유효성 검사 추가
sheet.addValidationData(validation);
2. 모든 셀에 테두리 적용하였습니다. - 50행까지 순회하면서 각 셀에 테두리를 적용하였습니다. - 빈 행이나 셀이 있다면 새로 생성하였습니다. - 헤더행(첫 번째 행)을 제외한 모든 셀에 테두리 스타일을 적용하였습니다.
// 나머지 셀들을 위한 테두리 스타일
CellStyle borderStyle = workbook.createCellStyle();
borderStyle.setBorderTop(BorderStyle.THIN);
borderStyle.setBorderBottom(BorderStyle.THIN);
borderStyle.setBorderLeft(BorderStyle.THIN);
borderStyle.setBorderRight(BorderStyle.THIN);
// 모든 셀에 테두리 적용for (int row = 0; row <= 50; row++) {
Row currentRow = sheet.getRow(row);
if (currentRow == null) {
currentRow = sheet.createRow(row);
}
for (int col = 0; col < headers.length; col++) {
Cell cell = currentRow.getCell(col);
if (cell == null) {
cell = currentRow.createCell(col);
}
if (row != 0) { // 첫 번째 행(헤더)가 아닌 경우에만 borderStyle 적용
cell.setCellStyle(borderStyle);
}
}
}
💡 나머지 영역에 대해서 border가 적용이 되었습니다.
4) 엑셀 입력 필터 적용
1. 필터 선택 적용
💡 필터 선택 적용 - Excel 파일에서 데이터 유효성 검사(validation)를 설정하는 부분입니다.
1. 사용자 관계 필드에 드롭다운 선택 목록을 추가하였습니다. 2. 1행부터 50행까지, 3번째 열(인덱스 2)에 유효성 검사를 적용하였습니다. 3. 선택 가능한 옵션으로 "본인", "모", "부", "조모", "조부"를 설정하였습니다. 4. 잘못된 값이 입력될 경우 오류 메시지를 표시하도록 설정하였습니다.
- 이렇게 설정하면 해당 셀에서는 지정된 다섯 가지 옵션 중에서만 선택이 가능하며, 다른 값은 입력할 수 없게 됩니다.
DataValidationHelper dvHelper = sheet.getDataValidationHelper();
// 사용자 관계 선택 목록 설정
CellRangeAddressList relationAddressList = new CellRangeAddressList(1, 50, 2, 2);
String[] relationships = {"본인", "모", "부", "조모", "조부"};
DataValidationConstraint relationConstraint = dvHelper.createExplicitListConstraint(relationships);
DataValidation relationValidation = dvHelper.createValidation(relationConstraint, relationAddressList);
relationValidation.setShowErrorBox(true);
sheet.addValidationData(relationValidation);
💡 필터를 적용하여 selecbox가 출력이 된 모습
💡 유효성 검증 실패 시 메시지 출력
2. formatting 적용 방법 : 핸드폰 번호
💡 formatting 적용 방법 : 핸드폰 번호
- 선택하신 코드는 Apache POI를 사용하여 엑셀 파일의 전화번호 형식을 설정하는 코드입니다.
1. 전화번호 형식 설정 (000-0000-0000 패턴) 하였습니다. 2. 50개 행에 대해 전화번호 스타일 적용하였습니다. 3. 모든 셀에 테두리 스타일 적용 (상/하/좌/우) 하였습니다.
- 이 코드를 적용하면 숫자로 입력된 전화번호가 자동으로 000-0000-0000 형식으로 변환되어 표시됩니다.
// 사용자 연락처 셀 형식 설정
CellStyle phoneStyle = workbook.createCellStyle();
DataFormat phoneFormat = workbook.createDataFormat();
phoneStyle.setDataFormat(phoneFormat.getFormat("000-0000-0000")); // 전화번호 형식 적용// 사용자 연락처 열에 형식 적용for (int row = 1; row <= 50; row++) {
Cell phoneCell = sheet.getRow(row).getCell(3);
phoneCell.setCellStyle(phoneStyle);
}
// 테두리 설정 추가
phoneStyle.setBorderTop(BorderStyle.THIN);
phoneStyle.setBorderBottom(BorderStyle.THIN);
phoneStyle.setBorderLeft(BorderStyle.THIN);
phoneStyle.setBorderRight(BorderStyle.THIN);
💡 아래와 같이 숫자로 입력을 한 경우
💡 아래와 같이 formatting이 적용이 됩니다.
3. 전화번호 형식 유효성 검증
💡 전화번호 형식 유효성 검증 - 선택하신 코드는 Apache POI를 사용하여 엑셀 파일의 전화번호 형식과 유효성 검증을 설정하는 부분입니다.
1. 전화번호 형식 설정 (000-0000-0000 패턴) 하였습니다. 2. 테두리 스타일 적용(상/하/좌/우) 하였습니다. 3. 유효성 검증 - 전화번호 길이가 13자리(하이픈 포함)인지 확인 - 잘못된 형식 입력 시 오류 메시지 표시
- 유효성 검사 실패 시 데이터 입력 차단이 코드가 적용되면 사용자는 올바른 전화번호 형식으로만 데이터를 입력할 수 있으며, 잘못된 형식 입력 시 오류 메시지가 표시됩니다.
// 사용자 연락처 셀 형식 설정
CellStyle phoneStyle = workbook.createCellStyle();
DataFormat phoneFormat = workbook.createDataFormat();
phoneStyle.setDataFormat(phoneFormat.getFormat("000-0000-0000")); // 전화번호 형식 적용// 테두리 설정 추가
phoneStyle.setBorderTop(BorderStyle.THIN);
phoneStyle.setBorderBottom(BorderStyle.THIN);
phoneStyle.setBorderLeft(BorderStyle.THIN);
phoneStyle.setBorderRight(BorderStyle.THIN);
/*
* 4. 사용자 연락처 유효성 검증 추가
*/
CellRangeAddressList phoneAddressList = new CellRangeAddressList(1, 50, 3, 3);
DataValidationConstraint phoneConstraint = dvHelper.createTextLengthConstraint(
DataValidationConstraint.OperatorType.EQUAL,
"13", // 000-0000-0000 형식의 길이null
);
DataValidation phoneValidation = dvHelper.createValidation(phoneConstraint, phoneAddressList);
phoneValidation.setShowErrorBox(true);
phoneValidation.setErrorStyle(DataValidation.ErrorStyle.STOP);
phoneValidation.createErrorBox("입력 오류", "올바른 전화번호 형식(000-0000-0000)으로 입력해주세요.");
sheet.addValidationData(phoneValidation);
// 사용자 연락처 열에 형식 적용for (int row = 1; row <= 50; row++) {
Cell phoneCell = sheet.getRow(row).getCell(3);
phoneCell.setCellStyle(phoneStyle);
}
💡 잘못된 형식으로 입력을 한 경우
💡 아래와 같이 오류 메시지가 출력이 됩니다.
4. 숫자만 입력 허용
💡 숫자만 입력 허용
- Excel 파일에서 숫자 입력에 대한 유효성 검증을 설정하는 부분입니다
1. 1~50행의, 첫 번째 열(0번 인덱스)에 대해 숫자 입력 제한을 설정하였습니다. 2. 허용되는 숫자 범위는 0에서 99999999까지 지정하였습니다. 3. 숫자가 아닌 값을 입력하면 "입력 오류" 메시지가 표시되며 "숫자만 입력이 가능합니다"라는 안내문이 출력됩니다.
- 이렇게 설정하면 지정된 셀 범위에 숫자만 입력할 수 있으며, 다른 형식의 데이터는 입력이 제한됩니다.
- Apache POI를 사용하여 엑셀 파일에서 앞자리 0을 허용하는 설정을 구현하였습니다.
- CellStyle과 DataFormat을 생성하여 "0000" 형식을 설정합니다. 이는 4자리 숫자를 표시하며 앞자리에 0이 올 수 있도록 합니다. - 셀에 테두리 스타일을 적용합니다 (상/하/좌/우) - 1~50행의 첫 번째 열(0번 인덱스)에 이 스타일을 적용합니다
- 이 방식으로 표시되는 것은 형식적인 것이며, 실제 값은 숫자 그대로 유지된다는 점에 주의해야 합니다
/*
* 1. "사용자 번호" 유효성 검증
*/
CellStyle attendanceStyle = workbook.createCellStyle();
DataFormat attendanceFormat = workbook.createDataFormat();
attendanceStyle.setDataFormat(attendanceFormat.getFormat("0000")); // 0 허용 추가// 테두리 설정 추가
attendanceStyle.setBorderTop(BorderStyle.THIN);
attendanceStyle.setBorderBottom(BorderStyle.THIN);
attendanceStyle.setBorderLeft(BorderStyle.THIN);
attendanceStyle.setBorderRight(BorderStyle.THIN);
// 사용자 번호 열에 형식 적용for (int row = 1; row <= 50; row++) {
Cell attendanceCell = sheet.getRow(row).getCell(0);
attendanceCell.setCellStyle(attendanceStyle);
}
💡 아래와 같이 111을 입력하였을 때
💡 아래와 같이 0111로 입력이 됩니다. 그러나 사실상 값은 111이기에 후 처리가 필요합니다.
💡 “0101”로 입력하였을 때 앞자리에 0이 입력이 됨을 확인하였습니다.
5. 숫자 + 앞자리 0 허용
💡 숫자 + 앞자리 0 허용
1. 앞자리 0 허용 설정 - "0000" 형식을 사용하여 4자리 숫자를 표시 - 앞자리에 0이 올 수 있도록 설정셀에 기본 테두리 스타일 적용하였습니다.
2. 숫자 유효성 검증 - 1~50행의 첫 번째 열에 대해 숫자 입력 제한 설정하였습니다. - 0부터 99999999 사이의 숫자만 입력 가능 - 잘못된 입력 시 "숫자만 입력이 가능합니다" 오류 메시지 표시하였습니다.
- 이렇게 함으로써 사용자 번호 필드는 앞자리에 0을 포함할 수 있으면서도 숫자만 입력되도록 제한됩니다.
/*
* 1. "사용자 번호" 유효성 검증
*/
CellStyle attendanceStyle = workbook.createCellStyle();
DataFormat attendanceFormat = workbook.createDataFormat();
attendanceStyle.setDataFormat(attendanceFormat.getFormat("0000")); // 0 허용 추가// 테두리 설정 추가
attendanceStyle.setBorderTop(BorderStyle.THIN);
attendanceStyle.setBorderBottom(BorderStyle.THIN);
attendanceStyle.setBorderLeft(BorderStyle.THIN);
attendanceStyle.setBorderRight(BorderStyle.THIN);
// 사용자 번호 열에 형식 적용for (int row = 1; row <= 50; row++) {
Cell attendanceCell = sheet.getRow(row).getCell(0);
attendanceCell.setCellStyle(attendanceStyle);
}
// 숫자만 입력 가능하도록 유효성 검증 추가
CellRangeAddressList addressList = new CellRangeAddressList(1, 50, 0, 0);
DataValidationConstraint constraint = dvHelper.createNumericConstraint(
DataValidationConstraint.ValidationType.INTEGER,
DataValidationConstraint.OperatorType.BETWEEN,
"0",
"99999999"
);
DataValidation validation = dvHelper.createValidation(constraint, addressList);
validation.setShowErrorBox(true);
validation.setErrorStyle(DataValidation.ErrorStyle.STOP);
validation.createErrorBox("입력 오류", "숫자만 입력이 가능합니다.");
sheet.addValidationData(validation);
💡 숫자에 대한 유효성 검증을 수행합니다.
💡 “0030” 값에 대해서 00에 대한 허용을 수행하였습니다
5) 전체 적용 코드 확인
💡 전체 적용 코드 확인
- 위에와 같이 구성한 엑셀 스타일/필터에 대한 구성방법에 대한 코드를 확인해 봅니다.
1. excelDownload.html
💡 excelDownload.html
- Thmeleaf 기반의 엑셀 다운로드 함수를 동작하기 위한 화면입니다. - 템플릿 다운로드 버튼 클릭 시 '/excel/template-download' 엔드포인트로 POST 요청을 보냅니다 - 서버로부터 받은 응답을 blob 형태로 변환하여 '사용자 등록(양식).xlsx' 파일로 다운로드합니다 - 에러 발생 시 콘솔에 오류 메시지를 출력합니다