달력

5

« 2024/5 »

  • 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
2012. 11. 28. 10:13

Flex 3.2: Loading sub-apps Enjoy/FLEX2012. 11. 28. 10:13


https://learn.adobe.com/wiki/display/Flex/Getting+Started


http://livedocs.adobe.com/flex/3/html/help.html

:
Posted by 라면스프
2012. 11. 28. 09:58

Flex 3 SDK Downloads Enjoy/FLEX2012. 11. 28. 09:58

sdk 3 다운링크 페이지

http://sourceforge.net/adobe/flexsdk/wiki/Download%20Flex%203/



** 20170816 내용 수정 됨.







# Flex 3 SDK Downloads Look [here](Downloads) for a description regarding the types of SDKs available. Look [here](Build%20Types) for an explanation of the different build types found on this page. Look [here](Using%20Flex%203%20Builds%20in%20Flex%20Builder) for an explanation of how to use a stable or nightly build in Flex Builder. **Please refer to [this document](Targeting%20Flash%20Player%2010%20Beta) if you wish to target the [Astro beta](http://labs.adobe.com/technologies/flashplayer10/).** ### Latest Milestone Release Builds Milestone|Build|Build Date|Adobe Flex SDK|Open Source Flex SDK|Adobe Add-ons| ---------|-----|----------|--------------|--------------------|-------------| 3.6A|3.6.0.16995A|Tue May 3, 2011|[Download (ZIP, 122MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.6.0.16995A&pkgtype=1) 3.5B|3.5.0.12683B|Fri Dec 18, 2009|[Download (ZIP, 122MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.5.0.12683B&pkgtype=1)|[Download (ZIP, 26MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.5.0.12683B&pkgtype=2)|[Download (ZIP, 65MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.5.0.12683B&pkgtype=3) 3.4A|3.4.0.9271A|Tue Aug 18, 2009|[Download (ZIP, 122MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.4.0.9271A%26amp%3Bpkgtype%3D1)|[Download (ZIP, 26MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.4.0.9271A&pkgtype=2)|[Download (ZIP, 65MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.4.0.9271A&pkgtype=3) 3.3A|3.3.0.4852A|Thu Feb 5, 2009|[Download (ZIP, 121MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.3.0.4852A&pkgtype=1)|[Download (ZIP, 24MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.3.0.4852A&pkgtype=2)|[Download (ZIP, 63MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.3.0.4852A&pkgtype=3) 3.2A|3.2.0.3958A|Wed Oct 29, 2008|[Download (ZIP, 118MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.2.0.3958A&pkgtype=1)|[Download (ZIP, 24MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.2.0.3958A&pkgtype=2)|[Download (ZIP, 63MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.2.0.3958A&pkgtype=3) 3.1A|3.1.0.2710A|Fri Aug 15, 2008|[Download (ZIP, 82MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.1.0.2710A&pkgtype=1)|[Download (ZIP, 23MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.1.0.2710A&pkgtype=2)|[Download (ZIP, 59MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.1.0.2710A&pkgtype=3) 3.0A|3.0.0.477A|Tue Feb 12, 2008|[Download (ZIP, 79MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.0.0.477A&pkgtype=1)|[Download (ZIP, 23MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.0.0.477A&pkgtype=2)|[Download (ZIP, 57MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.0.0.477A&pkgtype=3) ### Stable Builds Stable|Build|Build Date|Adobe Flex SDK|Open Source Flex SDK|Adobe Add-ons | ------|-----|----------|--------------|--------------------|--------------| 3.4.1A|3.4.1.10084A|Tue Nov, 2011|[Download (ZIP, 122MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.4.1.10084A&pkgtype=1) 3.0.1A|3.0.1.1732A|Tue Nov, 2011|[Download (ZIP, 122MB)](http://blogs.adobe.com/flex/files/2012/05/FlexLicense.swf?build=3.0.1.1732A&pkgtype=1)



