본문 바로가기
JAVA

[Java] 엑셀 다운로드 기능 구현!! (영상 有)

by GoodDayDeveloper 2021. 11. 27.
반응형

안녕하세요. 오늘은 자바로 데이터베이스에 있는 데이터를 자바를 통해

엑셀화시켜서 엑셀 데이터를 다운로드 받는 방법에 대해 정리해보겠습니다.

글로 아무리 설명해봐야 보는게 최고죠! 구현 영상입니다.

 

 

 

pom.xml

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
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.9</version>
</dependency>
    <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-contrib</artifactId>
    <version>3.6</version>
    <exclusions>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
    </dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.9</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>3.9</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>3.9</version>
</dependency>
cs

여기서 정리할 엑셀 다운로드 기능은 아파치 소프트웨어 재단에서 만든 POI라이브러리를 사용할 예정입니다.

우선 pom.xml에서 라이브러리를 설저해줍니다.

 

 

 

controller

1
2
3
4
5
6
7
@RequestMapping(value = "/adms/reserve/management/excelDown.do")
public void Excel(@ModelAttribute("searchVO") tbl_reserveVO searchVO, HttpServletRequest request, HttpServletResponse response, ModelMap model) throws Exception {
 
    reserveService.getReserveExcel(searchVO, request, response);
 
}
 
cs

컨트롤러에서는 vo와 request와 response를 서비스구현단계로 넘겨주는 역할을 할 겁니다.

구현은 서비스 구현단계에서 할 예정입니다.

 

 

service

1
void getReserveExcel(tbl_reserveVO searchVO, HttpServletRequest request, HttpServletResponse response) throws Exception;
cs

서비스 선언을 해주고요

 

 

 

serviceImpl

1
2
3
4
5
6
7
8
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
cs

임포트 부분입니다.

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
private void setHeaderCS(CellStyle cs, Font font, Cell cell) {
  cs.setAlignment(CellStyle.ALIGN_CENTER);
  cs.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
  cs.setBorderTop(CellStyle.BORDER_THIN);
  cs.setBorderBottom(CellStyle.BORDER_THIN);
  cs.setBorderLeft(CellStyle.BORDER_THIN);
  cs.setBorderRight(CellStyle.BORDER_THIN);
  cs.setFillForegroundColor(HSSFColor.GREY_80_PERCENT.index);
  cs.setFillPattern(CellStyle.SOLID_FOREGROUND);
  setHeaderFont(font, cell);
  cs.setFont(font);
  cell.setCellStyle(cs);
}
 
