2016년 12월 9일 금요일

[Spring Boot] JAVA에서 Excel 폼 작성 후, 다운로드 하기


### JAVA에서 Excel 폼 작성 후, 다운로드 하기



# 개발환경 : SPRING BOOT + JPA + MySQL



1. html파일에서 엑셀다운로드 실행위해 엑셀다운로드 버튼 클릭



<button id="xls_btn" type="button" onClick="javascript:goXls()">엑셀다운로드</button>
<script>
    function goXls() {
           location.href="/xls";
      }
</script>


2. Controller 클래스에서 Excel폼을 작성을 위한 데이타를 Map 에 담아서 엑셀폼만드는 Class로 보내기


@Controller

public class XlsController {

    @RequestMapping(value="/xls", method=RequestMethod.GET)  
    public ModelAndView viewExcel(HttpServletRequest request, HttpServletResponse response){
        Map<String, Object> model = new HashMap<String, Object>();
model.put("sheetname", date); //Sheet Name
    
List<String> titles = new ArrayList<String>();
titles.add("예제");
titles.add("");
titles.add("");
model.put("titles", titles); //titles List
    
List<String> headers = new ArrayList<String>(); 
headers.add("목록1");
headers.add("목록2");
headers.add("목록3");
model.put("headers", headers); //headers List
        List<List<String>> bodyList = new ArrayList<List<String>>(); 

List<String> body = new ArrayList<String>(); 
body.add("DATA1");
body.add("DATA2");
body.add("DATA3");
        bodyList.add(body);

        List<String> body = new ArrayList<String>(); 
body.add("DATA1");
body.add("DATA2");
body.add("DATA3");
        bodyList.add(body);

model.put("body", bodyList); //body List
      
      response.setContentType( "application/ms-excel" );
        response.setHeader( "Content-disposition", "attachment; filename=data.xls" );
               
    return new ModelAndView(new MakingExcelForm(), model);
    }
}


3. MakingExcelForm Class에서 엑셀폼 만들기


public class MakingExcelForm extends AbstractExcelView {
  
    @SuppressWarnings("unchecked")
    protected void buildExcelDocument(Map<String, Object> model,
        HSSFWorkbook workbook,
        HttpServletRequest request,
        HttpServletResponse response) {
    
        String sheetName = (String)model.get("sheetname");

        List<String> titles = (List<String>)model.get("titles");
        List<String> headers = (List<String>)model.get("headers");
        List<List<String>> bodyList = (List<List<String>>)model.get("body");
        
        HSSFSheet sheet = workbook.createSheet(sheetName); // create sheet
        sheet.setDefaultColumnWidth((short) 12);
        
        int currentRow = 0;
        int currentColumn = 0;
        
        HSSFCellStyle titleStyle = workbook.createCellStyle(); //title style
        HSSFFont titleFont = workbook.createFont();
        titleFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        titleStyle.setFont(titleFont); 
        
        HSSFCellStyle headerStyle = workbook.createCellStyle(); //header style
        HSSFFont headerFont = workbook.createFont();
        headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        headerStyle.setFont(headerFont); 
        
        HSSFRow titleRow = sheet.createRow(currentRow); // create title row
        for(String titletitles){
            HSSFRichTextString text = new HSSFRichTextString(title);
            HSSFCell cell = titleRow.createCell(currentColumn)
            cell.setCellStyle(titleStyle);
            cell.setCellValue(text);            
            currentColumn++;
        }
        
        currentRow++;
        HSSFRow headerRow = sheet.createRow(currentRow); // create header row
        currentColumn = 0;
        for(String headerheaders){
            HSSFRichTextString text = new HSSFRichTextString(header);
            HSSFCell cell = headerRow.createCell(currentColumn)
            cell.setCellStyle(headerStyle);
            cell.setCellValue(text);            
            currentColumn++;
        }
       
        currentRow++;
        for(List<String> body: bodyList){
            currentColumn = 0;
            HSSFRow row = sheet.createRow(currentRow); // create body row
            for(String value : body){
                HSSFCell cell = row.createCell(currentColumn);
        HSSFRichTextString text = new HSSFRichTextString(value);                
        cell.setCellValue(text);
                currentColumn++;
            }
            currentRow++;
        }
    }
}

4. 참고)
- html에서 jquery ajax 또는 form submit으로 다운로드 버튼 실행하면, 엑셀 파일이 다운로드 되지 않는다. 이유는 잘 모르겠지만, href호출로써만 가능했다.

- html에서 생성된 table dom을 자바스크립트를 사용하여 엑셀로 전환시켜 파일을 다운로드하면, html태그가 엑셀에 모두 표시되면, 그러므로 엑셀에서 셀하나에 모든 문자가 들어가 있는 채로 다운로드되어 제대로 만들어지지 않았다. 결국 자바에서 직접 엑셀 폼을 만들어 다운로드 하는 방법만 되더라.










댓글 없음:

댓글 쓰기