2010년 10월 14일 목요일

POI 쓰기...

등록이라 할수있는 쓰기를 해본다.

필요한 파일은

 
소스출처 http://www.jakartaproject.com/article/jakarta/110932237561300
jsp로 되어있는것을 자바로 좀 바꾸었다.

/*
 * exwrite.xls 가 생성된다.기존의 있다면 지워지고 생성된다.
 * */

package poiWrite;

import java.io.FileOutputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;

public class PoiWriteEx{
 
 static String fileUrl = "E:\\exwrite1.xls";                //생성될 파일이름
 public static void main(String[] args){
 
 
  try{
   String[] cell_value = {"1","1번째칸","정주형","011-227-1355","=A2"};  //셀에 들어갈 데이터 입력
   
   HSSFWorkbook workbook = new HSSFWorkbook();      //워크북 생성
   HSSFSheet sheet = workbook.createSheet();      //생성한 워크북에 시트 생성
   workbook.setSheetName(0,"연습",HSSFWorkbook.ENCODING_UTF_16); //시트이름을 한글로 생성하려면..이렇게..
   
   HSSFCellStyle style = workbook.createCellStyle();    //셀의 스타일 구성 (셀의 선이라든지 색깔지정)
   style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
   style.setBottomBorderColor(HSSFColor.BLACK.index);
   style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
   style.setLeftBorderColor(HSSFColor.GREEN.index);
   style.setBorderRight(HSSFCellStyle.BORDER_THIN);
   style.setRightBorderColor(HSSFColor.BLUE.index);
   style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM_DASHED);
   style.setTopBorderColor(HSSFColor.BLACK.index);
   
   HSSFRow row = sheet.createRow(1);        //로우 생성(1번째로우, 참고-0번째로우가 첫째줄이다.)
   for(int i=0;i<cell_value.length;i++){
    HSSFCell cell = row.createCell((short)i);     //셀을 생성하고 스타일을 주고 값을입력
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    cell.setCellStyle(style);
    cell.setCellValue(cell_value[i]);
   }
   
   FileOutputStream fs = null;
   try{
    fs = new FileOutputStream(fileUrl);
    workbook.write(fs);
   }catch(Exception e){
   }finally{
    if(fs != null) fs.close();
   }
   System.out.println("성공");    //파일을 돌리면 "성공"이라는 메시지가 찍히고 E드라이브에 파일생성됨
  }catch(Exception e){
   e.printStackTrace();
  }
 }
}

이미지를 클릭하시면 원본크기로 보실수 있습니다.


이미지를 클릭하시면 원본크기로 보실수 있습니다.


이미지를 클릭하시면 원본크기로 보실수 있습니다.



E드라이브에 생성됐음을 확인할수 있다.
열어보면 딱 한줄 생성됐다..ㅋ

P 이경철님의 파란블로그에서 발행된 글입니다.

엑셀 시트 복사하기(with POI) + 리팩터링

좋아요 좋아... ㅎㅎㅎ  

 

private void copySheet(HSSFSheet from, HSSFSheet to) {
        HSSFRow firstRow = from.getRow(0);
        HSSFRow secondRow = from.getRow(1);
        HSSFRow thirdRow = from.getRow(2);
        
        HSSFRow firstRow2 = to.createRow(0);
        HSSFRow secondRow2 = to.createRow(1);
        HSSFRow thirdRow2 = to.createRow(2);
        
        Iterator<HSSFCell> iterator = firstRow.cellIterator();
        short col = 0;
        while(iterator.hasNext())
            addCell(firstRow2, col++, iterator.next().getStringCellValue());
        
        col = 0;
        iterator = secondRow.cellIterator();
        while(iterator.hasNext())
            addCell(secondRow2, col++, iterator.next().getStringCellValue());

        col = 0;
        iterator = thirdRow.cellIterator();
        while(iterator.hasNext())
            addCell(thirdRow2, col++, iterator.next().getStringCellValue());
    }

무려 세 번이나 중복되고 있지만, 일단 기능이 제대로 돌아가는지부터 보려고 허겁 지겁 코딩을 하고 결과를 확인해 보니 괜춘하네요. 여기서 그만 둘까도 생각했지만, 에이~ 뭐 시간도 많은데 저런걸 그냥 두긴 뭐하다 싶어서 리팩터링..

    private void copySheet(HSSFSheet from, HSSFSheet to, int fromRowCnt, int toRowCnt) {
        HSSFRow fromRow = null;
        HSSFRow toRow = null;
        for(int i = fromRowCnt ; i <= toRowCnt ; i++){
            fromRow = from.getRow(i);
            toRow = to.createRow(i);
            Iterator<HSSFCell> iterator = fromRow.cellIterator();
            short col = 0;
            while(iterator.hasNext())
                addCell(toRow, col++, iterator.next().getStringCellValue());
        }
    }

리팩터링 하는 김에 좀 더 Generic하게 만들어서 몇 번째 줄부터 몇 번째 줄까지 복사할지 인자로 넘겨주도록 수정 함. 이제 저 메소드는 ExcelUtils로 옮기면 ExelView쪽 코드는 약간 더 깔끔해지겠죠. 그건 뭐 간단하니 생략합니다.

 

 

출처: http://whiteship.tistory.com/1708


 



P 이경철님의 파란블로그에서 발행된 글입니다.

Character Set과 Encoding

문자셋과 인코딩의 정의

  • 문자셋 (charset, Character Set)
하나의 언어권에서 사용하는 언어를 표현하기 위한 모든 문자(활자)의 모임을 문자셋(charater set)이라고 한다. 다시 말하면 우리가 얘기하는 언어를 책으로 출판할 때 필요한 문자(활자)를 모두 모은 것이라고 생각하면 된다. 추가적으로 부호와 공백 등과 같은 특수 문자도 문자셋에 포함된다.
영어의 경우 알파벳 대소문자와 특수 문자 등으로 간단하게 문자셋을 구성할 수 있지만 한글의 경우 출판에서 가,나,다 등으로 출판함으로 훨씬 다양한 문자셋을 가지고, 또한 한자를 병행해서 사용함으로 문자셋의 범위는 더욱 넓어진다.
  • 추상적인 글자 셋은 여러 개의 인코딩을 가질 수 있다.
  • MIME 문자셋은 IANA에서 정의하며 인터넷 및 XML 파일에서 사용한다.
  • 인코딩 (encoding)
인코딩은 문자셋을 컴퓨터가 이해할 수 있는 바이트와 매핑하는 규칙이다. 예를 들면 ASCII Code에서 A,B,C 등은 문자셋이고 A는 코드 65, B는 코드 66 등 바이트 순서와 매핑한 것이 인코딩이다. 따라서 문자셋을 어떻게 매핑하느냐에 따라 하나의 문자셋이 다양한 인코딩을 가질 수 있다.
  • 추상적인 문자셋을 구체적인 bit-stream으로 표기하는 방법
  • 여러가지 문자셋을 동시에 표시할 수 있다.
  • 대부분의 인코딩에서는 대소문자를 구분하지 않는다.
  • 대한민국 문자셋(charater set)에서 가장 많이 사용하는 인코딩은 "UTF-8", "KSC5601", "ISO-8859-1" 이다.
  • 문자셋(인코딩)의 예
  • 한글 : 8bit KSC5601 (8bit EUC-KR, 7bit ISO-2022-KR, ISO-2022-Int)
  • 영문 : KSC5636, US-ASCII (둘 간의 차이는 화페 단위 뿐)
  • 한글+영문 : KSC5861 (EUC-KR), KSC5636 + KSC5601를 모두 포함한다.
  • 유니코드 : 4byte Unicode < ISO-10646 UCS (ISO-8859-1, UTF-8, UTF-16)

문자셋과 인코딩은 동일한 명칭을 가질 수 있어 서로 혼용하여 사용되는 경우가 많다.
EUC-KR은 원래 유닉스용 표준이었는데 인터넷으로 확장되어 사용된다.
KSC5601은 인터넷에서 원활한 한글(완성형) 사용을 위하여 정의된 표준이다.
EUC (Extended UNIX Code), UTF (UCS Transformation format)