private void setHeaderFont(Font font, Cell cell) {
  font.setBoldweight((short700);
  font.setColor(HSSFColor.WHITE.index);
}
 
private void setCmmnCS2(CellStyle cs, Cell cell) {
  cs.setAlignment(CellStyle.ALIGN_LEFT);
  cs.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
  cs.setBorderTop(CellStyle.BORDER_THIN);
  cs.setBorderBottom(CellStyle.BORDER_THIN);
  cs.setBorderLeft(CellStyle.BORDER_THIN);
  cs.setBorderRight(CellStyle.BORDER_THIN);
  cell.setCellStyle(cs);
}
 
 
@Override
public void getReserveExcel(tbl_reserveVO searchVO, HttpServletRequest request, HttpServletResponse response) throws Exception {
List<tbl_reserveVO> list = dao.getReserveExcel(searchVO);
  
  SXSSFWorkbook wb = new SXSSFWorkbook();
  Sheet sheet = wb.createSheet();
  sheet.setColumnWidth((short0, (short2000);
  sheet.setColumnWidth((short1, (short8000);
  sheet.setColumnWidth((short2, (short3000);
  sheet.setColumnWidth((short3, (short3000);
  sheet.setColumnWidth((short4, (short8000);
  sheet.setColumnWidth((short5, (short5000);
  sheet.setColumnWidth((short6, (short3000);
  
  Row row = sheet.createRow(0);
  Cell cell = null;
  CellStyle cs = wb.createCellStyle();
  Font font = wb.createFont();
  cell = row.createCell(0);
  cell.setCellValue("예약신청 관리 - 예약신청 리스트");
  setHeaderCS(cs, font, cell);
  sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), 06));
  
  row = sheet.createRow(1);
  cell = null;
  cs = wb.createCellStyle();
  font = wb.createFont();
  
  cell = row.createCell(0);
  cell.setCellValue("번호");
  setHeaderCS(cs, font, cell);
 
  cell = row.createCell(1);
  cell.setCellValue("이름");
  setHeaderCS(cs, font, cell);
  
  cell = row.createCell(2);
  cell.setCellValue("전화번호");
  setHeaderCS(cs, font, cell);
  
  cell = row.createCell(3);
  cell.setCellValue("관람일자");
  setHeaderCS(cs, font, cell);
  
  cell = row.createCell(4);
  cell.setCellValue("프로그램명");
  setHeaderCS(cs, font, cell);
  
  cell = row.createCell(5);
  cell.setCellValue("방문인원");
  setHeaderCS(cs, font, cell);
  
  cell = row.createCell(6);
  cell.setCellValue("예약신청일");
  setHeaderCS(cs, font, cell);
  
 
  int i = 2;
  int ii = list.size();
  for (tbl_reserveVO vo : list) {
      
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String cretDate = sdf.format(vo.getCret_date());
 
  row = sheet.createRow(i);
  cell = null;
  cs = wb.createCellStyle();
  font = wb.createFont();
 
  cell = row.createCell(0);
  cell.setCellValue(ii);
  setCmmnCS2(cs, cell);
  
  cell = row.createCell(1);
  cell.setCellValue(vo.getResv_name());
  setCmmnCS2(cs, cell);
  
  cell = row.createCell(2);
  cell.setCellValue(vo.getResv_tel());
  setCmmnCS2(cs, cell);
  
  cell = row.createCell(3);
  cell.setCellValue(vo.getResv_day_name());
  setCmmnCS2(cs, cell);
  
  cell = row.createCell(4);
  cell.setCellValue(vo.getResv_program_name());
  setCmmnCS2(cs, cell);
  
  cell = row.createCell(5);
  cell.setCellValue(vo.getResv_number());
  setCmmnCS2(cs, cell);
  
  cell = row.createCell(6);
  cell.setCellValue(cretDate);
  setCmmnCS2(cs, cell);
  
  i++;
  ii--;
}
  
  response.setHeader("Set-Cookie""fileDownload=true; path=/");
  response.setHeader("Content-Disposition"String.format("attachment; filename=\"ReserveManageList.xlsx\""));
  wb.write(response.getOutputStream());
 
}
cs

 

여기에다가 구현을 할 생각입니다. 복잡할 것 같지만 생각외로 간단합니다.

setHeaderCS / setHeaderFont / setCmmnCS2 이 세개의 메서드를 사용하여 엑셀을 꾸밉니다.

 

setHeaderCS : 해더의 스타일을 담당합니다.

setHeaderFont : 해더의 스타일의 폰트를 담당합니다.

setCmmnCS2  : 본문 데이터의 스타일을 담당합니다.

 

 

위의 코드는 이런식의 스타일이지만 POI 라이브러리를 활용하시면 더 멋지게 꾸밀 수 있으니 참고해주세요!

그리고 엑셀을 만드는 getReserveExcel 메서드에서는

시트의 열을 설정한다음 해더를 만들고,

반복문으로 데이터를 집어넣어주시면 됩니다.

그리고 마지막으로 write(response.getOutputStream()을 사용하여 출력을 시킵니다.

 

 

dao

1
2
3
public List<tbl_reserveVO> getReserveExcel(tbl_reserveVO searchVO) {
    return selectList("getReserveExcel",searchVO);
}
cs

 

 

xml

1
2
3
4
5
6
<select id="getReserveExcel" parameterType="tbl_reserveVO"  resultType="tbl_reserveVO">
    SELECT 
    *
    FROM tbl_reserve
        Order by resv_idx desc
</select>
cs

 

 

 

반응형

댓글