개발새발

[spring] list에 뿌려진 데이터 excel download 본문

[YOGOJOGO]

[spring] list에 뿌려진 데이터 excel download

재래김유진 2020. 10. 29. 17:20
728x90
반응형

*Color Scripter 사용에 불편이 있어 줄맞춤을 직접 띄워쓰기로 한점 참고 해주십셔,,

 

 

 

 자자자, 화면에 뿌려진 리스트 데이터들을 excel 파일로 만들고 싶다구여? 

 

먼저, jsp에 엑셀다운로드 버튼을 만들어줍니다,, 

예를들어, input태그의 type="submit" 버튼을 쓴다고 하면 

 

 

1. jsp

<form action="/examples/test/excelDown.do" method="post">
   .
   .
   .
   <input type="submit" value='엑셀 다운로드'>
</form>

: 엑셀 다운로드 버튼을 누르면 form태그에 있는 action을 타겠쥬?

 

 

 

2. controller

@RequestMapping(value = "/examples/test/excelDown.do")

@ResponseBody

public void excelDown(@ModelAttribute TestVO testVO, HttpServletResponse response
                                                    , HttpServletRequest request) throws Exception{

   testService.excelDown(testVO, response);

}

: controller에서 excelDown 메소드를 타서 testService에 있는 excelDown메소드를 찾습니다. 

 

 

 

3. service

void excelDown(TestVO testVO, HttpServletResponse response) throws Exception;

 

 

4. serviceImpl

@Service("testService")

@Transactional

public class testServiceImpl implements TestService{

 

   @Autowired

   private TestMapper testDao;

   @Override

   public void excelDown(TestVO testVO, HttpServletResponse response) throws Exception {

 

   List<TestVO> testList = testDao.selectTestList(testVO);

 

   try {

      //Excel Down 시작

      Workbook workbook = new HSSFWorkbook();

 

      //시트생성

      Sheet sheet = workbook.createSheet("***_관리");

 

      //행, 열, 열번호

      Row row = null;

      Cell cell = null;

      int rowNo = 0;

 

      // 테이블 헤더용 스타일

      CellStyle headStyle = workbook.createCellStyle();

      // 가는 경계선을 가집니다.

      headStyle.setBorderTop(BorderStyle.THIN);

      headStyle.setBorderBottom(BorderStyle.THIN);

      headStyle.setBorderLeft(BorderStyle.THIN);

      headStyle.setBorderRight(BorderStyle.THIN);

      // 배경색은 노란색입니다.

      headStyle.setFillForegroundColor(HSSFColorPredefined.YELLOW.getIndex());

      headStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

      // 데이터용 경계 스타일 테두리만 지정

      CellStyle bodyStyle = workbook.createCellStyle();

      bodyStyle.setBorderTop(BorderStyle.THIN);

      bodyStyle.setBorderBottom(BorderStyle.THIN);

      bodyStyle.setBorderLeft(BorderStyle.THIN);

      bodyStyle.setBorderRight(BorderStyle.THIN);

 

      // 헤더명 설정

      String[] headerArray = {"NO", "제목","내용","등록일","등록자","사용여부"};

      row = sheet.createRow(rowNo++);

      for(int i=0; i<headerArray.length; i++) {

      cell = row.createCell(i);

      cell.setCellStyle(headStyle);

      cell.setCellValue(headerArray[i]);

      }

 

      for(TestVO excelData : testList ) {

 

      row = sheet.createRow(rowNo++);

      cell = row.createCell(0);

      cell.setCellStyle(bodyStyle);

      cell.setCellValue(excelData.getRowNum());

 

      cell = row.createCell(1);

      cell.setCellStyle(bodyStyle);

      cell.setCellValue(excelData.getTitle());

      cell = row.createCell(2);

      cell.setCellStyle(bodyStyle);

      cell.setCellValue(excelData.getCnts());

 

      cell = row.createCell(3);

      cell.setCellStyle(bodyStyle);

      cell.setCellValue(excelData.getRegDt());

 

      cell = row.createCell(4);

      cell.setCellStyle(bodyStyle);

      cell.setCellValue(excelData.getRegNm());

 

      cell = row.createCell(5);

      cell.setCellStyle(bodyStyle);

      cell.setCellValue(excelData.getUseYn());

      }

 

      // 컨텐츠 타입과 파일명 지정

      response.setContentType("ms-vnd/excel");

      response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode("***_관리.xls", "UTF8"));

 

      // 엑셀 출력

      workbook.write(response.getOutputStream());

      workbook.close();

      } catch (Exception e) {

      e.printStackTrace();

      }

 

      }

}

: serviceImpl에서 excel에 보여질 셀들을 그려주고 

헤더명에 맞는 컬럼들을 향상된 포문을 돌려 데이터를 가져옵니다

 

 

 

5. mapper

List<TestVO> selectTestList(TestVO testVO) throws Exception;

: 쿼리는 따로 만들지 않고 리스트가져오는 쿼리를 그대로 쓰면 되겠쥬?

 

 

 

6. xml (mariadb)

//sql-config.xml에서 설정을 해주면 별칭으로 testVO라고 쓸 수 있음

<select id="selectTestList" parameterType="testVO" resultType="testVO">

     <include refid="common.pagingTop" />

     SELECT (row_number() over()) as rowNum

        , BOARD_ID

        , TITLE

        , CNTS

        , START_DISP_DT

        , END_DISP_DT

        , CONCAT(STR_TO_DATE(START_DISP_DT, '%Y%m%d'), ' ~ ', STR_TO_DATE(END_DISP_DT, '%Y%m%d')) as topStartEndDispDT

        , USE_YN

        , DEL_YN

        , DATE_FORMAT(REG_DT, '%Y-%m-%d') AS REG_DT

        , REG_NM

        , UPD_DT

        , UPD_NO

     FROM board

       <where>

       <if test="startDispDt != null and startDispDt != '' and endDispDt != null and endDispDt != ''">

           STR_TO_DATE(START_DISP_DT, '%Y%m%d') <![CDATA[>=]]> #{startDispDt}

           AND STR_TO_DATE(END_DISP_DT, '%Y%m%d') <![CDATA[<=]]> #{endDispDt}

       </if>

       <if test="title != null and title != ''">

           AND TITLE LIKE '%' #{title} '%'

       </if>

       <if test="useYn != null and useYn != ''">

           AND USE_YN = #{useYn}

       </if>

           AND DEL_YN = 'N'

       </where>

       <include refid="common.pagingBttom" />

</select>

 

good,, 



728x90
반응형
Comments