기본 인코딩

  • Windows : 시스템 언어와 관련된 코드 페이지를 따름
    • 영문 Windows는 CP1252 인코딩을 사용
    • 한글 Windows는 MS949 인코딩을 사용
  • Unix : LANG 환경 변수로 지정된 로케일에 해당하는 인코딩
    • Solaris는 LANG 환경 변수가 ko, ko_KR일 경우 EUC-KR 인코딩을 사용
    • HP는 LANG 환경 변수가 ko_KR, ko_KR.eucKR일 경우 EUC-KR 인코딩을 사용
    • Unix에서 locale -a 명령을 사용하여 LANG 환경 변수에 지정 가능한 문자셋을 확인할 수 있다.
  • HTML : ISO-8859-1와 ISO-10646
  • XML : UTF-8
  • 웹 브라우져 : 내부적으로 모두 유니코드로 처리를 한다.
  • HTTP/1.0 : ISO-8859-1
  • HTTP (URL,URI) : US-ASCII, %hexadecimal_code, JavaScript escape() 함수 사용
  • Java : 유니코드 2.0
  • 직렬화된 Java Class : UTF-8
  • J2EE : ISO-8859-1
  • Oracle : UTF-8 (AL32UTF8), 한국에서는 KSC5601 (KO16KSC5601)

이미지를 클릭하시면 원본크기로 보실수 있습니다.


 



다양한 환경에서 인코딩 설정

웹 브라우져 설정

  1. "도구 -> 인터넷 옵션 -> 언어" 메뉴를 선택한다.
  2. 영어[en]와 한국어[ko]를 추가하고 원하는 언어를 가장 상단에 위치한다.

JVM 설정

  • 일반적으로 LANG 환경 변수를 설정해 주면 자동으로 설정이 된다.
locale -a                               Solaria unix 명령어로 지원 가능한 encoding을 확인한다.
env LANG ko csh에서 Encoding을 설정한다. (KSC5601, EUC-KR)
LANG=ko ksh에서 Encoding을 설정한다. (KSC5601, EUC-KR)
  • JVM 옵션 설정 (UTF-8, ISO-8859-1, KSC5601)
-Dfile.encoding=8859_1                  필수 항목
-Dfile.client.encoding=8859_1
-Dclient.encoding.override=8859_1 JVM 버전에 따라 (사용안함)
  • JSP를 사용하여 JVM 옵션 확인 (encoding.jsp)
file.encoding = <%= System.getProperty("file.encoding") %><br>
file.client.encoding = <%= System.getProperty("file.client.encoding") %><br>
client.encoding.override = <%= System.getProperty("client.encoding.override") %><br>

HTML 설정

HTML 파일을 UTF-8로 만들어 저장한다.

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

XML 설정

XML 파일을 UTF-8로 만들어 저장한다.

<?xml version="1.0" encoding="UTF-8" ?>

JSP 설정

JSP 파일을 UTF-8로 만들어 저장한다.

<%@ page pageEncoding="UTF-8" %>
<%@ page contentType="text/html;charset=UTF-8" %>

Servlet 설정

HTTP 요청의 인코딩 지정

request.setCharacterEncoding("UTF-8");

HTTP 응답의 인코딩 지정

response.setContentType("text/html; charset=UTF-8");

web.xml 설정

<mime-mapping>
<extension>html</extension>
<mime-type>text/html;charset=UTF-8</mime-type>
</mime-mapping>

Default Oracle Database 문자셋

  • Default Oracle Database 문자셋 : UTF-8 (AL32UTF8), 한국에서는 KSC5601 (KO16KSC5601)
  • AL32UTF8, KO16KSC5601 (KSC5601), WE8ISO8859P1 (8859_1)
  • Default Oracle Database 문자셋 확인 방법
sqlplus system/manager

select parameter || ' : ' || value parameter_value
from NLS_DATABASE_PARAMETERS
where parameter = 'NLS_CHARACTERSET'
or parameter = 'NLS_NCHAR_CHARACTERSET';

select name || ' : ' || substr(value$, 1, 40) parameter_value
from sys.props$
where name = 'NLS_CHARACTERSET';

select parameter || ' : ' || value parameter_value
from NLS_INSTANCE_PARAMETERS, V$NLS_PARAMETERS, NLS_SESSION_PARAMETERS;
  • Oracle Database 문자셋 변경 방법
환경 변수 또는 %ORACLE_HOME%/dbs/init[SID].ora 을 설정한다.
NLS_LANG='American_America.Ko16ksc5601'
ORA_NLS33='$ORACLE_HOME/ocommon/nls/admin/data'
NLS_DATE_FORMAT='YYYY-MM-DD'
  • DriverManager에서 문자셋 설정 방법
java.util.Properties props = new java.util.Properties();
props.put("charSet", "KSC5601" );
DriverManager.getConnection(dbUrl, props);


P 이경철님의 파란블로그에서 발행된 글입니다.