티스토리 뷰

JAVA

엑셀 다운로드 (AbstractXlsxView)

wldnjd2 2022. 9. 8. 09:08
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 라이브러리를 통해서 엑셀 출력을 구현한다.

이때 나는 기존의 엑셀 파일을 프로젝트 안에 구현해놨다.

 

아래는 프로젝트 안에 있는 엑셀 파일인데 스타일이 미리 구현되어있다.

스타일을 미리 구현해놓은 파일을 읽어오면 스타일을 코드로 일일히 구현할 필요가 없어진다.

 

listExcel.xls

 

 

 

 

 

 

- 프로젝트안에 파일 경로 지정

 

위의 파일 경로는 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 

 

[JAVA] Apache POI를 사용한 Excel 파일 읽기(대용량 Excel 파일 읽기 포함)

Apache POI를 사용해서 Excel 파일을 읽어들이는 방법에는 4가지 방법이 있다. 1번째 방법 - FileIn...

blog.naver.com

 

https://showbang.github.io/typistShow/2017/01/25/%EC%83%9D%EC%84%B1/

 

POI를 이용하여 엑셀파일 생성하기

POI 이용 엑셀 파일 생성데이터를 넘겨받아 엑셀파일로 만드는 방법에 관해 포스팅을 해보겠습니다. 먼저 POI를 이용하기 위하여 POI라이브러리가 필요합니다. POI jar파일은 http://poi.apache.org/download

showbang.github.io

 

 

https://songjihyeon.tistory.com/25

 

poi - HSSFWorkbook, XSSFWorkbook 호환

엑셀 업로드나 다운로드를 구현하다보면 신경 쓰이는 것이 HSSF, XSSF 이 두가지이다. - 엑셀 97 - 2003 까지는 HSSF - 엑셀 2007 이상은 XSSF HSSF, XSSF를 신경쓰지 않고 한방에 처리할 수 있는 방법이 바로

songjihyeon.tistory.com

 

 

https://huskdoll.tistory.com/795

 

java excel poi (눈금선,병합,배경색,테두리,글씨체,사이즈,금액,천단위)

java에서 exel 파일 만들때 병합이라든지 폰트등 세세한 설정을 보여주는 예제 입니다. 일단 아래와 같은 파일을 생성하는 소스 입니다. 스프링에 엑셀 다운 받는 기능 추가는 다음 링크 참조 http:/

huskdoll.tistory.com

 

 

 

https://toma0912.tistory.com/18

 

AbstractXlsxView를 이용한 엑셀다운로드

안녕하세요. 오늘은 게시판 목록들을 엑셀로 다운로드 할 수 있는 엑셀 다운로드에 대해서 알아보겠습니다. 엑셀 다운로드를 설정하는 방법에는 여러가지 방법이 있지만 저는 AbstractXlsxView를 이

toma0912.tistory.com

 

 

 

댓글