3.0 빌더 링크가 있는 페이지 http://shon.yee.kr/39



:
Posted by 라면스프
2012. 11. 28. 09:57

Gallileo에서 Flex Builder 사용하기 Enjoy/FLEX2012. 11. 28. 09:57



출처 : http://blog.naver.com/zestun/60117466702


Gallileo에서 Flex Builder 사용하기


1. 우선 Ganymede를 설치하고 플렉스 빌더를 설치한다. 

(Ganymede 이하 버젼이 아니면 플렉스 빌더가 깔릴때 오류를 발생시킨다. 다 깔고나면 가니메데는 지워도 상관없음.)


 

2. 갈릴레오를 깔고 갈릴레오가 설치된 폴더 안에 links 폴더를 없으면 만들어주고 다음의 파일을 넣어준다.

내용은 단순한데 그냥 path=c:~~ 플렉스 빌더 플러그인 폴더 위치이다.


3. C:\Program Files\Adobe\Flex Builder 3\plugins\com.adobe.flexbuilder.project_3.0.214193로 찾아가서 zornproject.jar 파일을 첨부한 파일로 교체해준다.

 
 
요 부분이 핵심인데, 실제 ProblemManager라는 클래스가 말썽인 모양이다. 

그것만 이 제임스 와드란 친구의 클래스로 교체해주면 별 문제없이 빌드도 잘되고 실행도 잘된다는 결론.


결국 이렇게 해서 해결이 되었나 했는데 한가지 문제가 더 발생하였다.

이클립스에서 빌더가 Flex SDK를 못 찾는 것. (뭐 이정도야 문제라고 할수도 없지만서도..)

Window-Preferences-Flex-Installed Flex Sdks 항목에서 Add 를 눌러서 C:\Program Files\Adobe\Flex Builder 3 Plug-in\sdks\3.2.0 (기본설치시...) 를 지정해주면 이제 갈릴레오에서도 플렉스를 개발할 수가 있게 되었다.


:
Posted by 라면스프
2012. 11. 23. 09:48

OS별 CPU, memory, kernel bit 를 확인 방법 Enjoy/etc2012. 11. 23. 09:48

출처 : http://www.cubrid.com/zbxe/47077


  1. CPU 확인 방법
    1. AIX : lsdev -Cc processor
    2. HP-UX : ioscan -fnC processor
    3. Solaris : psrinfo -v
    4. LINUX : cat /proc/cpuinfo
  2. 메모리 확인 방법
    1. AIX : bootinfo -r
    2. HP-UX : grep -i Physical /var/adm/syslog/syslog.log
    3. Solaris : prtconf
    4. LINUX : free
  3. kernel bits 확인 방법
    1. AIX : bootinfo -K
    2. HP-UX : getconf KERNEL_BITS
    3. isainfo -kv
    4. LINUX : getconf WORD_BIT

[HP]
cd /usr/contrib/bin
[shcmweb1:/usr/contrib/bin]
[shcmweb1:/usr/contrib/bin]machinfo
CPU info:
  1 Intel(R)  Itanium(R)  Processor 9340 (1.6 GHz, 20 MB)
          4.79 GT/s QPI, CPU version E0
          4 logical processors (4 per socket)

Memory: 16283 MB (15.9 GB)

Firmware info:
   Firmware revision:  01.90
   FP SWA driver revision: 1.18
   IPMI is supported on this system.
   BMC firmware revision: 1.53

Platform info:
   Model:                  "ia64 hp Integrity rx2800 i2"
   Machine ID number:      5509adca-f963-11e1-bb7a-05581a03fc66
   Machine serial number:  SGH230A2AK

OS info:
   Nodename:  shcmweb1
   Release:   HP-UX B.11.31
   Version:   U (unlimited-user license)
   Machine:   ia64
   ID Number: 1426697674
   vmunix _release_version:               
@(#) $Revision: vmunix:    B.11.31_LR FLAVOR=perf 
[shcmweb1:/usr/contrib/bin]


[DB]
서버버전 확인 select * from v$version;
bit확인  select platform_name from v$database;

:
Posted by 라면스프







시바타 준(柴田 淳) - 와스레 모노(忘れもの)

시바타 준(柴田 淳)의 

와스레 모노(忘れもの-잃어버린 것)라는 곡입니다.

이름:柴田淳(시바타 준)

생년원일:1976년11ㅇ월19일

출생지: 도쿄(東京都) 

별자리: 전갈자리

2001년10월31일에, 1st Maxi Single 'ぼくの味方(나의 편)'으로 Dream music으로부터 메이저 데뷔

취미
수예전반, 독서, 아웃도어 캠프, 강낚시, 탐험, 바베큐, 드라이브, 영화&음악감상, 맛있는 것을 먹는 것.

특기
조각, 회화

좋아하는 책
치에코(智惠子)抄, 노인과 바다, 복숭아, 배틀로얄

좋아하는 영화
열쇠(이란 영화), 로렌조 오일, 아버지의 기도를, 반디불의 묘, 빽투더 퓨처, 

블루스 브라더스

좋아하는 말
유언실행(有言実行)

좋아하는 음식물
마늘, 소프트 크림, 비프 저키(beef jerky)

팬 레터는 ▼
우편106-0032

도쿄도(東京都) 미나토구(港區) 롯폰기(六本木)6가1번24호

라피로스 록폰기(ラピロス 六本木) 4F
돌리뮤직(dolly music) 시바타 준(柴田淳) 팬 레터(fan letter)계


:
Posted by 라면스프

출처 : http://cafe.naver.com/hermeneus/76


가이드 : http://wiki.eclipse.org/index.php/MemoryAnalyzer


자바 웹 개발자로서 듣기 가장 무서운 단어중에 하나는 out of memory 일 것이다.


메모리의 누수가 없도록 개발해야 하는 것이 정답이지만 실수 할 수 있는 가능성이 있는 만큼 대비 또한 중요하다고 생각한다.

시스템에서 out of memory가 발생했을 때 우리는 어떤 데이터를 가지고 어떻게 분석해야할지 고민해야 할 것이다.

out of memory에 대한 대비가 되어 있지 않으면 분석할 데이터가 존재하지 않는다.

따라서 할 수 있는 것은 시스템을 재시작하는 방법 뿐이다.

메모리는 계속 쌓여 갈 것이고 가까운 미래에 또다시 out of memory를 만날 것이다.

이러한 문제를 해결하기 위한 여러가지 분석 방법 중 하나가 out of memory가 발생할 때 힙덤프를 생성하는 것이다.

JAVA에서는 친절하게 옵션으로 제공하고 있다.

-XX:+HeapDumpOnOutOfMemoryError : out of memory가 발생시에 힙덤프를 현재 실행 디렉토리에 생성한다.

-XX:HeapDumpPath=힘덤프를 생성할 경로/힙덤프이름.hprof : 지정한 경로에 생성한다.

out of memory가 발생했다면 hprof 힙덤프 파일이라는 증거물을 자동으로 획득할 수 있다.

이제 힙덤프 파일을 어떻게 분석할까??

힙덤프를 분석해주는 툴이 있어 반갑다. 바로 Eclipse Memory Analyzer (MAT)  !!

1. 프로그램을 실행시키고 힙덤프 파일을 찾아서 열기(Open Heap Dump)한다.





2. 선택된 힙덤프를 바로 분석하여 파이형 그래프로 문제가 얼마나 있는지 한눈에 보여준다.





3. 이제 어디에 문제가 있는지 좀 더 분석해 보자.




메모리가 어느 부분에서 많이 쓰였는지 해당 인스턴스를 찾아서 나타내 준다.

Problem Suspect 1 한 부분만 봤을 때에도 문제의 원인을 대략적으로 알아낼 수 있었다.

바로 com.sun.mail.smtp.SMTPMessage[] 부분이었다.

SMTPMessage를 사용하는 곳만 찾아보아도 이미 반정도는 해결 된 문제다.


4. 좀 더 상세하게 분석해 보자.




트리 형태로 볼 수 있도록 트리 아이콘을 클릭한다.

트리는 메모리를 가장 많이 가지고 있는 쓰레드 순으로 정렬하여 보여주고 있다.

가장 문제가 큰 쓰레드를 열어보았다.

SMTPMessage 배열은 64개의 SMTPMessage 객체를 가지고 있다.

InternetAddress 배열도 64개의 InternetAddress 객체를 가지고 있다.

SenderInfoBean 클래스도 보인다.

메일을 발송하는 부분에서 사용되는 클래스가 대부분이었다.

이 세 항목으로 볼 때 메일 발송시 64개의 마임(MIME) 또는 그 이상을 생성하여 메모리에 가지고 있다가 

out of memory를 발생시킨 것이라는 결론을 내렸다.

이러한 힙덤프 분석으로 문제를 발견하고 수정하는데 많은 도움을 받을 수 있었다.

몇일, 몇주, 몇달이 지나도 out of memory가 발생했다는 문제는 지금까지 보고되지 않고 있다.


▼ 아래의 경로에서 Eclipse Memory Analyzer(MAT)에 대한 자세한 정보와 프로그램을 다운로드 받을 수 있다.

    ☞ 경로 : http://www.eclipse.org/mat/


:
Posted by 라면스프
2012. 10. 9. 14:45

tomcat catalina.out 처리 Enjoy/etc2012. 10. 9. 14:45

오래되면 catalina.out  로그파일 대용량이 된다~!

catalina.out 로그파일 쌓이는걸 막아야겠다~!

tomcat 로그는 catalina.out  대신 catalina.YYYY-MM-DD.log 파일을 보면 될듯...


수정하기

$TOMCAT_HOME/bin/catalina.sh


  touch "$CATALINA_OUT"

  if [ "$1" = "-security" ] ; then

    if [ $have_tty -eq 1 ]; then

      echo "Using Security Manager"

    fi

    shift

    "$_RUNJAVA" "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS \

      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \

      -Djava.security.manager \

      -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \

      -Dcatalina.base="$CATALINA_BASE" \

      -Dcatalina.home="$CATALINA_HOME" \

      -Djava.io.tmpdir="$CATALINA_TMPDIR" \

      org.apache.catalina.startup.Bootstrap "$@" start \

      #>> "$CATALINA_OUT" 2>&1 & 주석처리

      >> /dev/null 2>&1 & 라인추가

  else

    "$_RUNJAVA" "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS \

      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \

      -Dcatalina.base="$CATALINA_BASE" \

      -Dcatalina.home="$CATALINA_HOME" \

      -Djava.io.tmpdir="$CATALINA_TMPDIR" \

      org.apache.catalina.startup.Bootstrap "$@" start \

      #>> "$CATALINA_OUT" 2>&1 & 주석처리

      >> /dev/null 2>&1 & 라인추가

  fi



위와 같이 처리 하면 catalina.out  파일 사이즈가 늘어나지 않는다~! 



그외 방법들


펌 : http://tenny.egloos.com/1226439


우선, 톰켓 로그 설정법은

이런 곳 http://tomcat.apache.org/tomcat-5.5-doc/logging.html

그리고 또 이런 곳에 잘 나와있다. http://minaret.biz/tips/tomcatLogging.html

하지만, 이런 곳에는 http://tomcat.apache.org/faq/logging.html

톰켓은 기본적으로 catalina.out 파일을 rotate하지 않는다고 한다.
톰켓 입장에서는 당신이 로깅패키지를 쓰면 되기 때문에 문제가 없다고 하는데,,, 글쎄다...
어떻게든 로그가 계속 쌓이는 것은 막아야하지 않겠는가... ( 정말 쉬운 방법이 있으면 가르침을 주시면 참 고마울 것 같다)

System.out and System.err both print to catalina.out. But you can suppress this via the swallowOutput property and sent to different log files. 
catalina.out does not rotate. But it should not be an issue because nothing should be printing to standard output since you are using a logging package, right? a thread about rotation of catalina.out



방법1. cronolog 로테이트 로깅 프로그램 사용

http://marc.info/?l=tomcat-user&m=105645816302666&w=2 

방법2. log4j 사용

http://minaret.biz/tips/tomcatLogging.html


첫 번째 방법은 패키지 설치가 귀찮아서 안해봤고, 두 번째 방법을 해보니, 로깅은 되는데, catalina.out은 계속 쌓이는 듯 하다. 뭔가 설정을 잘못한 것일 수도 있지만, 분석을 해봐도 뜻대로 catalina.out에 로깅이 중단되지는 않았다.

해보지는 않았지만, pipe 처리를 해서 rotate를 완전 다른 프로세스에게 넘기는 첫번째 방법이 더 쉬워보이기는 한다. 하지만 이 역시, 톰켓을 kill할 때, 가끔 cronolog가 혼자 살아있다는 bug report 가 있기는 하다.


이제 귀찮고 해서, shell script를 만들고 crontab에 넣어 버렸더니, 잘되기는 한다.

rotateTomcatLog.sh

#!/bin/sh

LOG_DIR=/tomcat/log/dir
DATE=`/bin/date +%Y-%m-%d`

/bin/nice /bin/cp  $LOG_DIR/catalina.out $LOG_DIR/catalina.$DATE.out
/bin/nice /bin/cat /dev/null > $LOG_DIR/catalina.out
rm -Rf $LOG_DIR/*.log


#
# delete out-of-date catalina.log
#

DELETE_DATE=`/bin/date +%Y-%m-%d --date '20 day ago'`
#DELETE_DATE`/bin/date +Y-%m-%d --date '1 month ago'`

echo "$LOG_DIR/catalina.$DELETE_DATE.out"

for file in $LOG_DIR/*
do
        if [[ "$file" < "$LOG_DIR/catalina.$DELETE_DATE.out" ]]
        then
                rm -f $file
        fi
done

# end of file

위 스크립트는 cataline.out 하루에 한 번씩 rotate하고, backup 파일은 20일 동안 보관한다.
뭐 취향에 맞게 바꿔써도 무방할 것 같지만, 괜하게 log를 copy하는 부하가 맘에 걸린다.

/etc/logrotate.d/ 밑의 설정처럼 rotate도 하면서 backup 파일 보관 기간까지 설정하면서,
날짜와 크기 제한까지 같이 두는 설정이 있으면 좋겠다. 
(log4j는 날짜로 로테이트하면서, 크기 제한까지 두지는 못하는 것 같다.)




:
Posted by 라면스프
2012. 7. 24. 09:40

synchronized : 동기화(Lock) Enjoy/JAVA2012. 7. 24. 09:40

출처 : http://blog.naver.com/sang_it/156495940


package com.thread;
/*
 * 동기화 : 쓰레드 Lock걸기,Synchronized를 걸면 동시 접속이 안된다 
하나의 자원(데이터)에 대해서 여러 스레드가 사용하려고 할때 
한 시점에서 하나의 스레드만 사용할 수 있도록 하는 것이다.
synchronized 식별자는 보통 메소드의 선언부에 쓰고 
이 키워드가 붙은 메소드는 한번에 하나의 스레드만 접근이 가능하며
메소드가 사용중일 때 다른 스레드가 메소드를 호출하면 앞의 스레드가 종료될때까지 기다려야 한다.
*/
class ATM implements Runnable{
 private long depositeMoney = 10000;


 @Override
 public void run() {
  synchronized (this) {
   for(int i=0; i<10 ; i++){
    try{
     Thread.sleep(100);
    }catch (Exception e) {
     e.printStackTrace();
    }
    //현재 디파짓을 반환
    if(getDepositMoney() <=0)
     break;
    whithDraw(100);
   }
  }  
 }


 private void whithDraw(int i) {
  if(0< depositeMoney)
   depositeMoney -= i;
  System.out.println(Thread.currentThread().getName()+ ","+depositeMoney);
 }


 private long getDepositMoney() {
  return depositeMoney;
 }

}

public class SynchronizedTest {
 public static void main(String[] args) { 
  ATM atm = new ATM();
  Thread t1 = new Thread(atm,"First");
  t1.start();
  
  Thread t2 = new Thread(atm,"Second");
  t2.start(); 


 }

}
==========결과 ====================

First,9900
First,9800
First,9700
First,9600
First,9500
First,9400
First,9300
First,9200
First,9100
First,9000
Second,8900
Second,8800
Second,8700
Second,8600
Second,8500
Second,8400
Second,8300
Second,8200
Second,8100
Second,8000

 

 

 

 

****첫번째로 들어온 쓰레드가 끝나면 다음 쓰레드 실행

:
Posted by 라면스프
2012. 7. 24. 09:34

[Java] replaceAll 로 공백 제거하기 Enjoy/JAVA2012. 7. 24. 09:34

출처 : http://vicki.tistory.com/583


정규식에서 공백은 정확하게 공백으로 인식을 못하는 것 같았습니다.
Pattern JavaDoc 에서 내용을 확인하였습니다.
http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html

POSIX character classes (US-ASCII only)
\p{Lower}A lower-case alphabetic character: [a-z]
\p{Upper}An upper-case alphabetic character:[A-Z]
\p{ASCII}All ASCII:[\x00-\x7F]
\p{Alpha}An alphabetic character:[\p{Lower}\p{Upper}]
\p{Digit}A decimal digit: [0-9]
\p{Alnum}An alphanumeric character:[\p{Alpha}\p{Digit}]
\p{Punct}Punctuation: One of !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Graph}A visible character: [\p{Alnum}\p{Punct}]
\p{Print}A printable character: [\p{Graph}\x20]
\p{Blank}A space or a tab: [ \t]
\p{Cntrl}A control character: [\x00-\x1F\x7F]
\p{XDigit}A hexadecimal digit: [0-9a-fA-F]
\p{Space}A whitespace character: [ \t\n\x0B\f\r]


그래서 아래와 같이 수정하였습니다.
  1. String str = "Vicki Yi";   
  2.   
  3. System.out.println(str + " : " + str.replaceAll("\\p{Space}"""));  
1.String str = "Vicki Yi";
2. 
3.System.out.println(str + " : " + str.replaceAll("\\p{Space}"""));


결과는~~~ 원하는 결과가 나왔습니다.
Vicki Yi : VickiYi

:
Posted by 라면스프
2012. 7. 24. 09:30

Java && Excel 연동 Enjoy/JAVA2012. 7. 24. 09:30

출처 : http://dualist.tistory.com/151


참조 : http://www.javapattern.info/

         http://www.okjsp.pe.kr/

 

자바로 엑셀을 핸들링 할 수 있는 방법은 크게 두가지로 나누어 진다.
1. Java Excel API    
    참조 : http://jexcelapi.sourceforge.net/
2. POI 
    참조 : http://jakarta.apache.org/poi/index.html

 

    흔히 POI를 엑셀을 핸들링 하기 위한 것으로만 오해하기 쉬운데,
    POI 프로젝트는 마이크로소프트 OLE 2 복합도큐먼트포맷형식의 파일을 순수 자바를 이용하여 핸들링하는 APIs로 구성되어있다.
    OLE 2 복합도큐먼트포맷형식의 파일은 마이크로소프트 엑셀 혹은 워드파일 등의 대부분의 오피스파일들을 나타낸다.

 

일반적으로 엑셀에 대한 핸들링만을 수행할 때에는 Jxl을 권장한다.
엑셀을 핸들링 할 때 엑셀에서 가장 작은 단위는 알고 있듯이 "셀"이다.
모든 작업은 이 셀을 중심으로 이루어진다.

 

주의할 점)
1) 엑셀 쉬트상에 "C15"라는 셀에 데이터가 있다고 가정하자.( 15행 C열을 나타낸다.)
이 때 Jxl에서는  A1( 1행 A열)부터  C15까지는 실제 데이터가 없을 경우에라도 null이 아닌 빈데이터가 있다고 인식한다.
즉 D열 이상이나, 16행 이상을 접근 할 때에 null로 인식한다.

하지만 POI에서는 C15 이내에 있다 하더라도 실제 데이터가 없을 때에는 null로 인식한다.

2) Jxl에서는 각 셀의 데이터 타입을 실제 엑셀 파일에서 지정된 셀의 타입을 따르고, 
   POI에서는 셀의 실제 데이터 형을 따른다. 
   예를 들어 특정 셀의 타입을 text 로 잡아놓고, 데이터를 1234로 입력하면
   Jxl에서는 "12345"로 인식하고, POI에서는 12345.00 이런식으로 인식한다.

 

EX ) Java Excel API를 이용한 Excel 읽기

import jxl.*;

// .. 중간생략

    Workbook workbook = null;
    Sheet sheet = null;
    Cell cell = null;

    try
    {
        //엑셀파일을 인식
        workbook = Workbook.getWorkbook( new File( szFileName));

        //엑셀파일에 포함된 sheet의 배열을 리턴한다.
        //workbook.getSheets();

        if( workbook != null)
        {
            //엑셀파일에서 첫번째 Sheet를 인식
            sheet = workbook.getSheet(0);

            if( sheet != null)
            {
                //셀인식 Cell a1 = sheet.getCell( 컬럼 Index, 열 Index);
                //셀 내용 String stringa1 = a1.getContents();

                //기록물철의 경우 실제 데이터가 시작되는 Row지정
                int nRowStartIndex = 5;
                //기록물철의 경우 실제 데이터가 끝 Row지정
                int nRowEndIndex   = sheet.getColumn( 2).length - 1;

                //기록물철의 경우 실제 데이터가 시작되는 Column지정
                int nColumnStartIndex = 2;
                //기록물철의 경우 실제 데이터가 끝나는 Column지정
                int nColumnEndIndex = sheet.getRow( 2).length - 1;

                String szValue = "";

                for( int nRow = nRowStartIndex; nRow <= nRowEndIndex; nRow++ )
                {
                    for( int nColumn = nColumnStartIndex; nColumn <= nColumnEndIndex ; nColumn++)
                    {
                        szValue = sheet.getCell( nColumn, nRow).getContents();

                        System.out.print( szValue);
                        System.out.print( "\t" );
                    }
                    System.out.println();
                }
            }
            else
            {
                System.out.println( "Sheet is null!!" );
            }
        }
        else
        {
            System.out.println( "WorkBook is null!!" );
        }
    }
    catch( Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
        if( workbook != null)
        {
            workbook.close();
        }
    }

