티스토리 뷰
AbstractExcelView
스프링에서 엑셀파일 하는 방법으로 클래스 AbstractExcelView를 상속받아서 기능을 구현하는 방법이 있다.
하지만 AbstractExcelView를 사용할 수 없었다.
찾아보니 스프링 4.2이상에서는 유지보수(deprecated)가 중단되어서 사용할 수 없었다.
내가 사용하는 버전은 4.3.25 이다. (pom.xml에서 스프링 버전을 확인할 수 있다.)
AbstractXlsxView
스프링 4.2 이상에서는 클래스 AbstractXlsxView를 이용해서 엑셀기능을 구현할 수 있다.
0. pom.xml
pom.xml에 Apache Poi dependency 추가
<!-- 엑셀 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.13</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.13</version>
</dependency>
1. Controller
return new ModelAndView("downLoadExcel", excelPram); 을 통해서 2번의 DownLoadExcel 함수로 이동한다.
@RequestMapping(value = "/minwon/downloadMinwonExcel.do")
public ModelAndView selectMinwonExcelList(@ModelAttribute("minwonVO") MinwonVO minwonVO, HttpServletRequest req, HttpServletResponse resp) throws Exception {
List<MinwonVO> selectMinwonExcelList = minwonService.selectMinwonExcelList(minwonVO);
HashMap<String, Object> excelPram = new HashMap<String, Object>();
String excelDir = fileProperties.getProperty("file.excel.template");
excelPram.put("type", "listExcel");
excelPram.put("fileName", "Minwon");
excelPram.put("excelDir", excelDir);
excelPram.put("resultList", selectMinwonExcelList);
excelPram.put("excelName", "_리스트");
return new ModelAndView("downLoadExcel", excelPram);
}
2. DownLoadExcel
엑셀파일 생성 코드
public class DownLoadExcel extends AbstractXlsxView {
@Override
protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request,
HttpServletResponse response) throws Exception {
//서버에서 다루는 확장자명이 어떤형식의자료형인지 알려줌 /octet-stream은 8비트로 된 데이터라는 뜻
response.setContentType("application/octet-stream");
//컨트롤러의 excelParam에서 값을 가져와야함
String type = (String)model.get("type");
if(type==null) {
return;
}
//리스트출력
if(type.equals("listExcel")){
String fileName = (String) model.get("fileName");
//엑셀 다운로드
if(fileName.equals("Chse")) {
excelChseList(model, workbook, request, response);
}
}
}
/**
* 엑셀 다운로드 시작
*/
private void excelChseList(Map<String, Object> model, Workbook workbook, HttpServletRequest request,
HttpServletResponse response)throws Exception {
/*
* 데이터 가져오기
*/
//엑셀 샘플 파일 경로
String excelDir = (String) model.get("excelDir");
//엑셀파일명
String type = (String) model.get("type");
//엑셀파일 이름
String excelName = (String) model.get("excelName");
//결과리스트
List<ChseVO> resultList = (List<ChseVO>) model.get("resultList");
/*?????*/ //저장핳ㄹ 경로설정인가?
//현재시간
String sCurTime = new SimpleDateFormat("yyyyMMdd", Locale.KOREA).format(new Date());
String userAgent = request.getHeader("User-Agent");
String fileName = sCurTime + excelName + ".xls";
if(userAgent.indexOf("MSIE") > -1){
fileName = URLEncoder.encode(fileName, "utf-8");
}else{
fileName = URLEncoder.encode(fileName, "utf-8");
}
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";");
response.setHeader("Content-Transfer-Encoding", "binary");
/*?????*/
//파일 경로
String inputFilePath = request.getServletContext().getRealPath(excelDir + type + ".xls");
//파일 읽어오기 =>>>>> 이거는 XSSF가 안됨
// FileInputStream fis = new FileInputStream(inputFilePath);
// //workbook 객체 생성
// XSSFWworkbook = new XSSFWorkbook(fis);
workbook = WorkbookFactory.create(new File(inputFilePath));
//시트 객체 생성, 1번시트
Sheet sheet = workbook.getSheetAt(0);
//초기화
Row row = null;
Cell cell = null;
//스타일
CellStyle title = workbook.createCellStyle();//제목
CellStyle columns = workbook.createCellStyle();//컬럼명
CellStyle dataList = workbook.createCellStyle();//테이터
//스타일 설정
//엑셀 파일을열어보면 스타일이 이미 파일에 설정되어있다. 따라서 그 값을 불러와서 사용해주는것.
// workbook.createSheet("sheet1"); //워크시트 이름 설정
//제목
row = sheet.getRow(2);
cell = row.getCell(1);
title = cell.getCellStyle();
//컬럼명
row = sheet.getRow(6);
cell = row.getCell(0);
columns = cell.getCellStyle();
//테이터
row = sheet.getRow(7);
cell = row.getCell(0);
dataList = cell.getCellStyle();
/*
* 타이틀 값 입력
*/
row = sheet.createRow(2);
cell = row.createCell(0);
cell.setCellValue("폐기물수거함관리 검색결과 리스트");
cell.setCellStyle(title);
//장비맥주소
row = sheet.getRow(6);
cell = row.createCell(0);
cell.setCellValue("장비맥주소");
cell.setCellStyle(columns);
//거점명
row = sheet.getRow(6);
cell = row.createCell(1);
cell.setCellValue("거점명");
cell.setCellStyle(columns);
//장비모델명
row = sheet.getRow(6);
cell = row.createCell(2);
cell.setCellValue("장비모델명");
cell.setCellStyle(columns);
//장비모델타입
row = sheet.getRow(6);
cell = row.createCell(3);
cell.setCellValue("장비모델타입");
cell.setCellStyle(columns);
//폐기물형태
row = sheet.getRow(6);
cell = row.createCell(4);
cell.setCellValue("폐기물형태");
cell.setCellStyle(columns);
//시명
row = sheet.getRow(6);
cell = row.createCell(5);
cell.setCellValue("시명");
cell.setCellStyle(columns);
//행정동명
row = sheet.getRow(6);
cell = row.createCell(6);
cell.setCellValue("행정동명");
cell.setCellStyle(columns);
//상세주소
row = sheet.getRow(6);
cell = row.createCell(7);
cell.setCellValue("상세주소");
cell.setCellStyle(columns);
//비고
row = sheet.getRow(6);
cell = row.createCell(8);
cell.setCellValue("비고");
cell.setCellStyle(columns);
/*
* 리스트 값
*/
ChseVO resultMap;
String value = null;
for(int i = 0; i < resultList.size(); i++){
// 3만줄 넘으면 멈춤.
if(i>30000){
break;
}
resultMap = resultList.get(i);
row = sheet.createRow(i+7);
//장비맥주소
value = String.valueOf(resultMap.getEqt_mac_addr());
cell = row.createCell(0);
cell.setCellStyle(dataList);
if(value != null && !value.equals("null")){
cell.setCellValue(value);
}
//거점명
value = String.valueOf(resultMap.getBs_nm());
cell = row.createCell(1);
cell.setCellStyle(dataList);
if(value != null && !value.equals("null")){
cell.setCellValue(value);
}
//장비모델명
value = String.valueOf(resultMap.getModel_nm());
cell = row.createCell(2);
cell.setCellStyle(dataList);
if(value != null && !value.equals("null")){
cell.setCellValue(value);
}
//장비모델타입
value = String.valueOf(resultMap.getModel_typ());
cell = row.createCell(3);
cell.setCellStyle(dataList);
if(value != null && !value.equals("null")){
cell.setCellValue(value);
}
//폐기물종류
value = String.valueOf(resultMap.getWst_typ());
cell = row.createCell(4);
cell.setCellStyle(dataList);
if(value != null && !value.equals("null")){
cell.setCellValue(value);
}
//시명
value = String.valueOf(resultMap.getSido());
cell = row.createCell(5);
cell.setCellStyle(dataList);
if(value != null && !value.equals("null")){
cell.setCellValue(value);
}
//행정동명
value = String.valueOf(resultMap.getHnm());
cell = row.createCell(6);
cell.setCellStyle(dataList);
if(value != null && !value.equals("null")){
cell.setCellValue(value);
}
//상세주소
value = String.valueOf(resultMap.getPtn_addr());
cell = row.createCell(7);
cell.setCellStyle(dataList);
if(value != null && !value.equals("null")){
cell.setCellValue(value);
}
//비고
value = String.valueOf(resultMap.getRmk());
cell = row.createCell(8);
cell.setCellStyle(dataList);
if(value != null && !value.equals("null")){
cell.setCellValue(value);
}
}
OutputStream fos = response.getOutputStream();
workbook.write(fos);
fos.close();
}
4. Apache Poi
- listExcel.xls
Apache Poi 라이브러리를 통해서 엑셀 출력을 구현한다.
이때 나는 기존의 엑셀 파일을 프로젝트 안에 구현해놨다.
아래는 프로젝트 안에 있는 엑셀 파일인데 스타일이 미리 구현되어있다.
스타일을 미리 구현해놓은 파일을 읽어오면 스타일을 코드로 일일히 구현할 필요가 없어진다.
- 프로젝트안에 파일 경로 지정
위의 파일 경로는 file.properties 라는 파일에 아래와 같이 명시해놨다.
file.excel.template = WEB-INF/excel
- 프로젝트 안의 파일의 경로를 읽어오는법
1) FileInputStream() 객체를 사용해서 읽어오기
FileInputStream file = new FileInputStream(new File("파일경로"));
XSSFWorkbook workbook = new XSSFWorkbook(file)
=> XSSF 는 엑셀 2007 이상
FileInputStream file = new FileInputStream(new File("파일경로"));
HSSFWorkbook workbook = new HSSFWorkbook(file);
=> HSSF 2007 이하 버전
2) Files 객체를 사용해서 읽어오기
Workbook workbook = WorkbookFactory.create(new File("파일경로"));
나는 File 객체를 사용해서 파일을 읽었다.
원래는 첫번째의 방법을 쓰려고 했으나,, 이유모를 에러가 났고,
AbstractXlsxView를 상속받아 구현한 메소드의 형식에 Workbook workbook 객체를 생성해주었기 때문에 이를 이용하였다.
아래는 AbstractXlsxView 를 상속받아 구현한 클래스로 매개변수도 그대로해야 오류가 안났음..
protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request,
HttpServletResponse response) throws Exception {
3) 내가 구현한 방식
File 객체를 이용해서 구현하였는데 아래와 같다.
//파일경로
String inputFilePath = request.getServletContext().getRealPath(excelDir + type + ".xls");
workbook = WorkbookFactory.create(new File(inputFilePath));
5. Style
이미 스타일을 지정해놨기 때문에 그스타일을 불러와서 적용시켜줘야한다.
따라서 getRow, getCell, getCellStyle 을 사용해서 스타일을 각각의 변수에 넣어주었다.
//제목
row = sheet.getRow(2);
cell = row.getCell(1);
title = cell.getCellStyle();
//컬럼명
row = sheet.getRow(6);
cell = row.getCell(0);
columns = cell.getCellStyle();
//테이터
row = sheet.getRow(7);
cell = row.getCell(0);
dataList = cell.getCellStyle();
6. 데이터 넣기
/*
* 타이틀 값 입력
*/
row = sheet.createRow(2);
cell = row.createCell(0);
cell.setCellValue("폐기물수거함관리 검색결과 리스트");
cell.setCellStyle(title);
/*
* 컬럼 값 입력
*/
row = sheet.getRow(6);
cell = row.createCell(0);
cell.setCellValue("장비맥주소");
cell.setCellStyle(columns);
//
row = sheet.getRow(6);
cell = row.createCell(1);
cell.setCellValue("거점명");
cell.setCellStyle(columns);
//
row = sheet.getRow(6);
cell = row.createCell(2);
cell.setCellValue("장비모델명");
cell.setCellStyle(columns);
//
row = sheet.getRow(6);
cell = row.createCell(3);
cell.setCellValue("장비모델타입");
cell.setCellStyle(columns);
//
row = sheet.getRow(6);
cell = row.createCell(4);
cell.setCellValue("폐기물형태");
cell.setCellStyle(columns);
tiltle이라는 변수에 저장해놓은 스타일을 cell.setCellStyle(title); 을 통해서 스타일을 지정했음을 확인할 수 있다.
- createRow, createCell
처음 데이터를 입력했을때 createRow와 createCell을 통해서 셀을 만들어야함.
setRow setCell하면 에러남...
Ref.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=hyoun1202&logNo=220245067954
https://showbang.github.io/typistShow/2017/01/25/%EC%83%9D%EC%84%B1/
https://songjihyeon.tistory.com/25
https://huskdoll.tistory.com/795
https://toma0912.tistory.com/18
'JAVA' 카테고리의 다른 글
드래그앤드롭 이벤트 (1) | 2022.12.13 |
---|---|
자바1.8, ORACLE 1.9c (0) | 2022.11.29 |
POI를 이용해 엑셀 파일 수정하기 (0) | 2022.06.15 |
JAVA POI 라이브러리 사용 시 레코드 값 제거 에러해결 (0) | 2022.06.13 |
API Server Test 01 | postman 사용 (0) | 2022.06.03 |
- Total
- Today
- Yesterday
- 엑셀POI
- SVN
- jdbcType
- svn프로젝트불러오기
- yumrepository
- Postgis
- apachepoi
- 공간데이터병합
- CreateCell
- yumdownloader
- Some resources were not updated.
- getCell
- OpenLayers
- Centos7에서 Postgresql12 설치
- 인터넷안되는환경에서설치
- 리눅스폐쇄망
- postgis 설치
- su postgres 안됨
- shp2pgsql
- 부하측정
- 공간데이터
- Geoserver
- createRow
- 폐쇄망에서rpm설치
- 폐쇄망에서패키지설치
- Postgresql12
- 리눅스
- setForceFormulaRecalculation
- getRow
- mybatisif
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |