전에 xls 파일 생성후 다운로드 샘플을 포스팅하였다.
위 포스팅의 단점은 엑셀 2003 파일이라서 최대 65,536 row라
10만건 데이터 같은 경우는 Exception이 발생한다.
이런 문제를 해결하기 위해 xlsx 의 샘플링을 추가로 구현하였다.
xlsx의 최대쓰기가능 row는 1,048,576 row다.
하지만 과연 100만건의 데이터를 엑셀로 쓸 이유가 있을까?
그리고 과연 서버+DB가 버텨줄지~~
아무튼 이러한 이유로 xlsx 샘플도 구현을 하였다.
샘플 기준은 xls 샘플링에서 일부 변경으로 다운로드 구현을 하도록 하겠음.
//DB에서 조회한 데이터 LIST객체에 List객체의 제너릭은 Object타입 담는다. List<Object> excelList = service.getExcelList(entity); //getExcelList의 return type은 List타입의 제너릭은 SampleVO로 정함. //문자열 형식의 제목을 excelTtitle변수에 담는다(후에 split을 통해서 배열로 만들것임) String excelTitle = "배열제목1,배열제목2,배열제목3"; //다운받을 파일명 String downFileNm = "시트제목"; XSSFWorkbook wb = new XSSFWorkbook(); //시트 생성 XSSFSheet sheet = wb.createSheet(downFileNm); String titleArr[] = excelTitle.split(","); // 첫번째 행에 각각의 컬럼 제목작성 Cell cell = null; Row row = sheet.createRow(0); for(int titleNo=0; titleNo < titleArr.length; titleNo ++){ cell= row.createCell(titleNo); cell.setCellValue(titleArr[titleNo]); } int i=1; //DB에서 조회한 목록데이터를 담은 LIST객체를 OBJECT타입으로 돌린다 //VO종류가 무엇이든 상관없음? for(Object obj : list) { row = sheet.createRow(i); int j = 0; for (Field field : obj.getClass().getDeclaredFields()) { field.setAccessible(true); Object value = field.get(obj); if(value == null) { cell= row.createCell(j); cell.setCellValue(""); } else { cell= row.createCell(j); cell.setCellValue(String.valueOf(value)); } j++; } i++; } FileOutputStream fileOut = null; try { fileOut = new FileOutputStream("D:\\test.xls"); wb.write(fileOut); fileOut.close(); } catch (IOException e) { throw new RuntimeException("런타임에러가 발생하였습니다."); }
바뀐게 있다면 기존 HSSF -> XSSF 형식으로 앞에 H->X로 변경된점이랑
createRow((short)i) -> short형을 제하고 createRow(i) 로 변경
마지막으로 xls 파일명을 -> xlsx 로 변경이 되었다는 것이다!
10만건을 넣어본결과 파일이 잘 저장된다!
json-simple 라이브러리를 이용한 ObjecToString 과 StringToObject 코드구현 (2) | 2014.07.04 |
---|---|
자바 파일다운로드 - 멀티 브라우저지원 샘플코드 (0) | 2014.06.12 |
엑셀다운 POI 라이브러리 - 엑셀파일에서 내용 읽기 (0) | 2014.06.10 |
게시물 번호 구하기 샘플소스 (0) | 2014.06.09 |
자바 썸네일 이미지 생성 (0) | 2014.06.09 |
db를 조회한 가상의 데이터를 arraylist에 담아주고 해당 리스트로 json object를 만들어보자
서버에서 json object 파싱하여 웹페이지로 전달
ArrayList<Map<String,Object>> list = new ArrayList<Map<String,Object>>(); JSONObject jsonObj = new JSONObject(); JSONObject jsonSubObj = null; JSONArray jsonArr = new JSONArray(); Map<String, Object> map = null; map = new HashMap<String, Object>(); map.put("data1","데이터1-1"); map.put("data2","데이터1-2"); list.add(map); map = new HashMap<String, Object>(); map.put("data1","데이터2-1"); map.put("data2","데이터2-2"); list.add(map); map = new HashMap<String, Object>(); map.put("data1","데이터3 -1"); map.put("data2","데이터3-2"); list.add(map); for(Map<String,Object> m : list) { Set<String> key = map.keySet(); for (Iterator<String> iterator = key.iterator(); iterator.hasNext();) { String k = (String) iterator.next(); String value = (String) map.get(k); jsonSubObj = new JSONObject(); jsonSubObj.put(k, value); } jsonArr.add(jsonSubObj); } jsonObj.put("list",jsonArr); PrintWriter pw = response.getWriter(); pw.print(jsonObj); pw.flush(); pw.close();
위와 같은 형식으로 데이터를 파싱해서 클라이언트로 json 객체를 던져준다면 다음 화면같이
값이 나올것이다.
만약 클라이언트쪽에서 ajax 호출하고 return type을 json으로 받았다면 object로 받을 수 있는
것이다.
문자열을 json object로 변환하는 작업을 해보도록 하겠다..
클라이언트에서 받은 json 문자열을 object로 변환하기
//서버에서 request.getparameter()로 받은 데이터라 가정 String jsonStr = "{\"obj1\":\"obj-1\",\"obj2\":\"obj-2\",\"obj3\":\"obj-3\"}"; if(jsonStr.substring(0,1).equals("{")) { Object obj=JSONValue.parse(jsonStr); JSONObject j=(JSONObject)obj; System.out.println("===========JSON OBJECT STRING -> OBJECT==========="); System.out.println(j.get("obj1")); System.out.println(j.get("obj2")); System.out.println(j.get("obj3")); } //서버에서 request.getparameter()로 받은 데이터라 가정 String jsonArrayStr = "[{\"data2\":\"데이터3-1\"},{\"data2\":\"데이터3-2\"},{\"data2\":\"데이터3-3\"}]"; if(jsonArrayStr.substring(0,1).equals("[")) { Object obj=JSONValue.parse(jsonArrayStr); JSONArray j=(JSONArray)obj; System.out.println("===========JSON ARRAY STRING -> FOR OBJECT==========="); for(int i=0; i<j.size(); i++) { JSONObject json = (JSONObject)j.get(i); System.out.println(json.get("data2")); } }
서버로 임의의 string형 json object / json array 값을 넘겼다 가정하였을때 json object/array
로 변경한 후 콘솔출력을 해보았다.
잘 뽑아진다 ㅎㅎ
POI 라이브러리를 이용하여 엑셀파일(XLSX) 만들기 - 6만건 이상일 경우 추천 (0) | 2014.07.14 |
---|---|
자바 파일다운로드 - 멀티 브라우저지원 샘플코드 (0) | 2014.06.12 |
엑셀다운 POI 라이브러리 - 엑셀파일에서 내용 읽기 (0) | 2014.06.10 |
게시물 번호 구하기 샘플소스 (0) | 2014.06.09 |
자바 썸네일 이미지 생성 (0) | 2014.06.09 |
IE 11은 한글깨짐 현상이 있어서 제어문에서 추가함
몇년전에 파일다운로드 할 일이 생겨서 브라우저 체크는 어떤분 블로그에서 정보를 얻었는데..
어디였는지 기억이 안남 ㅠㅠ
본인은 스프링과 연동을 해서 쓰고 있는 중이라 바이트로 파일을 쓰지 않고,
스프링내에서 지원하는 copy 유틸을 사용해서 다운로드 처리를 하였음.
jsp 또는 다른 프레임워크를 쓰시는 분들은
FileCopyUtils.copy() <<<< 이부분을 변경해주셔야 할듯...
- 다운로드 유틸코드 -
package com.util; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.util.FileCopyUtils; public class FileUtil { public void filDown(HttpServletRequest request, HttpServletResponse response, String filePath, String realFilNm, String viewFileNm) throws IOException { String dftFilePath = request.getSession().getServletContext().getRealPath("/"); File file = new File(dftFilePath + filePath.substring(1) + realFilNm); if (file.exists() && file.isFile()) { response.setContentType("application/octet-stream; charset=utf-8"); response.setContentLength((int) file.length()); String browser = getBrowser(request); String disposition = getDisposition(realFilNm, browser); response.setHeader("Content-Disposition", disposition); response.setHeader("Content-Transfer-Encoding", "binary"); OutputStream out = response.getOutputStream(); FileInputStream fis = null; fis = new FileInputStream(file); FileCopyUtils.copy(fis, out); if (fis != null) fis.close(); out.flush(); out.close(); } } private String getBrowser(HttpServletRequest request) { String header = request.getHeader("User-Agent"); if (header.indexOf("MSIE") > -1 || header.indexOf("Trident") > -1) return "MSIE"; else if (header.indexOf("Chrome") > -1) return "Chrome"; else if (header.indexOf("Opera") > -1) return "Opera"; return "Firefox"; } private String getDisposition(String filename, String browser) throws UnsupportedEncodingException { String dispositionPrefix = "attachment;filename="; String encodedFilename = null; if (browser.equals("MSIE")) { encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20"); } else if (browser.equals("Firefox")) { encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\""; } else if (browser.equals("Opera")) { encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\""; } else if (browser.equals("Chrome")) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < filename.length(); i++) { char c = filename.charAt(i); if (c > '~') { sb.append(URLEncoder.encode("" + c, "UTF-8")); } else { sb.append(c); } } encodedFilename = sb.toString(); } return dispositionPrefix + encodedFilename; } }
사용법은 다음과 같다.
FileUtil fileUtil = new FileUtil(); fileUtil.filDown("/upload/dir1/dir2/","실제파일명+확장자","화면에보여줄파일명+확장자");
해당 샘플은 다운로드 파일들이 WebContent 하단에 해당되는 폴더+파일이라고 가정한다.
그리고 1번째 파라미터인 디렉토리 경로는 webcontent/upload/dir1/dir2/ 형식으로 존재한다고 가정하는거다.
만약 경로앞에 슬러시가 빠진다면 fileDown 메서드에서 filePath.substring(1) 을 filePath로 변경하고 적용해주도록 하자
POI 라이브러리를 이용하여 엑셀파일(XLSX) 만들기 - 6만건 이상일 경우 추천 (0) | 2014.07.14 |
---|---|
json-simple 라이브러리를 이용한 ObjecToString 과 StringToObject 코드구현 (2) | 2014.07.04 |
엑셀다운 POI 라이브러리 - 엑셀파일에서 내용 읽기 (0) | 2014.06.10 |
게시물 번호 구하기 샘플소스 (0) | 2014.06.09 |
자바 썸네일 이미지 생성 (0) | 2014.06.09 |
처음에 올렸던 엑셀파일 다운로드에 이어서 내용읽기 부분을 진행하겠다.
첨부한 파일을 다운받으셔서 돌려보시길...
필요 라이브러리 관련해서는 엑셀다운로드 샘플링구현때 설명을 드렸습니다.
poi작업을 할 구성이 완료 되었으면
엑셀 파일을 읽어보자
엑셀 파일을 읽어서 구현가능한 기능은 일괄로 db에 insert하는 작업이 가능하겠다.
db insert 구현하는 부분은 응용을 하시도록 하고...
본인은 엑셀파일 읽는 수준으로만 간단하게 샘플링을 올리도록 하겠음..
해당 샘플은 xls용으로 우선 구현이 되있다.
xlsx버전은 후에 올리도록 하겠음.. 뭐 별차이는 없지만;;;
우선 샘플 코드부분
FileInputStream is = new FileInputStream("D:\\sample.xls"); //워크북 생성 HSSFWorkbook workbook = new HSSFWorkbook(is); int i = 0 short c = 0; //시트생성 HSSFSheet sheet = workbook.getSheetAt(0); //row사이즈담기 int rows = sheet.getPhysicalNumberOfRows(); //읽은 row 사이즈만큼 반복 for(i=1; i<rows; i++) { //excel파일의 시트에있는 row를 읽는다 HSSFRow row = sheet.getRow(i); // row가 비어있지 않으면 if(row != null) { //cell의 갯수를 담는다 int cells = row.getPhysicalNumberOfCells(); //cell의 수만큼 반복 for(c = 0; c<=cells;c++) { //cell값 읽기 HSSFCell cell = row.getCell(c); String value=""; //중간중간 cell이 널일수도 있으므로 if(cell == null) { continue; } else { //cell내용이 존재 //타입관련 적용은 여러가지가 있음 골라서 쓰시길... switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_FORMULA: value = cell.getCellFormula(); break; case HSSFCell.CELL_TYPE_NUMERIC: value =""+(int)cell.getNumericCellValue(); break; case HSSFCell.CELL_TYPE_STRING: value =""+cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_BLANK: value =""+cell.getBooleanCellValue(); break; case HSSFCell.CELL_TYPE_ERROR: value=""+cell.getErrorCellValue(); break; } } System.out.println("엑셀cell내용읽기:"+value); } } }
위에보면 xls파일을 지정하고 파일을 읽어왔는데 해당 소스를 응용하여 JSP웹페이지에서
multipartfile로 받아온 첨부파일의 내용을 읽을수 있겠다.
예를 들어 multipartfile의 명칭이 fileNm이라고 할경우
HSSFWorkbook workbook = new HSSFWorkbook(fileNm.getInputStrem());
형식으로만 변경을 해주면 될것이다.
도움이 되셨다면 손가락↓ 클릭! 궁금하신점은 댓글!!
json-simple 라이브러리를 이용한 ObjecToString 과 StringToObject 코드구현 (2) | 2014.07.04 |
---|---|
자바 파일다운로드 - 멀티 브라우저지원 샘플코드 (0) | 2014.06.12 |
게시물 번호 구하기 샘플소스 (0) | 2014.06.09 |
자바 썸네일 이미지 생성 (0) | 2014.06.09 |
poi 라이브러리를 이용하여 엑셀 파일을 만들어보도록 하자 - (xls 확장자) (0) | 2014.06.05 |
아~~~ 주 기초적이긴 하지만 혹시 몰라서 필요하신분들을 위해서 게시물
넘버링하는 샘플소스 올려봅니다~
//넘버링에 필요한 변수 int listNumber, n = 0; //db에서 select한 list객체를 for문으로 뽑는다. for(int i=0; i<list.size(); i++) { // listNumber가 게시물 번호를 뜻하는데 // 페이징을 하게 되면 대부분 totalcount, // 페이징에 필요한 start,end 를 구하게 될텐데 // 다음처럼 적용해보면 된다. listNumber = totalcount - (start + n)+1 ; //콘솔에 값을 찍어본다 System.out.println("페이지번호:"+listNumber); // 값이 원하는 숫자가 나오게 된다면 list 객체에 있는 // 페이지 번호변수에 set을해준다. // 예를들어 list객체가 선언한 vo타입내에 // private int listNum; 이라고 주었다면 // list.get(i).setListNum(listNumber); 처럼 set을 해주고 // 화면에 뽑아오면 될것이다. n++; }
도움이 되셨다면 손가락↓ 클릭! 궁금하신점은 댓글!!
json-simple 라이브러리를 이용한 ObjecToString 과 StringToObject 코드구현 (2) | 2014.07.04 |
---|---|
자바 파일다운로드 - 멀티 브라우저지원 샘플코드 (0) | 2014.06.12 |
엑셀다운 POI 라이브러리 - 엑셀파일에서 내용 읽기 (0) | 2014.06.10 |
자바 썸네일 이미지 생성 (0) | 2014.06.09 |
poi 라이브러리를 이용하여 엑셀 파일을 만들어보도록 하자 - (xls 확장자) (0) | 2014.06.05 |