EX ) POI를 이용한 Excel 파일 읽기

import org.apache.poi.hssf.usermodel.*;

// .. 중간 생략

    HSSFWorkbook workbook = null;
    HSSFSheet sheet = null;
    HSSFRow row = null;
    HSSFCell cell = null;

    try
    {
        workbook = new HSSFWorkbook( new FileInputStream( new File( szFileName)));

        if( workbook != null)
        {
            sheet = workbook.getSheetAt( 0);

            if( sheet != null)
            {

                //기록물철의 경우 실제 데이터가 시작되는 Row지정
                int nRowStartIndex = 5;
                //기록물철의 경우 실제 데이터가 끝 Row지정
                int nRowEndIndex   = sheet.getLastRowNum();

                //기록물철의 경우 실제 데이터가 시작되는 Column지정
                int nColumnStartIndex = 2;
                //기록물철의 경우 실제 데이터가 끝나는 Column지정
                int nColumnEndIndex = sheet.getRow( 2).getLastCellNum();

                String szValue = "";

                for( int i = nRowStartIndex; i <= nRowEndIndex ; i++)
                {
                    row  = sheet.getRow( i);

                    for( int nColumn = nColumnStartIndex; nColumn <= nColumnEndIndex ; nColumn++)
                    {
                        cell = row.getCell(( short ) nColumn);
                        
                        if( cell == null)
                        {
                            continue;
                        }
                        if( cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC)
                        {
                            szValue = String.valueOf( cell.getNumericCellValue());
                        }
                        else
                        {
                            szValue = cell.getStringCellValue();
                        }

                        System.out.print( szValue);
                        System.out.print( "\t" );
                    }
                    System.out.println();
                }
            }
            else
            {
                System.out.println( "Sheet is null!!" );
            }
        }
        else
        {
            System.out.println( "WorkBook is null!!" );
        }

    }catch(Exception e){
        e.printStackTrace();
    }


EX ) Jxl을 이용하여 Excel에 데이터 저장하기

import jxl.*;

// .. 중간생략

    WritableWorkbook workbook = null;
 WritableSheet sheet = null;

 File excelFile = new File( szFileName);
 Label label = null;

 long start = 0;
   long end = 0;
   
    try
    { 
        for(int i = 0 ; i < 10; i++)
        {
            workbook = Workbook.createWorkbook( excelFile);
            workbook.createSheet("sheet1", 0);
            sheet = workbook.getSheet(0);
            for( int j = 0; j < 10000; j++){
                label = new Label( j, 0, "test cell");
                sheet.addCell( label);
            }

            kidsbook.write();
            kidsbook.close();
        }
    }
    catch( Exception e)
    {
    }

// .. 중간생략


EX ) POI를 이용한 브라우저에서 Excel에 데이터 저장하여 보여주기

import org.apache.poi.hssf.usermodel.*;

// ... 생략

public void writeStream( PTSEvaluation[] arrPTSEvaluation) throws Exception
{
    try
    {

        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet( "new sheet");
        HSSFRow row = null;
        HSSFCell cell = null;
        HSSFCellStyle style = null;

        ServletOutputStream excelOut = ServiceContext.getResponse().getOutputStream();
        ServiceContext.getResponse().setHeader( "Content-Disposition", "attachment;filename=EvaluationCompensationList.xls");
        ServiceContext.getResponse().setContentType( MimeType.getMimeType( "xls"));

        //로우 생성
        row = sheet.createRow( ( short)0);
        row.setHeightInPoints( 30);

        //셀에 적용한 스타일을 생성한다.
        style = PTSUtil.setExcelHeaderStyle( wb);

        // 셀 생성
        cell = row.createCell( (short)0);

        //한글 처리
        cell.setEncoding( HSSFCell.ENCODING_UTF_16); 

        //셀에 데이터 입력하기
        cell.setCellValue( "값");

        //셀에 스타일 적용하기
        cell.setCellStyle(style);

        //.. 중간생략 ( 이런 방식으로 로우와 셀을 증가 시키면서 작업을 수행하면 된다.

        wb.write( excelOut);
        excelOut.flush();
    }
    catch( Exception e)
    {
        e.printStackTrace();
        throw e;
    }
    finally
    {
        ServiceContext.getResponse().getOutputStream().close();
    }
}

// ... 생략


출처 : Tong - 퀴비님의 자바통


:
Posted by 라면스프