HttpURLConnection 사용례

프로그래밍/Java 2009. 1. 6. 13:29 Posted by galad
일반 자바 어플서 특정 URL로 request를 날리는 방법
###########################################################################################
package test.xml;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;

public class XMLSend {
    private String targetUrl = null;
   
    public XMLSend(String targetUrl) {
        this.targetUrl = targetUrl;
    }

    public void send(ArrayList<String[]> dataList) throws IOException {
        URL url = new URL(this.targetUrl);
        HttpURLConnection uc = (HttpURLConnection) url.openConnection();
       
        uc.setDoOutput(true);
        uc.setDoInput(true);
        uc.setUseCaches(false);
        uc.setRequestMethod("POST");
       
        StringBuffer sb = new StringBuffer();
       
        for(int i = 0; i < dataList.size(); i++) {
            String[] s = dataList.get(i);
           
//            uc.setRequestProperty(s[1], s[2]);
               // 0 = 찾을 노드의 xpath, 1 = SAP에 보낼 파라미터명, 2 = 찾은 데이타 // 왜 안되는가?
           
            sb.append("&").append(s[1]).append("=").append(s[2]);
            // 0 = 찾을 노드의 xpath, 1 = SAP에 보낼 파라미터명, 2 = 찾은 데이타
        }
       
//        uc.connect(); // 이 방식은 왜 안되는가??
       
       
        PrintWriter pw = new PrintWriter(uc.getOutputStream());
       
        pw.write("url="+url);
        pw.write(sb.toString());
       
        pw.flush();
        pw.close();
       
        BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream()));
        String str = null;
        while((str = br.readLine()) != null) {
            System.out.println(str);
        }
    }
}
###########################################################################################

위에서 날린 request를 서블릿서 처리하는 예시
###########################################################################################
package test.xml;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DIServer extends HttpServlet {

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        String a = request.getParameter("//DATETIME[@type='T' and @qualifier='DOCUMENT']/YEAR");
           // 이건 특수문자에 띄어쓰기까지 있어서 데이터를 념겨받을 수 없다
//        String a = request.getParameter("sap_element_01");
//        String a = request.getParameter("sap_element_02");
//        String a = request.getParameter("sap_element_03");
       
//        System.out.println(a);
       
        PrintWriter w = response.getWriter();
        w.println(request.getParameter("sap_element_01") + " " + request.getParameter("sap_element_02") + " " + request.getParameter("sap_element_03"));
        w.flush();
        w.close();
       
//        System.out.println(a);
    }
}
###########################################################################################

'프로그래밍 > Java' 카테고리의 다른 글

[HttpURLConnection] HttpURLConnection 에서 GET / POST 방식 사용상의 주의  (0) 2009.02.19
CLASSPATH  (0) 2009.01.06
[펌] HttpURLConnection 을 이용하세요  (0) 2009.01.02
04 UDP  (0) 2007.11.27
03 졸려....  (0) 2007.11.27
// 해당 URL을
URL url    = new URL( "http", host, port, dir + "?member_id=" + memberID );
// 연결하고
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
// 응답이
int responseCode = connection.getResponseCode();
                
String line    = "";
// 성공이면
if ( responseCode == HttpURLConnection.HTTP_OK )
{
BufferedReader  br      = new BufferedReader( new InputStreamReader( connection.getInputStream() ) );
    // 해당 URL의 끝을 볼때까지 라인을 읽어서                
    while ( ( line = br.readLine() ) != null)
    {
        result    += line;
    }                    
}

result 값을 파싱하시면 될겁니다.

출처: http://www.javanuri.com/devforum/boardView.jsp?menuId=137425&Id=303830&gb=qna

'프로그래밍 > Java' 카테고리의 다른 글

CLASSPATH  (0) 2009.01.06
HttpURLConnection 사용례  (0) 2009.01.06
04 UDP  (0) 2007.11.27
03 졸려....  (0) 2007.11.27
02 2일째....  (0) 2007.11.27

[펌] OLAP & DataWarehouse

프로그래밍/읽을거리 2008. 11. 26. 09:56 Posted by galad
DataWarehouse는 기업내의 의사결정을 지원해 주는 애플리케이션으로
정보제공을 위한 통합된 데이터 저장공간, 또는 의사결정지원과정에서 효과적으로 사용될 수 있도록 추출/변환/통합되고 요약된
읽기 전용데이터베이스를 가르킵니다.
데이타는 각 부서의 거래처리(TP: Transaction Processing)
시스템들에서 전달되어 통합되는데, 데이터는 날짜나 부서, 거래가 아니라 고객을 위주로 배열되며 보고서 작성기, 질의 도구, 데이타 검색 도구,
OLAP 서버, 기업정보시스템(EIS: Enterprise Information Systems) 등을 통해 유용한 정보를
만들어 냅니다. 즉 기업의 의사 결정 과정을 향상시켜주는 정보기술입니다.
DataWarehouse는 다양한 형태의 data를 포함하게 되는데, 이를 통해 특정 시점의 기업환경에 대하여 일관적으로 관찰할 수
있게 됩니다. 또한 업무 운영보다는 정보제공의 성격을 띠고 있습니다. 기업의 현업 실무자들이 주로 사용하는 OLTP 시스템과는 달리, 의사 결정권자들이
주로 사용합니다. 다시 말하면 OLTP 시스템이 업무 절차를 자동화시킨다면, DataWarehouse는 의사결정을
지원하는 것을 말합니다.
 
또한 별도의 하드웨어 플랫폼의 저장소를 말합니다. 데이터베이스의 개념과 비슷하지만 차이점은 이미 저장되어있는 데이터를 재가공, 추출하여
별도로 저장하는 곳이라 할 수가 있습니다. 즉 기업의 다른 시스템(보통 운영계 시스템이라 합니다.)으로부터 추출된 정보의 저장소를 가르킵니다.
 

이 지식은 삼성경제연구소에서 공유해주셨습니다.



출처 Think Alexandros the Great. Macedonia | 엔터프라
원본 http://blog.naver.com/edufuture/60021707433

OLAP : On-line Analysis Processing (온라인 분석 프로세싱)
 
분석과 관리 목적을 위해서 다차원데이터를 모으고, 관리하고, 프로세싱하고 표현하기위한, 응용프로그램 및 기술들의 종류


정리 요약되어있는 데이터를 유연한 방법으로 추출하는 방법론을 OLAP라고 한다.


대규모 데이터에 대한 실시간 분석처리. 정보시스템 사용자가 다차원 정보에 직접 접근하여 저장된 데이터를 추출, 가공하여 사용자의 질의어를 대화식으로 처리하고 추출된 정보를 분석하며 이를 의사결정에 활용하는 작업

 

 

===========================================================================================================

 

 DataWareHouse


지금은 Siebel의 사장님으로 계신 장동인씨가 한국 오라클 기술 본부 이사님으로 있을 때 지으신 책 중에 실무자를 위한 데이터 웨어하우스라는 책을 보면 이런 말이 있습니다.

내용을 그대로 옮겨보면....

데이터 웨어하우스란,
- 수년간의 (historical data)
- 기업의 운영계 시스템에서 생긴 내부 데이터와 (internal data)
- 외부 데이터를 (external data)
- 주제별로 통합하여 (subject-oriented)
- 별도의 프로그래밍 없이 (end-user computing)
- 즉시 (on - line)
- 여러 각도에서 분석을 가능케 하는 (mylti-dimensional analsys)
- 통합 시스템 (integrated system)이다.

.... 라고 설명하고 있습니다.

따라서 DW란 것은 고객에 편중된 것이 아닌 매출, 고객, 생산, 수주 등 기존의 운영계 시스템에서 발생하는 기업 내부의 데이터 및 경쟁사 정보, 인구 정보, 해외 정보 등 기업 외부의 데이터 까지 모두 통합되어 있는 시스템이라는 겁니다.

이런 개념은 오래전 부터 있어왔으나 실제 성능 및 가격에서 도저히 구축할 수 없는 가상의 시스템이었다가, 하드웨어의 성능 향상과 가격의 하락, 대용량 및 병렬 컴퓨팅을 지원하는 데이터 베이스의 개발로 DW는 본격적으로 막을 올리게 되었는데요..... 이는 이전에 존재하던 작은 규모의 데이터베이스 시스템들끼리 서로 통합을 할 수 있는 배경을 만들어준 셈이죠.

그러나 통합을 하기에 앞서 서로 다른 여러 데이터베이스 속에는 분명히 중복되는 데이터가 존재하기 마련이고, 불필요하거나 잘못 들어가있는 데이터들도 많다는 것입니다.
따라서 데이터 클렌징이라는 과정을 통해 데이터를 정제하는 작업을 필요로하게 됩니다.

데이터 웨어하우스를 구축하게 될때는 회사의 전략에 따라 얼마만큼의 범위를 어느 기간내에 만들어야 하며, 데이터 웨어하우즈의 위치는 어디에 둘 것이며(로드, 추출의 문제가 중요 안건이겠죠), 어떠한 모델로 얼마나 많은 사람들이 접근 할 것인가를 결정 해야 하며 이를 통해 데이터 웨어하우징의 범위를 결정하게 됩니다.

이때, 너무 성급한 목표, 전략 그리고 무엇을 어떻게 볼 것인가에 대한 자료의 정의가 필수적인데 이에 대한 해답을 외부에서 찾으려고 하거나 자신의 기준으로만 판단하는 경향이 강하기 때문에 DW 작업이 원활하게 이루어지지 않는 경우가 많습니다.

이를테면 구축 업체에게 모든 문제의 해결책의 제시를 요구하거나, 재촉을 한다던가, 계속되는 요구의 변화 및 확대, 요구사항 불이행, 확고하지 않은 의지 등은 큰 장애가 됩니다.

말이 너무 이상한 방향으로 흘렀는데요, 저는 데이터웨어하우스란 시간적 개념이 포함된 사용하기 쉬운 통합된 데이터베이스라고 정의하고 싶네요.
그리고 이 과정에 데이터 정제 작업이 들어간다고 말씀 드리고 싶습니다.


[펌] MySQL 사용하기

프로그래밍/DB 2008. 11. 25. 17:46 Posted by galad

MySQL에서 root 암호 설정

mysqladmin을 이용하여 root 암호 설정

MySQL을 처음 설치하면 root 암호가 설정되어 있지 않기 때문에 반드시 설치 후 바로 root 암호를 먼저 설정해주세요.%%% root 암호를 설정하기 위해서는

 $ mysqladmin -u root -p password new-password

이러한 명령을 실행하면 됩니다. 실행하면 패스워드를 입력하라고 하는데 처음 root의 패스워드는 없으므로 그냥 엔터를 치시면 root 패스워드가 변경됩니다.

update문을 이용하여 root 암호 설정

 $ mysql -u root mysql

 mysql> update user set password = password('new-password') where user = 'root';
 mysql> flush privileges;

set password를 이용하여 root 암호 설정

 mysql> set password for root = password('new-password');

마지막으로 패스워드가 재대로 변경되었는지 테스트를 합니다.

 $ mysql -u root -p

MySQL에서 Database 보기와 생성

데이터베이스 보기

 myslq> show databases;

데이터베이스 생성

 mysql> create database DB명;

MySQL에서 새로운 사용자 추가

MySQL에서 사용할 Database를 만든 후에 사용자를 추가하려면, 일단 root로 접속한 후

 $ mysql (?h localhost) ?u root ?p
 Enter password: *******

 mysql> use mysql
 mysql> INSERT INTO user VALUES('%', '사용자', PASSWORD('비밀번호'),
     -> 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y');

이렇게 해서 사용자를 하나 만들었습니다. 맨 처음 ‘%’ 가 붙은 것은 다른 어느 호스트에서도 접속이 가능하게 하기 위해서 입니다. 간단하게 추가 하는 방법이 있습니다.


'GRANT' 명령을 이용하면 쉽게 사용자 추가 및 권한 설정이 가능합니다. (MySQL Manual 4.3.5)

  • 일반 사용자 추가
 mysql> grant all privileges on dbuser.* to dbuser@localhost identified by 'password' 
with grant option;

  • 특정 이름의 데이터베이스에 대한 모든 권한을 가지는 사용자 추가
 mysql> grant all privileges on `dbuser_%`.* to dbuser@localhost identified by 'password' 
with grant option;

'dbuser_'으로 시작되는 데이터베이스에 대한 모든 권한을 가지는 'dbuser' 사용자 계정 추가%%% 이런식으로 계정을 만들면 새로운 사용자에 대한 개별적인 데이터베이스 권한 설정을 생략할 수 있습니다. -- 이현진


사용자에게 Database 사용 권한을 주기

 mysql> INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv, 
Create_priv, Drop_priv)
     -> VALUES('%', 'DB명', '사용자', 'Y', 'Y', 'Y', 'Y','Y','Y');

모든 권한을 준다면 아래와 같은 방법을 하는것이 더욱 편리힙니다.

 mysql> GRANT ALL on DB명.* TO id@'localhost'  ;
 mysql> GRANT ALL on DB명.* TO id;
 mysql> GRANT ALL on DB명.* TO id@'xxx.xxx.xxx.%';

첫번째 localhost?로컬 호스트 (DB가 자기컴퓨터에 깔려 있는경우..에만 접속을 허용하겠다는 뜻입니다.

두번째 문장은 로컬 호스트를 제외하고는 모든 ip에서 접근을 시키겠다는 내용입니다.

세번째는 c클래스만 허용하겠다는 의미 입니다. xxx.xxx.%.% 면 B클래스 xxx.%.%.%면 A클래스로 제한을 할수 있습니다.

그리고 변경된 내용을 메모리에 반영하기 위해 다음 명령을 실행합니다.

 mysql> FLUSH PRIVILEGES;

이렇게 MySQL을 설정해 놓으면 사용자가 다른 호스트에서도 접속할 수 있고 테이블 추가 삭제 등도 할 수 있습니다.


이렇게 수동으로도 가능 하지만 요즘은 툴을 많이 사용합니다. 툴은 DB에 대한 기본적인 지식만 있으면 무리가 없이 사용 되는 녀석이죠 ^^%%% 저같이 쿼리에 약한 사람들에게는 정말 유리 합니다. 아래 페이지에 가셔서 다운로드를 받으세요 :) 한글 사용에 약간의 제약이 있습니다.%%% 다른 여러가지 DB관리 툴이 있지만 상당히 고가의 툴이랍니다 :) 암흑의 루트에서 돌고 있는 녀석들이 종종 있습니다.

http://www.mysql.com/downloads/mysqlcc.html


출처: http://www.gpgstudy.com/gpgiki/MySQL%EC%97%90%EC%84%9C%20%EC%82%AC%EC%9A%A9%EC%9E%90%EC%99%80%20%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%20%EB%A7%8C%EB%93%A4%EA%B8%B0

'프로그래밍 > DB' 카테고리의 다른 글

ORLCLE->MSSQL  (0) 2009.01.14
[펌/DB관련팁] 일간/월간/연간 통계 시  (0) 2009.01.09
[펌] mysql root 암호 분실 시  (1) 2008.11.25
[펌]PLSQL 초보  (0) 2008.01.10
PL SQL문제  (0) 2008.01.10

[펌] mysql root 암호 분실 시

프로그래밍/DB 2008. 11. 25. 17:19 Posted by galad


1>암호 초기화
# killall mysqld (데몬을 죽입니다)

# cd /usr/local/mysql (mysql이 깔린 곳으로 갑니다)

# ./bin/safe_mysqld --skip-grant &

여기까지가 초기화


2>새 암호 넣기
# ./bin/mysql (sql 실행)

mysql>use mysql

mysql>update user set password=password('새암호') where user='root';
(root 암호 변경합니다. '새암호' 자리에 새암호를 넣으세요
예>update user set password=password('1234') where user='root';

mysql> FLUSH PRIVILEGES
mysql> exit

# ./bin/mysql -uroot -p1234 으로 들어와지면 성공입니다

출처: http://kurapa.com

'프로그래밍 > DB' 카테고리의 다른 글

[펌/DB관련팁] 일간/월간/연간 통계 시  (0) 2009.01.09
[펌] MySQL 사용하기  (0) 2008.11.25
[펌]PLSQL 초보  (0) 2008.01.10
PL SQL문제  (0) 2008.01.10
DBMS_LOCK 사용 시 에러  (0) 2008.01.10

[펌]PLSQL 초보

프로그래밍/DB 2008. 1. 10. 15:57 Posted by galad

- PLSQL은 SQL에 프로그래맹 언어 설계 기능을 추가한 것이다.

- SQL의 데이터 조작문 및 질의문은 프로시저 단위코드에 포함된다.


< PL/SQL >

- Anonymou block : 평상시 script로 저장했다가 사용

- Function, Procedure

- Package : Function과 Procedure의 모음

- Trigger : 이벤트에 반응하는 로직


< PL/SQL의 블록구조 >

  -- DECLARE

          변수선언, 커서, 사용자가 정의한 예외사항

  -- BEGIN

          SQL문, PL/SQL문

  -- EXCEPTION

          오류가 발생할 때의 수행작업

  -- END;


※첨부파일 실행시 스키마를 고려하여 DB에 접속해야 한다.


< PL/SQL 공통 >


-- 생성한 함수/프로시져 조회
SQL> SELECT DISTINCT NAME FROM USER_SOURCE;
--생성 후에는 꼭 에러 여부를 확인한다.
SQL> SELECT * FROM USER_ERRORS; //마지막에 실행한 명령의 에러를 가지고 있다.


< PLSQL - EditPlus환경설정 >

※첨부파일

plsql2.zip

plsql2_구문강조_사용설명서.txt


======================================================================


< PLSQL - variable >

※첨부파일

plsql_variable01.sql

plsql_variable02.sql

plsql_variable03.sql


< PLSQL - cursor >

※첨부파일

plsql_cursor01.sql

plsql_cursor02.sql

plsql_cursor03.sql

plsql_cursor04.sql

plsql_cursor05.sql


< PLSQL - exception >

※첨부파일

plsql_exception01.sql

plsql_exception02.sql


< PLSQL - 종합문제 >

※첨부파일

plsql_exe01.sql : 종합문제 NO1 :사원별 급여현황에 따른 '*',급여 출력

plsql_exe02.sql : 종합문제 NO3 :급여 누적값 출력(1)

plsql_exe03.sql : 종합문제 NO3 :급여 누적값 출력(2)

plsql_exe04.sql : 종합문제 NO2 : 년도별 입사한 사원수 출력


 

======================================================================

** PROCEDURE : 어떠한 작업처리가 목적이다.

                         VALUE를 반환 할수도 안할 수도 있다.

                         SQL문에서 사용불가,

                         여러개의 인자를 받을수있다.


** FUNCTION : 반드시 한개의 VALUE를 반환한다.

                      SQL문에서 사용가능(사용자 정의 함수)


< PLSQL - PROCEDURE(프로시져) >

※첨부파일

procedure01_raise_salary.sql

procedure02_updownsalary.sql

procedure03_query_emp.sql

procedure03_query_emp_plsql.sql


< PLSQL - FUNCTION(함수) >

※첨부파일

function01_get_sal.sql : 사원번호를 받아 급여를 출력하는 함수

function02_annsal.sql : 연봉을 구하는 함수

function03_find_dname.sql : 특정 사번을 그 사원의 부서명을 출력하는 함수


< PLSQL - TRIGGER >

※첨부파일

trigger01_secure_emp.sql

trigger02_copy_insert.sql

trigger03_update_dept.sql

trigger04_delete_dept.sql

trigger05_delete_emp.sql

trigger06_set_null_emp.sql

trigger07_update_cascade_emp.sql

trigger08_audit_emp_values.sql

'프로그래밍 > DB' 카테고리의 다른 글

[펌] MySQL 사용하기  (0) 2008.11.25
[펌] mysql root 암호 분실 시  (1) 2008.11.25
PL SQL문제  (0) 2008.01.10
DBMS_LOCK 사용 시 에러  (0) 2008.01.10
[펌]SQL*plus FAQ 및 TIPS  (0) 2008.01.09

PL SQL문제

프로그래밍/DB 2008. 1. 10. 15:43 Posted by galad

금일 PL SQL문제중 이런게 나왔었다. 잘 기억은 안난다만... 인사관리를 짜라고 했는데...

등록되어 있는 사원들의 평균 급여를 내어 출력하고 평균 급여가 메니져보다 높은 사람의 급여를

15% 삭감하고, 삭감할 사람의 나이가 평균 나이보다 높을 사람의 경우에는 그대로 두어라...

물론 실제 문제랑은 많이 차이가 있음. 책에도 이런문제는 많이 있을 듯...


주요 조건은 프로시져로 짜야하며 패키지와를 시켜야 하고 폴더는 어디에 주석은 어떻게 달아야 하고

제한시간 1시간. 저건 문제중 한개이고... 총 문제수 5문제......-_-;;;;

'프로그래밍 > DB' 카테고리의 다른 글

[펌] mysql root 암호 분실 시  (1) 2008.11.25
[펌]PLSQL 초보  (0) 2008.01.10
DBMS_LOCK 사용 시 에러  (0) 2008.01.10
[펌]SQL*plus FAQ 및 TIPS  (0) 2008.01.09
[펌]DECODE 이용사례 (4) - BETWEEN OPERATOR  (0) 2008.01.09

DBMS_LOCK 사용 시 에러

프로그래밍/DB 2008. 1. 10. 10:20 Posted by galad
DBMS_LOCK.SLEEP()을 사용하려고 하는데, isql모드(sqlPlus)에서는 무리없이 수행되나, PL/SQL에서 사용하면 하기와 같은 에러가 발생합니다.
PLS-00201: identifier 'SYS.DBMS_LOCK' must be declared



system 계정에서 다음과 같이 권한을 주세요
> sqlplus /nolog

// sys유저에 sysdba권한으로 접속을 합니다
SQL*Plus: Release 9.2.0.5.0 - Production on Mon Feb 26 13:56:02 2007
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
SQL> conn sys/manager@oracle as sysdba

SQL> grant execute on dbms_lock to scott;

'프로그래밍 > DB' 카테고리의 다른 글

[펌]PLSQL 초보  (0) 2008.01.10
PL SQL문제  (0) 2008.01.10
[펌]SQL*plus FAQ 및 TIPS  (0) 2008.01.09
[펌]DECODE 이용사례 (4) - BETWEEN OPERATOR  (0) 2008.01.09
[펌]DECODE를 이용하여 원치 않는 자료를 없애는 방법  (0) 2008.01.09

[펌]SQL*plus FAQ 및 TIPS

프로그래밍/DB 2008. 1. 9. 17:45 Posted by galad
(V7.X ~ V8.X) : SQL*plus FAQ 및 TIPS
=============================================

Q) Row wrapping없이 flat ASCII file을 만드는 방법
Q) 두 개의 Date type column 사이의 평균 시간을 구하는 방법
Q) Ampersand나 특수 문자를 갖는 데이타를 insert하는 방법
Q) SQL 내의 문자열 주변에 인용부호를 생성하거나 QUOTES를 생성하는 방법
Q) `LIKE` 연산자를 사용하여 case insensitive search를 할 수 있는 방법
Q) Column delimited flat file을 생성하는 방법
Q) Product_User_Profile에 관하여

1. Q) Row wrapping없이 flat ASCII file을 만드는 방법은 무엇입니까?

    A) `SPOOL` command와 `SET LINESIZE` 와 `SET BUFFER` command를 사용하시기 바랍니다.
sql query를 화일에 저장하기 위해서는 spool command를 사용하시면 됩니다.
화일 확장자를 기술하지 않으면, O/S에 따라서 다르지만, 대부분의 O/S에서는 .lst나 .lis를 사용합니다.
    SQL*plus에서 flat file을 생성하기 위해서는 먼저 다음과 같은 SET command를 기술하여야 합니다.
    SET NEWPAGE 0
    SET SPACE 0
    SET LINESIZE 80
    SET PAGESIZE 0
    SET ECHO OFF
    SET FEEDBACK OFF
    SET HEADING OFF

위의 command를 기술한 후에, spool command를 사용하시면 됩니다.


2. Q) 두 개의 Date type column 사이의 평균 시간을 구하는 방법은 무엇입니까?

    A) 다음과 같은 두 개의 row를 가지는 date field가 있다고 가정합니다.

    01-jan-96 01:10
    01-jan-96 01:20

sql> select avg(to_number(to_char(a, `MMDDYYHHMI`))) from x;

AVG(TO_NUMBER(TO_CHAR(A,`MMDDYYHHMI`)))
---------------------------------------
                               101960115

즉, 1:10과 1:20 사이의 평균 시간은 1:15입니다.


3. Q) Ampersand나 특수 문자를 갖는 데이타를 insert하는 방법은 무엇입니까?

    A) 해결 방법은 세 가지가 있습니다.

1> SQL*plus에서 SET DEFINE OFF나 SET SCAN OFF를 실행하여 substitution
variable(&)을 turn off시키는 방법입니다.

(Example)
    sql> SET DEFINE OFF
    sql> INSERT INTO table_name VALUES(`AT&T`);
    /
    1 row created

2> SET DEFINE ON 상태로 유지시키면서 substitution variable을 다른
non-alphanumeric 문자나 non-white space 문자(*, % 등등)로 대체시킨다.
 
(Example)
    sql> SET DEFINE %
    sql> INSERT INTO table_name VALUES(`AT&T`);
    /
    1 row created

3> SET ESCAPE ON 상태에서(DEFINE은 &로, SCAN은 ON상태로 유지) 특수 문자 앞에
escape 문자인 backslash(``)를 선행하도록 합니다.

(Example)
    sql> SET ESCAPE ON
    sql> SHOW ESCAPE
         ESCAPE "" (hex 5c)
    sql> INSERT INTO table_name VALUES (`select * from emp where ename=&1`);
    1 row created.
    sql> select * from table_name;

    COL1
    ---------------------------------------------------------
    SELECT * FROM EMP WHERE ENAME=&1


4. Q) SQL 내의 문자열 주변에 인용부호를 생성하거나 QUOTES를 둘 수 있습니까?

    A) 해결 방법은 다음과 같습니다.

1> Single quotation mark를 생성하기 위해서는 4 single quote(````)를 사용하
시기 바랍니다.

(Example)
    sql> select ```` from dual;
위의 문장을 실행 시 return되는 결과는 다음과 같습니다.
`
-
`

2> 문자열 주변에 single quote를 두기 위해서는 3 single quote 안에(```) 문자
열을 포함시키면 됩니다.

(Example)
    sql> select ```character string in quotes``` result
         from dual;

위의 문장을 실행 시 return되는 결과는 다음과 같습니다.

RESULT
-----------------------------------------------
`CHARACTER STRING IN QUOTES`

3> 참고로, Literal single quote를 생성하기 위해 연속적인 single quote mark
를 사용하는 방법은 다음과 같습니다.

(Example)
    srw.do_sql(`select decode(dname, ``NONE``, NULL, ``A``)
                from dept
                where deptno = 10`);

위의 문장을 실행 시 return되는 결과는 다음과 같습니다.

    select decode(dname, `NONE`, NULL, `A`)
    from dept
    where deptno = 10

(Example)
    DECLARE
       a varchar2(200);
       q char(1) := ````;
    BEGIN
       a := ```this is a ` || q || `quoted`` string` || q;
    END;

위의 문장을 수행 결과 스트링 a에는 `this is a `quoted` string` 이 저장됩니다.


5. Q) `LIKE` 연산자를 사용하여 case insensitive search를 할 수 있는 방법은
무엇입니까?

    A) LIKE 연산자를 사용하여 비교하기 위해 필드에 `UPPER` 함수를 사용하시면
됩니다.


6. Q) Column delimited flat file을 생성하는 방법은 무엇입니까?

    A) 해결 방법은 두 가지가 있습니다.

1> query 내에서 column 분리자를 concatenate시키면 됩니다.

(Example)
To delineate column text with TABs:
------------------------------------
sql> select deptno || chr(9) || dname from dept;

DEPTNO || CHR(9) || DNAME
------------------------------------
10        ACCOUNTING
20        RESEARCH
30        SALES
40        OPERATIONS

CHR(9) 문자함수는 query 문 안에 TAB을 embedding하기 위해 사용됩니다.

(Example)
To deleneate column test with COMMAs:
-------------------------------------
sql> select deptno || `,` || dname from dept;

DEPTNO || `,` || DNAME
-------------------------------------
10,ACCOUNTING
20,RESEARCH
30,SALES
40,OPERATIONS

Query 결과를 화일로 보내기 전에 다음과 같이 SET COMMAND를 수행하시기 바랍니다.

SET TERMOUT OFF
SET NEWPAGE 0
SET SPACE 0
SET LINESIZE 80
SET PAGESIZE 0
SET ECHO OFF
SET FEEDBACK OFF
SET HEADING OFF
SPOOL file_name

원하는 Query문 수행 후에는 다음과 같이 다시 setting 하시기 바랍니다.

SPOOL OFF
SET TERMOUT ON

SQL*plus 버젼 3.0.x와 3.1.x에서는 컬럼 사이의 간격을 조정하기 위해 column
분리자를 명시해 주는 SET COMMAND가 지원되지 않습니다.

2> SQL*plus 3.2 이상의 버젼에서는 COLSEP command를 사용하시면 됩니다.

Query 결과를 comma delimited flat file에 보내기 전에 다음과 같이 SET COMMAND
를 수행하시기 바랍니다.

SET TERMOUT OFF
SET NEWPAGE 0
SET SPACE 0
SET LINESIZE 80
SET PAGESIZE 0
SET ECHO OFF
SET FEEDBACK OFF
SET HEADING OFF
SET COLSEP `,`
SPOOL file_name

원하는 Query 문 수행 후에는 다음과 같이 다시 setting하시기 바랍니다.

SPOOL OFF
SET TERMOUT ON


7. Q) PUPBLD.SQL 스크립트를 찾지 못하여 public synonym을 drop할 수 없습니다.
해결 방법은 무엇이며, Product_User_Profile에 관하여 알고 싶습니다.

   A) Product_User_Profile은 product-level security를 제공하기 위해 DBA가
수정할 수 있는 테이블입니다.
    대부분의 오라클 product들은 SQL GRANT와 REVOKE command에 의해 제공되는
user-level security와 user role들을 추가한 product-level security를 제공하는
이 테이블을 사용합니다.  
    이 테이블을 생성하기 위해서는 SYSTEM으로 connect하여 PUPBLD.SQL이나
V7PUP.SQL을 돌려주어야 합니다.
   PUPBLD.SQL 스크립트를 실행하면 SYSTEM 계정 내에 product_profile과
user_profile 테이블을 생성해 줍니다. 여기에는 두 개의 view가 있는데,
product_privs와 user_privs가 그것입니다.
    사용자들은 product_profile과 user_profile이라는 이름으로 조회할 수 있습
니다.
이 view를 조회하면 해당 계정에 관한 privileges와 profile들을 알 수 있습니다.
    그런데, 현재 사용 중인 일부 product나 user profile structure는 제거하지
않기 때문에 manual하게 table, synonym, view들을 drop해 주어야 합니다.
    만약, delete해야 할 내재하는 structure가 있다면, 다음의 SQL문을 SQL*plus
에서 수행해 주시기 바랍니다.

    drop synonym product_user_profile;
    drop table product_profile;
    drop table product_user_profile;
    drop view product_privs;
    revoke select on product_privs from public;
    drop public synonym product_profile;
    drop synonym product_user_profile;
    drop public synonym product_user_profile;
    drop table user_profile;
    revoke select on user_profile from public;
    drop view user_privs;
    revoke select, update, insert, delete on user_privs from public;
    drop public synonym user_profile;
PURPOSE
---------

특정 범위를 설정하고 그 범위 사이에 있는 salary를 가진 사람의 count를
구하려면 다음과 같이 한다.


Explanation
-----------

    직원의 급여 테이블에서 특정 범위의 급여를 받는 사람이 몇 명인지
    나타내주는 SQL을 DECODE, COUNT 함수를 이용하여 구현하기로 한다.


Example
--------

SQL> SELECT count(decode(sign(sal-4999), 1, sal)) "5000 - ",
             count(decode(sign(sal-5000), -1,
                      decode(sign(sal-3999), 1, sal))) "4000-4999",
             count(decode(sign(sal-4000), -1,
                      decode(sign(sal-2999), 1, sal))) "3000-3999",
             count(decode(sign(sal-3000),-1,
                      decode(sign(sal-1999),1,sal))) "2000-2999",
             count(decode(sign(sal-2000),-1,
                      decode(sign(sal- 999),1,sal))) "1000-1999",
             count(decode(sign(sal-1000),-1,sal)) "- 1000"
      FROM   emp;


    5000 -   4000-4999  3000-3999   2000-2999   1000-1999     - 1000
   --------  ---------  ---------   ---------   ---------    --------
        1           0          2           3           6           2
다음과 같은 자료를 갖는 TABLE을 가정해보자.

Employee Name     Employee Address   City         State     ZIP
-------------     ----------------   -----------  -----    ---------
Donald Duck       101 Cool Pond      Bedford      OR       12345
Bugs Bunny        540 Carrot Way     Atlanta      GA       29292
Elmer Fudd
Taz Devil         999 Wildwoods      Nashville    TN       99999  

REPORT를 생성할 때에는 종종 CITY와 STATE를 COMMA(,)로 연결하여 출력하곤
한다.
이때 다음과 같이 COLUMN 간에 CONCATENATING를 이용하면 가능하다.

select employee_name,
        employee_address,
        city || `, ` || state || ` ` || zip  city_state_zip
   from decode_sample;


위의 문장은 다음과 같은 결과를 갖는다.

EMplOYEE_NAME        EMplOYEE_ADDRESS     CITY_STATE_ZIP
-------------------- -------------------- ------------------------
Donald Duck          101 Cool Pond        Bedford, OR 12345
Bugs Bunny           540 Carrot Way       Atlanta, GA 29292
Elmer Fudd                                ,
Taz Devil            999 Wildwoods        Nashville, TN 99999

위와 같은 경우에서 주소의 자료가 없는 경우 필요없는 COMMA만 출력되게 된다.
이런 경우에 DECODE문을 이용하여 다음과 같이 처리하면 깔끔한 OUTPUT을
받을 수 있게 된다.

select employee_name,
        employee_address,
        city || decode(`, ` || state,`, `,``,`, ` || state) || ` `
             || zip  city_state_zip
   from decode_sample;

EMplOYEE_NAME        EMplOYEE_ADDRESS     CITY_STATE_ZIP
-------------------- -------------------- ------------------------
Donald Duck          101 Cool Pond        Bedford, OR 12345
Bugs Bunny           540 Carrot Way       Atlanta, GA 29292
Elmer Fudd
Taz Devil            999 Wildwoods        Nashville, TN 99999
PURPOSE
---------

절대적인 값이 아닌 A와 B 사이의 값과 같은 range에 따른 값에 따라
DECODE function을 이용할 수 있을까? 이미 BETWEEN A AND B가 사용되지
못함을 경험했을 것이다.


Explanation
-------------

Emp table에서 2000과 4000사이의 값을 `2000~4000`로 4001과 5000
사이의 값을 `4001~5000`로 나머지 값들은 `other`로 display하고자 한다.


범위           Decode
-------------  ------
2000 - 4000     2000~4000
4001 - 5000     4001~5000
default         other


Example
---------

  select  empno, ename, sal,
          DECODE(sal, GREATEST(LEAST(sal, 4000), 2000), `2000~4000`,
                      GREATEST(LEAST(sal, 5000), 4001), `4001~5000`,
                      `other`)
          from emp;

           EMPNO ENAME                  SAL DECODE(SA
--------------- ---------- --------------- ---------
            7369 SMITH                  800 other
            7499 ALLEN                 1600 other
            7521 WARD                  1250 other
            7566 JONES                 2975 2000~4000
            7654 MARTIN                1250 other
            7698 BLAKE                 2850 2000~4000
            7782 CLARK                 2450 2000~4000
            7788 SCOTT                 3000 2000~4000
            7839 KING                  5000 4001~5000
            7844 TURNER                1500 other
            7876 ADAMS                 1100 other
            7900 JAMES                  950 other
            7902 FORD                  3000 2000~4000
            7934 MILLER                1300 other
방법1) SQL*plUS에서 각각의 TABLE에 대하여 ANALYZE를 실행하면
        USER_TABLES Data Dictionary에 각각의 record 건수가 등록된다.

방법2) SQLplUS에서 pl/SQL Program으로 처리한다.
==============================================================
create or replace procedure row_cnt
is
   cursor_name     integer;
   rows_processed  integer;
   rowcnt          number := 0;
   cursor c1 is select table_name from user_tables;
begin
   cursor_name := dbms_sql.open_cursor;
   for i in c1 loop
       dbms_sql.parse(cursor_name,
                      `select count(*) from `|| i.table_name,
                      dbms_sql.v7);
       dbms_sql.define_column(cursor_name,1,rowcnt);
       rows_processed := dbms_sql.execute(cursor_name);
       if dbms_sql.fetch_rows(cursor_name)> 0 then
          dbms_sql.column_value(cursor_name,1,rowcnt);
          dbms_output.put_line(rpad(i.table_name,30,` `)||` `
                               ||lpad(to_char(rowcnt),12,` `));
     end if;
   end loop;
   dbms_sql.close_cursor(cursor_name);
end;
==============================================================
$ sqlplus scott/tiger

SQL>  select trunc(date2-date1) || ` day  ` ||
              trunc(mod((date2-date1),1)*24) || ` hour  ` ||
              trunc(mod((date2-date1)*24,1)*60) || ` minute  ` ||
              trunc(round(mod((date2-date1)*24*60,1)*60)) || ` sec  `
              " Time Interval "
         from dual;
PURPOSE
-------
다음은 특정위치의 문자열이 한글인지 영문인지 즉, 문자유형을 판별하는
방법에 대해 간단한 예와 함께 소개한다.

Explanation
-----------
PL/SQL을 사용할 때 문자열의 특정 위치에 있는 문자가 ASCII인지, 한글의 첫번째
바이트인지, 또는 한글의 두번째 바이트인지를 확인해야 할 경우가 있습니다.
이런 경우, 문자 코드 값이 특정 값(예를 들어, KSC5601의 경우에는 0xA1)보다 큰지
작은지를 비교하여 판단하는 루틴을 사용하면 DB CharacterSet이 다른 경우에는
전혀 사용할 수 없습니다.  아래의 PL/SQL 함수는 Oralce WebServer의 NLS 문제를
해결하기 위해 만든 것입니다.  절대값과 비교하는 방식을 사용하지 않았으므로
DB CharacterSet에 관계없이 사용할 수 있습니다.
 
Example
-------
/* determine character type from cbuf of specified position bytepos */
/*   bytepos is zero-based */
/*   return : 0 if ascii, 1 if 1st byte of DBCS, 2 if 2nd byte of DBCS */
 
function nls_getchartype (cbuf in varchar2, bytepos in integer) return
integer
is
    loc integer:=0;
    ret integer:=0;
begin
    if cbuf is NULL then  
       return 0;  
    end if;
    
    while (loc <= bytepos)
    loop
       if (ret = 1 ) then
          ret := 2;
       elsif (length(substrb(cbuf, loc+1, 2)) = 1) then
          ret := 1;
       else
          ret := 0;
       end if;
       loc := loc + 1;
    end loop;
    return ret;
end;


위가 않되는 경우 아래의 function을 실행하십시요.

create or replace function nls (cbuf in varchar2, bytepos in integer) return
integer
is
    loc integer:=1;
    ret integer:=0;
begin
    if cbuf is NULL then  
       return 0;  
    end if;
    
    while (loc <= bytepos)
    loop
       if (ret = 1 ) then
          ret := 2;
       elsif (length(substrb(cbuf, loc, 2)) = 1) then
          ret := 1;
       else
          ret := 0;
       end if;
       loc := loc + 1;
    end loop;
    return ret;
end;

**실행 **


SQL>variable a number;
SQL>  exec :a := nls(`t하t`,1);

PL/SQL procedure successfully completed.

SQL> print a

          A
----------
          0

SQL> exec :a:=nls(`t하t`,2);

PL/SQL procedure successfully completed.

SQL> print a

          A
----------
          1

SQL> exec :a := nls(`t하t`,3);

PL/SQL procedure successfully completed.

SQL> print a

          A
----------
          2
PURPOSE
-------

간단한 xml 문서를 PLSQL을 이용해서 database 에
저장하고 PLSQL parser 를 이용해 validate 하는 방법을
예제를 통해 알아 봅니다.


Example
-------

Step1
-----

xml 문서를 저장할 table 을 생성합니다.

CREATE TABLE xml_doc (
docname    VARCHAR2(100) PRIMARY KEY,
doc        CLOB,
insertdate DATE DEFAULT SYSDATE);


Step 2
------

XML 문서는 os 의 physical directory 에 있으므로 oracle database
에 logical directory 를 만들어 mapping 시켜주어야 합니다.

SQL> CREATE DIRECTORY xmldocs AS `C:XML`;


만일 ORA-1031 에러가 발생할 경우 SYS 또는 SYSTEM user 로 접속해서
다음 명령으로 권한을 줍니다.

SQL> grant create any directory to scott;
Grant succeeded.


Step 3
------

database 에 넣을 XML 문서를 만듭니다.



  
     7844
     Manager
     100000
  

  
     100
     President
     200000
  




위에서 만든 emp.xml 파일을 db 에 insert 할 PLSQL procedure 를 생성합니다.


CREATE OR REPLACE PROCEDURE insertXML (dirname IN VARCHAR2,
                                       filename IN VARCHAR2)
IS
   xmlfile BFILE;
   myclob  CLOB;
BEGIN
   INSERT INTO xml_doc (docname, doc)
   VALUES (filename, empty_clob())
   RETURNING doc into myclob;  
  
   -- get a handle to the xml file on the OS
   xmlfile := Bfilename(dirname,filename);

   -- open the file
   DBMS_LOB.fileOpen(xmlfile);

   -- copy the contents of the file into the empty clob
   DBMS_LOB.loadFromFile(myclob, xmlfile, dbms_lob.getLength(xmlfile));

END insertXML;
/

Execute the Procedure

SQL> EXEC insertXML(`XMLDOCS`, `emp.xml`);

PL/SQL procedure successfully completed.



Step 4
------

insert 된 data 를 확인해 봅니다.

SQL> select * from xml_doc;

DOCNAME         DOC                                      INSERTDATE
--------------- ---------------------------------------- ---------------
emp.xml        
                          27-OCT-00
                                  
                                                  
                     7844

[펌] JExcelApi & POI

프로그래밍/Library 2007. 11. 28. 11:06 Posted by galad

JExcelApi(jxl.jar 다운로드)


http://www.andykhan.com/jexcelapi/index.html 에서 download JExcelApi에 가면
(http://www.andykhan.com/jexcelapi/download.html) tar.gz로 되어 있는데 압축풀면 jxl.jar있음


POI다운로드
http://jakarta.apache.org/poi/index.html /download/release


[엑셀파일읽기]

<%@ page language="java" %>
<%@ page contentType="text/html; charset=euc-kr"%>
<%@ page import="java.io.File,jxl.*"%>
<%


Workbook workbook = Workbook.getWorkbook(new File("E:/_Workspace/blr/blr/cms/excel/data/Book1.xls"));


Sheet sheet = workbook.getSheet(0);
Cell a1 = sheet.getCell(0,0);
Cell b2 = sheet.getCell(1,1);
Cell c3 = sheet.getCell(0,2);


String stringa1 = a1.getContents();
String stringb2 = b2.getContents();
String stringc3 = c3.getContents();


workbook.close();


%>


<%=stringa1%>
<%=stringb2%>
<%=stringc3%>


[엑셀파일로 저장]


<%@ page language="java" %>
<%@ page contentType="text/html; charset=euc-kr"%>
<%@ page import="java.io.File,java.util.Date,jxl.*,jxl.write.*"%>
<%
WritableWorkbook workbook = Workbook.createWorkbook(new File("E:/_Workspace/blr/blr/cms/excel/data/aaa.xls"));


WritableSheet sheet = workbook.createSheet("First Sheet", 0);
Label label = new Label(0,2,"A label record");
sheet.addCell(label);


// java.lang.Number 인지 jxl.write.Number  구분해야지^^


jxl.write.Number number = new jxl.write.Number(3,4,3.1415);
sheet.addCell(number);


workbook.write();
workbook.close();
%>


[POI로 테이블에 값넣기] poi.jsp참조


/***************************************************************************************/


엑셀파일처리 POI,JXL비교해 보았습니다.


10000번 for문을 돌려 첫번째 칼럼에 데이타를 입력하였습니다.


이걸 10번 반복한 체크시간입니다.




측정시간단위(밀리세컨)
D:\>java writeTest
============= jxl write time =============
0=>write time::719
1=>write time::281
2=>write time::250
3=>write time::266
4=>write time::234
5=>write time::266
6=>write time::234
7=>write time::266
8=>write time::234
9=>write time::329
=============      end      =============
============= poi write time =============
0=>write time::1110
1=>write time::922
2=>write time::1031
3=>write time::734
4=>write time::1328
5=>write time::766
6=>write time::797
7=>write time::1515
8=>write time::1719
9=>write time::2890
=============      end      =============



거의 2~3배 가까이 시간의 차이가 있더군여.. 단순히 엑셀파일만 다룬다면
jxl패키지를 사용하시는게 훨씬 좋을듯 합니다.

참조 : www.javapattern.info         www.okjsp.pe.kr


 자바 개발자라면 한번쯤은 Anti-MS를 외치면서,
무조건적으로 빌모씨 욕한번쯤은 해보았을 것이다.


허나 실상, 개발은 MS의 운영체제위에서 하고 있고,
이 창문이란게 없으면 넘 불편할 것도 같다.


특히, 고객은 모든 데이터를 Excel상에서 보고싶어 한다.


이런이유로 자바 개발자라고 해도, 이 엑셀을 잘 활용하여,
고객만족의 기쁨을 누려야 할 것이다.




자바로 엑셀을 핸들링 할 수 있는 방법은 크게 두가지로 나누어 진다.
1. Java Excel API   
    참조 : http://www.andykhan.com/jexcelapi/
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();
    }
}


// ... 생략

[펌] 각종 제어

프로그래밍/Library 2007. 11. 28. 11:04 Posted by galad

http://blog.naver.com/galad/140037028567

출처 블로그 > 맛깔나는 인생
원본 http://blog.naver.com/dltjdals8110/50003851272

 /**
  * コード類をフォーマット
  *
  * 与えられたサイズに足りない場合は空白を入れてフォーマットする
  * @param cd
  * @param size
  * @return
  */
 public static String cdFormat(String cd, int size) {
  String formatStr;
 
  if(cd == null || Constant.EMPTY_STR.equals(cd)){
   formatStr = cd;
  } else {
   for(int i = 0; i < size; i++){
    cd = cd + Constant.SPACE;
   }
   
   formatStr = cd.substring(0, size);
  }
 
  return formatStr;
 }
 
 /**
  *  文字列の後ろの半角スペースを削除する
  * 문자열의 뒤의 반각 스페이스를 삭제한다
  * @param str:文字列
  * @return 後ろの半角スペースを削除した文字列
  */
 public static String rTrim(String str) throws Exception{

  if(str != null && !Constant.EMPTY_STR.equals(str)){

   if(Constant.EMPTY_STR.equals(str.trim())){
    str = str.trim();
   } else {
    int len = str.length()-1;
   
    int i;
    for(i=0;;i++){
     if(str.charAt(len-i) != ' ') break;
    }
    str = str.substring(0,len-i+1);
   }
  }
 
 
  return str;
 }
 
 /**
  * nullチェック
  * @param str
  * @return bookean true:可 false:null
  * @throws Exception
  */
 public static boolean chkNull(String str) throws Exception{
 
  if(str == null || str.trim().equals(Constant.EMPTY_STR)){
   return false;
  }
 
  return true;
 }
 
 /**
  * 半角英数字チェック

  *반각영숫자 체크
  * @param myStr
  * @return boolean true:半角英数字あるいはnull false:半角英数字以外
  */
 public static boolean chkHanAlNum(String myStr) throws Exception{

     if(!chkNull(myStr)){
         return true;
     }
     myStr = myStr.trim();
  for (int i = 0; i < myStr.length(); i++) {

   char charData = myStr.charAt(i);
   if (((charData < 'A') || (charData > 'Z'))
     && ((charData < 'a') || (charData > 'z'))
     && ((charData < '0') || (charData > '9'))) {
    return false;
   }
  }
  return true;
 }
 
 
 /**
  * 半角チェック
  * @param str
  * @return boolean true:半角 false:全角
  * @throws Exception
  */
 public static boolean chkHankaku(String str) throws Exception{
    
     // nullだったら正常修了
     if(!chkNull(str)){
         return true;
     }
    
     byte[] bytes = str.getBytes();
        int beams = str.length();
        if (beams == bytes.length) {
            return true;
        } else {
            return false;
        }
 }
 
 /**
  * 半角カナを含ませない半角チェック

  *반각 가나를 포함하게하지 않는 반각 체크
  * @param str
  * @return boolean true:半角 false:全角あり、半角カナあり
  * @throws Exception
  */
 public static boolean chkHankakuNotHankana(String str) throws Exception{
    
     // nullだったら正常修了
     if(!chkNull(str)){
         return true;
     }
    
     // 半角カナが含まれていたら不可
     if(!chkHanKana(str)){
         return false;
     }
    
     // 半角チェック
     if(!chkHankaku(str)){
         return false;
     }
    
     return true;
 }
 
 
 
 /**
  * 入力数値のサイズチェック
  * 입력 수치의 사이즈 체크
  * 整数部と小数部のサイズが指定したとおりであるかチェックする
  * @param numInString
  * @param leftSize
  * @param rightSize
  * @return
  * @throws Exception
  */
 public static boolean chkNumSize(String numInString, int leftSize, int rightSize) throws Exception {
    
     if(numInString == null || Constant.EMPTY_STR.equals(numInString)){
         return true;
     }
    
     //数値解釈可能か?

    //수치 해석 가능한가
     try{
         Double.parseDouble(numInString);
     }catch(NumberFormatException e){
         return false;
     }
    
     //整数部、小数部の桁数は指定通りか?

    //정수부, 소수부의 자리수는 지정 대로인가?
     if(numInString.charAt(0) == '-'){
         numInString = numInString.substring(1);
     }
     String[] splited = numInString.split("\\.");
     if(splited[0].length() > leftSize){ //整数部
         return false;
     }
     // 小数部がなければ終了

    //소수부가 없으면 종료
     if(splited.length <= 1){
         return true;
     }
     if(splited[1].length() > rightSize){ //小数部
         return false;
     }
    
     return true;
 }

 /**
  * 半角数字チェック

  *반각 숫자 체크
  * @param strInString
  * @return 半角数字でなければfalseを返す
  */
    public static boolean chkNum(String strInString) throws Exception{
    
        if(!chkNull(strInString)){
         return true;
     }
        strInString = strInString.trim();
        //文字列の長さ分繰り返し
        int intChk;
        intChk = 0;
        for (int i = 0; i < strInString.length(); i++) {
            char c = strInString.charAt(i);

            if ((c < '0' && c != '.') || (c > '9' && c != '.') ) {
                return false;
            }
        }
       
       
        if (intChk == 0) {
            return true;
        } else {
            return false;
        }
    }
   
    /**
     * <PRE>
     * 半角数字(小数を含む)チェック

    *반각 숫자(소수를 포함한다) 체크
     * 空白文字を許容しない
     * @param decStr:半角数字(小数を含む)
     * @return 半角数字(小数を含む):true 半角数字以外:false
     * @throws Exception
     * </PRE>
     */
    public static boolean chkDecimal(String decStr) throws Exception{
 
        if(!chkNull(decStr)){
         return false;
     }
        for (int i = 0; i < decStr.length(); i++) {
            char c = decStr.charAt(i);

            if ((c < '0' && c != '.') || (c > '9' && c != '.') ) {
                return false;
            }
        }
       
        return true;

    }

 /**
  * <PRE>
  * 半角正の整数チェック

  * 반각정의 정수 체크
  * 空白文字を許容しない

  * 공백 문자를 허용 하지 않는다
  * @param intStr:半角正の整数
  * @return true:半角正の整数 false:半角正の整数
     * @throws Exception
     * </PRE>
  */
    public static boolean chkPositiveInt(String intStr) throws Exception{
    
        if(!chkNull(intStr)){
         return false;
     }
        for (int i = 0; i < intStr.length(); i++) {
            char c = intStr.charAt(i);

            if ((c < '0' ) || (c > '9') ) {
                return false;
            }
        }
       
        return true;
    }

    /**
  * 半角正の整数チェック

  *반각정의 정수 체크
  * @param strInString
  * @return 半角正の整数でなければfalseを返す
  */
    public static boolean chkPositiveInteger (String strInString) throws Exception{
    
        if(!chkNull(strInString)){
         return true;
     }
        strInString = strInString.trim();
        //文字列の長さ分繰り返し
        int intChk;
        intChk = 0;
        for (int i = 0; i < strInString.length(); i++) {
            char c = strInString.charAt(i);

            if ((c < '0' ) || (c > '9') ) {
                return false;
            }
        }
       
        if (intChk == 0) {
            return true;
        } else {
            return false;
        }
    }
   
    /**
     * 文字列からカンマ削除

     *문자열로부터 콤마 삭제
     * @param strNum
     * @return
     */
    public static String deleteComma(String strNum) throws Exception{

        //トークン格納用  토큰 격납용
        String strNextToken = Constant.EMPTY_STR;

        //戻り値格納用(編集後数値)  반환값 격납용(편집 후 수치)
        String strNewNum = Constant.EMPTY_STR;

        StringTokenizer tokenizer = new StringTokenizer(strNum, Constant.COMMA);

        //トークンが存在する間ループし変数にトークンを格納

       //토큰이 존재하는 동안 루프 해 변수에 토큰을 격납
        while (tokenizer.hasMoreTokens()) {
            strNextToken = tokenizer.nextToken();
            strNewNum += strNextToken;
        }

        return strNewNum;

    }

    /**
     * カンマをつける

     *콤마를 붙인다
     * @param strNum
     * @return
     */
    public static String numFormat(String strNum) throws Exception{

        //戻り値格納用(編集後数値)  반환값 격납용(편집 후 수치)
        String strNewNum = Constant.EMPTY_STR;

        //マイナスフラグ(-(マイナス)記号存在有無)

       //마이너스 플래그(-(마이너스) 기호 존재 유무)
        boolean blnMinus = false;

        // 文字列がnullだったら修了  문자열이 null라면 수료
        if (strNum == null || strNum.length() == 0) {
            strNewNum = null;
        } else {
            strNum = strNum.trim();
           
            if (strNum.substring(0, 1).equals(Constant.MINUS)) {
                strNum = strNum.substring(1, strNum.length());
                blnMinus = true;
            }

            //4桁目、7桁目、10桁目にカンマを挿入する

           //4자리수째, 7자리수째, 10 자리수째에 콤마를 삽입한다
            // int型なので10桁までを考えればよい

           //int형이므로 10 자리수까지를 생각하면 좋다
            for (int i = 0; i < strNum.length(); i++) {
                // ほかでは使用しないため例外的にマジックナンバー可

               //외에서는 사용하지 않기 때문에 예외적으로 magic number-가능
                if (((strNum.length() - i) == 4)
                        || ((strNum.length() - i) == 7)
                        || ((strNum.length() - i) == 10)) {
                    strNewNum += strNum.substring(i, i + 1) + Constant.COMMA;
                } else {
                    strNewNum += strNum.substring(i, i + 1);
                }
            }
        }

        //マイナス判定 마이너스 판정
        if (blnMinus == true) {
            return Constant.MINUS + strNewNum;
        } else {
            return strNewNum;
        }
    }
   
    /**
     * 文字列のバイト数チェック
     *
     * 指定したサイズより長ければfalse

     *지정한 사이즈보다 길면 false
     * @param str
     * @param byteSize バイト数
     * @return
     */
    public static boolean chkLength(String str, int byteSize) throws Exception{
       
        // 文字列がnullもしくは空文字の場合は正常終了

       //문자열이 null 혹은 공문자의 경우는 정상 종료
        if(str == null || Constant.EMPTY_STR.equals(str)){
            return true;
        }
       
        // 文字列のバイト数取得  문자열의 아르바이트수취득
        int len = str.getBytes("Windows-31J").length;
       
        // 文字列がサイズより長いかチェック  문자열이 사이즈보다 긴가 체크
        if(len > byteSize){
            return false;
        }
        return true;
    }
   
    /**
     * From,Toの相関チュック
     * From,To의 상관 체크
     * FromよりToのほうが大きな数値であればfalse

     *From보다 To 쪽이 큰 수치이면 false

     * @param from
     * @param to
     * @return
     */
    public static boolean chkFromTo(String from, String to) throws Exception{
       
        // 数値チェック  수치 체크
        if(!chkNum(from) || !chkNum(to)){
            // どちらかが数値でない  어느 쪽인지가 수치가 아니다
            return false;
        }
       
        // FROMとTOを数値に変換  FROM와 TO를 수치에 변환
        int nFrom = Integer.parseInt(from);
        int nTo = Integer.parseInt(to);
       
        // FromよりToが大きいのはfalse
        if(nFrom < nTo){
            return false;
        }
       
        return true;
    }

    /**
     * 半角カナチェック
     * 반각 가나 체크
     * 文字列に半角カナが含まれていればfalse

     *문자열에 반각 가나가 포함되어 있으면 false
     * @param str
     * @return
     */
    public static boolean chkHanKana(String str) throws Exception{
       
        if (str == null || str.length() == 0)
            return true;

        StringBuffer wkStr = new StringBuffer(str); // 変換バッファ
        for (int i = 0; i < wkStr.length(); i++) {

            // 半角カナ範囲(Unicode 0xFF61 ~ 0xFF9F)確認
            if (wkStr.charAt(i) >= 0xFF61 && wkStr.charAt(i) <= 0xFF9F) {
                return false;
            }
        }
        return true;
    }

   
    /**
     * コードテーブルからキーで該当するコードのリストを取得する

     *코드 테이블에서 키로 해당하는 코드의 리스트를 취득한다
     * @param key
     * @return
     * @throws Exception
     */
    public static List getCdBeans(String key) throws Exception {
        return _utilLogic.getCdBeans(key, false);
    }
   
    /**
     * コードテーブルからキーで該当するコードのリストを取得し、

     *코드 테이블에서 키로 해당하는 코드의 리스트를 취득해
     * その中から必要なコードのものだけのリストを取得する
     * 그 중에서 필요한 코드의 것만의 리스트를 취득한다
     * @param key
     * @param selectList
     * @return List
     * @throws Exception
     */
    public static List getCdBeansSelection(String key, List selectList) throws Exception {
       
        List resList = new ArrayList();
       
        // キーでコードのリスト取得   키로 코드의 리스트 취득
        List cdList = getCdBeans(key);
       
        for(int cdCnt = 0; cdCnt < cdList.size(); cdCnt++){
           
            CdBean bean = (CdBean)cdList.get(cdCnt);
           
            // リストの1番目(空白)は無条件に追加

           //리스트의 1번째 (공백)는 무조건 추가
            if(cdCnt == 0){
                resList.add(bean);
            }

            for(int selectCnt = 0; selectCnt < selectList.size(); selectCnt++){
               
                String selectCd = (String)selectList.get(selectCnt);
               
               
               
                // 選択したコードとテーブルから取得したコードが等しければリストに追加

               //선택한 코드와 테이블에서 취득한 코드가 동일하면 리스트에 추가
                if(bean.getValue().equals(selectCd)){
                   
                    resList.add(bean);
                }
               
            }
        }
       
        return resList;
    }
   
    /**
     * コードテーブルからキーで該当するコードのリストを取得する(not null 項目用)

     *코드 테이블에서 키로 해당하는 코드의 리스트를 취득한다(not null 항목용)
     * @param key
     * @return
     * @throws Exception
     */
    public static List getCdBeansNotNull(String key) throws Exception {
        return _utilLogic.getCdBeans(key, true);
    }
   
    /**
     * コードテーブルからキーで該当するコードのリストを取得し、

     *코드 테이블에서 키로 해당하는 코드의 리스트를 취득해,
     * その中から必要なコードのものだけのリストを取得する(not null 項目用)

     *그 중에서 필요한 코드의 것만의 리스트를 취득한다(not null 항목용)
     *
     * @param key
     * @param selectList
     * @return List
     * @throws Exception
     */
    public static List getCdBeansSelectionNotNull(String key, List selectList) throws Exception {
       
        List resList = new ArrayList();
       
        // キーでコードのリスト取得
        List cdList = getCdBeansNotNull(key);
       
        for(int cdCnt = 0; cdCnt < cdList.size(); cdCnt++){
           
            CdBean bean = (CdBean)cdList.get(cdCnt);

            for(int selectCnt = 0; selectCnt < selectList.size(); selectCnt++){
               
                String selectCd = (String)selectList.get(selectCnt);

                // 選択したコードとテーブルから取得したコードが等しければリストに追加

               //선택한 코드와 테이블에서 취득한 코드가 동일하면 리스트에 추가
                if(bean.getValue().equals(selectCd)){
                   
                    resList.add(bean);
                }
               
            }
        }
       
        return resList;
    }
   
    /**
     * 名称テーブルからキーで該当する名称のリストを取得する

     *명칭 테이블에서 키로 해당하는 명칭의 리스트를 취득한다
     * @param key
     * @return
     * @throws Exception
     */
    public static List getMeishoBeans(String key) throws Exception {
        return _utilLogic.getMeishoBeans(key, false);
    }
   
    /**
     * 名称テーブルからキーで該当する名称のリストを取得し、

     *명칭 테이블에서 키로 해당하는 명칭의 리스트를 취득해
     * その中から必要な名称のものだけのリストを取得する
     * 그 중에서 필요한 명칭의 것만의 리스트를 취득한다
     * @param key
     * @param selectList
     * @return List
     * @throws Exception
     */
    public static List getMeishoBeansSelection(String key, List selectList) throws Exception {
       
        List resList = new ArrayList();
       
        // キーで名称のリスト取得  키로 명칭의 리스트 취득
        List meiList = getMeishoBeans(key);
       
        for(int meiCnt = 0; meiCnt < meiList.size(); meiCnt++){
           
            CdBean bean = (CdBean)meiList.get(meiCnt);
           
            // リストの1番目(空白)は無条件に追加

           // 리스트의 1번째 (공백)는 무조건 추가
            if(meiCnt == 0){
                resList.add(bean);
            }

            for(int selectCnt = 0; selectCnt < selectList.size(); selectCnt++){
               
                String selectCd = (String)selectList.get(selectCnt);

                // 選択した名称とテーブルから取得した名称が等しければリストに追加

               //선택한 명칭과 테이블에서 취득한 명칭이 동일하면 리스트에 추가
                if(bean.getValue().equals(selectCd)){
                   
                    resList.add(bean);
                }
               
            }
        }
       
        return resList;
    }
   
    /**
     * 名称テーブルからキーで該当する名称のリストを取得する(not null 項目用)

     *명칭 테이블에서 키로 해당하는 명칭의 리스트를 취득한다(not null 항목용)
     * @param key
     * @return
     * @throws Exception
     */
    public static List getMeishoBeansNotNull(String key) throws Exception {
        return _utilLogic.getMeishoBeans(key, true);
    }
   
    /**
     * 名称テーブルからキーで該当する名称のリストを取得し、

     *명칭 테이블에서 키로 해당하는 명칭의 리스트를 취득해,
     * その中から必要な名称のものだけのリストを取得する(not null 項目用)
     * 그 중에서 필요한 명칭의 것만의 리스트를 취득한다(not null 항목용)
     * @param key
     * @param selectList
     * @return List
     * @throws Exception
     */
    public static List getMeishoBeansSelectionNotNull(String key, List selectList) throws Exception {
       
        List resList = new ArrayList();
       
        // キーで名称のリスト取得
        List meiList = getMeishoBeansNotNull(key);
       
        for(int meiCnt = 0; meiCnt < meiList.size(); meiCnt++){
           
            CdBean bean = (CdBean)meiList.get(meiCnt);
           

            for(int selectCnt = 0; selectCnt < selectList.size(); selectCnt++){
               
                String selectCd = (String)selectList.get(selectCnt);

                // 選択した名称とテーブルから取得した名称が等しければリストに追加

               //선택한 명칭과 테이블에서 취득한 명칭이 동일하면 리스트에 추가
                if(bean.getValue().equals(selectCd)){
                   
                    resList.add(bean);
                }
               
            }
        }
       
        return resList;
    }
   
    /**
     * SYSINFOテーブルから1レコード取得する

     *SYSINFO 테이블에서 1 레코드 취득한다
     * @return
     * @throws Exception
     */
    public static Sysinfo getSysinfo() throws Exception {
        return _utilLogic.getSysinfo();
    }

    /**
     * @param logic _utilLogic を設定。
     */
    public static void set_utilLogic(UtilLogic logic) {
        _utilLogic = logic;
    }
   


 /**
  * YYMMDDの文字列を受け取りCalendarを返す
  * YYMMDD의 문자열을 받아 Calendar를 돌려준다
  * @param myDate
  * @return
  * @throws Exception
  */
 private static Calendar getCalendar(String myDate) throws Exception{
    
        int intYear;
        int intMonth;
        int intDay;

        if (myDate.length() > 3) {
            intYear = java.lang.Integer.parseInt(myDate.substring(0, 4));
        } else {
            intYear = 0;
        }
        if (myDate.length() > 5) {
            intMonth = java.lang.Integer.parseInt(myDate.substring(4, 6));
        } else {
            intMonth = 0;
        }
        if (myDate.length() == 8) {
            intDay = java.lang.Integer.parseInt(myDate.substring(6, 8));
        } else {
            intDay = 0;
        }

        Calendar cal = new GregorianCalendar();
        cal.setLenient(false);
        cal.set(intYear, intMonth - 1, intDay);
       
        return cal;
 }
 
 
 /**
  * 日付妥当性チェック  일자 타당성 체크
  * @param myDate
  * @return
  */
 public static boolean chkDateFormat(String myDate) throws Exception{

     if(myDate == null || Constant.EMPTY_STR.equals(myDate)){
         return true;
     }
    
     // 文字列にスラッシュが入っていた場合消す

    // 문자열에 slash가 들어가 있었을 경우 지운다
     myDate = deleteSlash(myDate);
    
        //入力文字列が8桁以外の場合エラ-

       // 입력 문자열이 8자리수 이외의 경우 에러
     
        if (myDate.length() != 8) {
            return false;
        }

        for (int i = 0; i < myDate.length(); i++) {
            char charData = myDate.charAt(i);
            if ((charData < '0') || (charData > '9')) {
                return false;
            }
        }
 
        Calendar cal = new GregorianCalendar();
       
        cal = getCalendar(myDate);

        try {
            java.util.Date ud = cal.getTime();
        } catch (IllegalArgumentException iae) {
            return false;
        }

        return true;

    }
 
 /**
  * 日付の大小チェック
  * @param from
  * @param to
  * @return toがfromより大きければtrue そうでなければfalse
  * @throws Exception
  */
 public static boolean chkDateFromTo(String from, String to) throws Exception{
    
     // 文字列にスラッシュが入っていた場合消す

    //문자열에 slash가 들어가 있었을 경우 지운다
     from = deleteSlash(from);
     to = deleteSlash(to);
    
     // 日付のフォーマットが正しくなければ終了

    //일자의 포맷이 올바르지 않으면 종료
     if(!chkDateFormat(from) || !chkDateFormat(to)){
         return true;
     }
    
     // どちらかがnull なら終了
     if(from == null || Constant.EMPTY_STR.equals(from.trim())
             || to == null || Constant.EMPTY_STR.equals(to.trim())){
         return true;
     }
    
        Calendar calFrom = new GregorianCalendar();
        Calendar calTo = new GregorianCalendar();
       
        calFrom = getCalendar(from);
        calTo = getCalendar(to);
    
        // 比較
        return !calFrom.after(calTo);
 }
 
    /**
     * スラッシュをつける

     *slash를 붙인다
     * @param strNum
     * @return
     */
    public static String dateFormat(String strYmd) throws Exception{

        //戻り値格納用  반환값 격납용
        String strNewYmd = Constant.EMPTY_STR;

        // 文字列がnullだったら修了
        if (strYmd == null || strYmd.length() == 0) {
            strNewYmd = null;
        // 日付のフォーマットでなければnullを返して終了

       //일자의 포맷이 아니면 null를 돌려주어 종료
        } else if(!chkDateFormat(strYmd)){
            strNewYmd = null;
        } else {

            //3桁目、6桁目にスラッシュを挿入する
            strNewYmd =  strYmd.substring(0, 4) + Constant.SLASH + strYmd.substring(4, 6) +
                        Constant.SLASH + strYmd.substring(6, 8);

        }
        return strNewYmd;

    }

    /**
     * 文字列からスラッシュ削除  문자열로부터 slash 삭제
     * @param strNum
     * @return
     */
    public static String deleteSlash(String strDate) throws Exception{

        if(strDate == null){
            return null;
        }
       
        //トークン格納用  토큰 격납용
        String strNextToken = Constant.EMPTY_STR;

        //戻り値格納用  반환값 격납용
        String strNewNum = Constant.EMPTY_STR;

        StringTokenizer tokenizer = new StringTokenizer(strDate, Constant.SLASH);

        //トークンが存在する間ループし変数にトークンを格納

       //토큰이 존재하는 동안 루프 해 변수에 토큰을 격납
        while (tokenizer.hasMoreTokens()) {
            strNextToken = tokenizer.nextToken();
            strNewNum += strNextToken;
        }

        return strNewNum;

    }
   
    /**
     * 消費税を計算する

    *소비세를 계산한다
     * @param num
     * @return
     * @throws Exception
     */
    public static String taxCalc(String num) throws Exception{
       
        double tax;  // 消費税  소비세
        double amount; // 税込価格 세금 포함 가격
       
        if(num == null || Constant.EMPTY_STR.equals(num)){
            return null;
        }
       
        num = deleteComma(num);
       
        // 文字列が半角数字であるかチェック

       //문자렬이 반각 숫자일까 체크
        if(!chkNum(num)){
            return null;
        }

        // 消費税取得  소비세 취득
        Sysinfo sysinfo = _utilLogic.getSysinfo();
        tax = sysinfo.getTaxRate().doubleValue() / 100;
       
        amount = Integer.parseInt(num) * tax + Integer.parseInt(num);
       
        int i = (int)amount;
        return String.valueOf(i);
      
    }
   
   
   
    /**
     * 消費税計算をして表示用文言にフォーマットする

     *소비세 계산을 해 표시용 문언에 포맷 한다
     * @param num
     * @return
     * @throws Exception
     */
    public static String setTax(BigDecimal num) throws Exception{
     // 消費税計算  소비세 계산
        String taxStr = null;
       
        // 消費税計算とカンマづけを行う。소비세 계산과 콤마 지어를 실시한다.
        taxStr = Common.numFormat(Common.taxCalc(bigDecimalToStr(num)));
       
     // 結果nullでなければヘッダフッタを付加

    //결과 null가 아니면 헤더 footer를 부가
        if(taxStr != null){
            taxStr = Constant.TAX_HEADER + taxStr + Constant.TAX_FOOTER;
        }

     return taxStr;
       
    }

    /**
     * 消費税計算をして表示用文言にフォーマットする(引数String用)

     *소비세 계산을 해 표시용 문언에 포맷 한다(인수 String용)
     * @param num
     * @return
     * @throws Exception
     */
    public static String setTaxStr(String num) throws Exception{
     // 消費税計算
        String taxStr = null;
       
        // 消費税計算とカンマづけを行う。소비세 계산과 콤마 지어를 실시한다.
        taxStr = Common.numFormat(Common.taxCalc(num));
       
     // 結果nullでなければヘッダフッタを付加

     //결과 null가 아니면 헤더 footer를 부가
        if(chkNull(taxStr)){
            taxStr = Constant.TAX_HEADER + taxStr + Constant.TAX_FOOTER;
        } else {
            taxStr = Constant.EMPTY_STR;
        }

     return taxStr;
       
    }
   
    /**
     * BigDecimalをStringに変換する  (으)로 변환한다
     * @param num
     * @return
     */
    public static String bigDecimalToStr(BigDecimal num) throws Exception{
     
     if(num == null){
      return null;
     } else {
      return num.toString();
     }     
    }
   
 /**
  * 文字列型をBigdecimalに変換する 문자열형을 Bigdecimal로 변환한다
  * @param str
  * @return BigDecimal
  */
 public static BigDecimal strToBigDec(String str) throws Exception{
 
  if(str == null || Constant.EMPTY_STR.equals(str.trim()) ||
          !Common.chkNum(str)){
   return null;
  } else {
   
   return new BigDecimal(str);
  }
 
 }
 
 /**
  * StringをBigDecimal型に変換する
  * String를 BigDecimal형으로 변환한다
  * null, "", 数値以外の場合は0を返す
  * null, "", 수치 이외의 경우는 0을 돌려준다
  * @param str
  * @return
  * @throws Exception
  */
 public static BigDecimal strToBigDecNotNull(String str) throws Exception{
  if(str == null || Constant.EMPTY_STR.equals(str.trim()) ||
          !Common.chkNum(str)){
   return new BigDecimal(0);
  } else {
   
   return new BigDecimal(str);
  }
    
 }
 
 /**
  * 空文字だったらnullを返す  공문자라면 null를 돌려준다
  * @param String
  * @return String
  */
 public static String getEmptyOrStr(String str) throws Exception{
 
  if(str == null || Constant.EMPTY_STR.equals(str)){
   return null;
  } else{
   return str;
  }
 }
 
 /**
  * 空文字だったらnullを返す  공문자라면 null를 돌려준다
  * @param bigdecimal
  * @return String
  */
 public static BigDecimal getEmptyOrNumber(BigDecimal num) throws Exception{
 
  if(num == null || Constant.EMPTY_STR.equals(num)){
   return null;
  } else{
   return num;
  }
 }
 
 /**
  * 改行コードを<BR>に変換する

  *개행 코드를<BR>로 변환한다
  * @param str
  * @return
  */
 public static String replaceLF(String str){
    
     if(str == null || str.trim().equals(Constant.EMPTY_STR)){
         return null;
     }
    
     return str.replaceAll("\n", "<BR>");
 }
 
 /**
  * コード名を取得する
  * @param cdKey
  * @param cd
  * @return
  * @throws Exception
  */
 public static String getCdNm(String cdKey, String cd) throws Exception{
    
     CdTbl cdTbl = _utilLogic.getCdTbl(cdKey, cd);
    
     if(cdTbl == null){
         return null;
     } else {
         return cdTbl.getCdNm();
     }
 }
 
 /**
  * 名称名を取得する  명칭명을 취득한다
  * @param nmKbn
  * @param nmCd
  * @return
  * @throws Exception
  */
 public static String getMeishoNm(String nmKbn, String nmCd) throws Exception{
    
     Meisho meisho = _utilLogic.getMeisho(nmKbn, nmCd);
    
     if(meisho == null){
         return null;
     } else {
         return meisho.getName();
     }
 }
 
 /**
  * 全角チェック  전각 체크
  * 全角以外が入っていたらfalse 全部全角ならtrue

  *전각 이외가 들어가 있으면 false 전부 전각이라면 true
  * @param inStr
  * @return
  */
    public static boolean chkZenkaku(String inStr){
       
        if (inStr == null || inStr.length() == 0) {
            return true;
        }

        byte[] bytData;
        String strChar;
        boolean flgSingle = false;
        int intX;
        for (int i = 0; i < inStr.length(); i++) {
            try {
                strChar = inStr.substring(i, i + 1);
                bytData = strChar.getBytes("Windows-31J");
                for (int j = 0; j < bytData.length; j++) {
                    if (bytData[j] < 0) {
                        intX = 256 + bytData[j];

                    } else {
                        intX = bytData[j];
                    }
                }
                if (bytData.length == 2) {

                } else {
                    flgSingle = true;
                }
            } catch (Exception e) {
                flgSingle = false;
            }
        }

        if (flgSingle)
            return false;
        else
            return true;
    }

   
    /**
     * 検索上限チェック
     * 검색 상한 체크
     * システム限界数以上に設定していたらfalseを返す

     *시스템 한계수이상으로 설정해 있으면 false를 돌려준다
     * @param maxSize
     * @return true:システム上限内, null, 半角整数以外
     *    false:システム上限オーバー
     * @throws Exception
     */
    public static boolean chkMaxSearchNum(String maxSize) throws Exception{
      
       int maxNum;
       int sysMaxNum;
      
       if(!chkNull(maxSize)){
          
           return true;
       }
      
       // 半角数値チェック  반각 수치 체크
       if(!chkPositiveInteger(maxSize)){
          
           return true;
       }
      
       // システム的な最大件数  시스템적인 최대 건수
       sysMaxNum = Constant.SYS_MAS_SEARCH_NUMBER;
       // 入力された最大件数  입력된 최대 건수
       maxNum = Integer.parseInt(maxSize);
       // システム限界数より大きければfalse

      //시스템 한계수보다 크면 false
       if(maxNum > sysMaxNum){
           return false;
       }
       return true;
      
   }

    /**
     * 和暦チェック
     * 일본이 달력 체크
     * @param nengo 1:明治,2:大正,3:昭和,4:平成

     *1:메이지,2:타이쇼,3:쇼와,4:헤세이
     * @param date
     * @return
     * @throws Exception
     */
    public static boolean chkWaDate(String nengo, String date) throws Exception{
       
        boolean result = true;
       
        String nen;  // 年
        String tsuki;   // 月
        String niti;    // 日
        int intNen;
        int intTsuki;
        int intNiti;
        String seireki;  // 西暦
       
       
        // 桁数チェック(6バイトYYMMDD) 자리수 체크(6바이트 YYMMDD)
        if(date.length() != 6){
           
            return false;
        }
        // 数値チェック  수치 체크
        if(!chkPositiveInteger(date)){
           
            return false;
        }
        // 年、月、日を取得
        nen = date.substring(0, 2);
        tsuki = date.substring(2, 4);
        niti = date.substring(4, 6);
       
        // それぞれをintに変換 각각을 int에 변환
        intNen = Integer.parseInt(nen);
        intTsuki = Integer.parseInt(tsuki);
        intNiti = Integer.parseInt(niti);

        // 日付フォーマット通りの場合は各年号ごとに年月日をチェック

       //일자 포맷 그대로의 경우는 매년호 마다 연월일을 체크
        // 明治  메이지
        if(Constant.NENGO_MEIJI.equals(nengo)){
           
            // 45年を超える場合はありえない

           //45년을 넘는 경우는 있을 수 없다
            if(intNen > 45){
               
                return false;

            // 45年の場合は7月30日まで
            } else if(intNen == 45){
               
                if(intTsuki > 7){
                   
                    return false;
                } else if(intTsuki == 7){
                   
                    if(intNiti > 30){
                       
                        return false;
                    }
                   
                }
            // 1年の場合は9月8日から
            } else if(intNen == 1){
               
                if(intTsuki < 9){
                   
                    return false;
                } else if(intTsuki == 9){
                   
                    if(intNiti < 8){
                       
                        return false;
                    }
                }
            }
           
            // 西暦に変換
            seireki = String.valueOf(intNen + WAREKI_SA_MEIJI);
            seireki = seireki + tsuki + niti;
           
            if(!chkDateFormat(seireki)){
               
                return false;
            }
           
           
        // 大正
        } else if(Constant.NENGO_TAISHO.equals(nengo)){
           
            // 15年を超える場合はありえない
            if(intNen > 15){
               
                return false;
            // 15年の場合は12月25日まで
            } else if(intNen == 15){
               
                if(intTsuki > 12){
                   
                    return false;
                } else if(intTsuki == 12){
                   
                    if(intNiti > 25){
                        return false;
                    }
                }
            }
            // 1年の場合は7月30日から
            else if(intNen == 1){
               
                if(intTsuki < 7){
                    return false;
                } else if(intTsuki == 7){
                   
                    if(intNiti < 30){
                       
                        return false;
                    }
                }
            }
           
            // 西暦に変換
            seireki = String.valueOf(intNen + WAREKI_SA_TAISHO);
            seireki = seireki + tsuki + niti;
           
            if(!chkDateFormat(seireki)){
               
                return false;
            }
           
        // 昭和
        } else if(Constant.NENGO_SHOWA.equals(nengo)){
        
            // 64年の1月7日まで
            if(intNen > 67){
               
                return false;
            } else if(intNen == 64){
               
                if(intTsuki > 1){
                    return false;
                } else if(intTsuki == 1){
                   
                    if(intNiti > 7){
                        return false;
                    }
                }
            }
            // 1年は12月25日から
            if(intNen == 1){
               
                if(intTsuki < 12){
                   
                    return false;
                } else if(intTsuki == 12){
                   
                    if(intNiti < 25){
                        return false;
                    }
                }
            }
           
            // 西暦に変換
            seireki = String.valueOf(intNen + WAREKI_SA_SHOWA);
            seireki = seireki + tsuki + niti;
           
            if(!chkDateFormat(seireki)){
               
                return false;
            }
       
        // 平成
        } else if(Constant.NENGO_HEISEI.equals(nengo)){
           
            // 1年は1月8日から
            if(intNen == 1){
               
                if(intTsuki == 1){
                   
                    if(intNiti < 8){
                        return false;
                    }
                }
            }
           
            // 西暦に変換
            seireki = String.valueOf(intNen + WAREKI_SA_HEISEI);
            seireki = seireki + tsuki + niti;
           
            if(!chkDateFormat(seireki)){
               
                return false;
            }
        // それ以外の年号
        } else {
            return false;
        }
       
        // 現在日付よりも未来であればエラー
        if(!chkComparisonDate(seireki)){
            return false;
        }
       
       
        return result;
    }
   

   
    /**
     * 現在日付との比較
     * 현재 일자라는 비교
     * 現在日付よりも未来の日付であればfalseを返す

     *현재 일자보다 미래의 일자이면 false를 돌려준다
     * @param date
     * @return
     * @throws Exception
     */
    public static boolean chkComparisonDate(String date) throws Exception{
       
        String sysDateStr;
       
        // 日付妥当性チェック  일자 타당성 체크
        if(!chkDateFormat(date)){
           
            return false;
        }
       
        // 現在年月日取得
        Date sysDate = DateUtil.getSysdate();
     
        // SimpleDateFormatオブジェクトを生成

       //SimpleDateFormat 오브젝트를 생성
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
        sysDateStr = formatter.format(sysDate);
       
        // 日付の相関チェック呼び出し  일자의 상관 체크 호출
        if(!chkDateFromTo(date, sysDateStr)){
            return false;
        }
       
        return true;
    }

 /**
  * 日付妥当性チェック(YYYYMMの場合)

   *일자 타당성 체크(YYYYMM의 경우)
  * @param myDate
  * @return
  */
 public static boolean chkDateFormatYYYYMM(String myDate) throws Exception{

     String nen;
     String tuki;
     int intNen;
     int intTuki;
    
    
     if(myDate == null || Constant.EMPTY_STR.equals(myDate)){
         return true;
     }
    
     // 文字列にスラッシュが入っていた場合消す

     //문자열에 slash가 들어가 있었을 경우 지운다
     myDate = deleteSlash(myDate);
    
        //入力文字列が6桁以外の場合エラ-

       //입력 문자열이 6자리수 이외의 경우 에러
        if (myDate.length() != 6) {
            return false;
        }

        // 数字のみで構成されているかチェック

       //숫자만으로 구성되어 있을까 체크
        for (int i = 0; i < myDate.length(); i++) {
            char charData = myDate.charAt(i);
            if ((charData < '0') || (charData > '9')) {
                return false;
            }
        }
 
        // 年、月部分を取り出し  해, 달부분을 꺼내
        nen = myDate.substring(0,4);
        tuki = myDate.substring(4, 6);
       
        // 月部分をintに変換し、1から12の間であるかチェック

        //달부분을 int로 변환해, 1에서 12의 사이일까 체크
        intTuki = Integer.parseInt(tuki);
        if(intTuki < 1 || intTuki > 12){
           
            return false;
        }

        return true;

    }
 
 /**
  * 日付の大小チェック(YYYYMMの場合) 일자의 대소 체크(YYYYMM의 경우)
  * @param from
  * @param to
  * @return toがfromより大きければtrue そうでなければfalse 同じ場合はtrue
  * @throws Exception
  */
 public static boolean chkDateFromToYYYYMM(String from, String to) throws Exception{
    
     int intFrom;
     int intTo;
    
     // 文字列にスラッシュが入っていた場合消す

    //문자열에 slash가 들어가 있었을 경우 지운다
     from = deleteSlash(from);
     to = deleteSlash(to);
    
     // 日付のフォーマットが正しくなければ終了

    //일자의 포맷이 올바르지 않으면 종료
     if(!chkDateFormatYYYYMM(from) || !chkDateFormatYYYYMM(to)){
         return true;
     }
    
     // どちらかがnull なら終了
     if(!chkNull(from) || !chkNull(to)){
         return true;
     }
    
    
        // 年、月部分を取り出し  해, 달부분을 꺼내
     intFrom = Integer.parseInt(from);
     intTo = Integer.parseInt(to);
       
     // toよりfromのほうが先であればfalse

    //to보다 from 쪽이 앞이면 false
     if(intFrom > intTo){
         return false;
     }
       
     return true;
 }
 
    /**
     * スラッシュをつけるYYYYMM  slash를 붙이는 YYYYMM
     * @param strNum
     * @return
     */
    public static String dateFormatYYYYMM(String strYmd) throws Exception{

        //戻り値格納用  반환값 격납용
        String strNewYmd = Constant.EMPTY_STR;

        // 文字列がnullだったら終了
        if (strYmd == null || strYmd.length() == 0) {
            strNewYmd = null;
        // 日付のフォーマットでなければnullを返して終了

       //일자의 포맷이 아니면 null를 돌려주어 종료
        } else if(!chkDateFormatYYYYMM(strYmd)){
            strNewYmd = null;
        } else {

            //3桁目、6桁目にスラッシュを挿入する
            strNewYmd =  strYmd.substring(0, 4) + Constant.SLASH + strYmd.substring(4, 6);
//            //3桁目、6桁目にスラッシュを挿入する
//            strNewYmd =  strYmd.substring(0, 4) + Constant.SLASH + strYmd.substring(4, 6) +
//                        Constant.SLASH + strYmd.substring(6, 8);

        }
        return strNewYmd;

    }
   
   
    /**
     * application.propertiesのメッセージをキーにより取得する

     *application.properties의 메세지를 키에 의해 취득한다
     * @param key メッセージのキー
     * @return String メッセージ
     * @throws Exception
     */
    public static String getMessage(String key) throws Exception {
       
        ResourceBundle bundle = ResourceBundle.getBundle(Constant.MESSAGE_FILE_NAME);
        return bundle.getString(key);
    }
   
    /**
     * 文字列From,Toを比較する  문자열 From,To를 비교한다
     *
     * 辞書順で比較し、FromがToより大きければfalse

     *사전순서로 비교해, From가 To보다 크면 false
     * 同じ、もしくはFrom < To ならばtrue
     * @param from
     * @param to
     * @return
     * @throws Exception
     */
 public static boolean chkCdFromTo(String from, String to) throws Exception{
    
     // どちらかがnullだったらtrueで強制終了

    //어느 쪽인지가 null라면 true로 강제 종료
     if(!Common.chkNull(from) || !Common.chkNull(to)){
         return true;
     }
    
     // from > toだったらfalse
     if(0 < from.trim().compareTo(to.trim())) {
         return false;
     }
     return true;
    
 }
 
 
 
 /**
  * 整数チェック  정수 체크
  * @param iStr
  * @return true:正の整数,負の整数 false:整数以外

  *정의 정수, 부의 정수 false:정수 이외
  * @throws Exception
  */
 public static boolean chkInt(String iStr) throws Exception{
 
  if(!Common.chkNull(iStr)){
         return false;
     }

  if(iStr.indexOf(Constant.MINUS) != 0) return Common.chkPositiveInt(iStr.substring(0));
 
  return Common.chkPositiveInt(iStr.substring(1));
 
 
 }

일본어로 프로젝트를 진행하시는 분들은 참고하세여.
일본어가 들어 있는 스트링이 전각으로 되어 있는지 반각으로 되어 있는지 확인합니다.

참고) 아래의 메소드는 static으로 되어 있습니다.
      필요에 따라 바꿔서 사용하세여.
      이원영님께서 만드신 JDF에도 반영시켜도 좋을 듯 싶군여~ ㅋㅋ

(소스)----------------------------------------------------------------------------
    /**
     * 대상문자열(strTarget)이 전각문자로 구성되어 있는지 확인한다.
     *
     * @param strTarget 전각여부를 확인할 문자열
     * @return 전각문자만으로 구성된 문자열일 경우 true반환. 아니면 false
     */
    public static boolean isFullWord(String strTarget)
{ byte[] byteArray = null; byteArray = strTarget.getBytes();
for(int i = 0; i < byteArray.length; i++)
{ if((byteArray[i] >= (byte)0x81 && byteArray[i] <= (byte)0x9f) || (byteArray[i] >= (byte)0xe0 && byteArray[i] <= (byte)0xef))
{ if((byteArray[i+1] >= (byte)0x40 && byteArray[i+1] <= (byte)0x7e) || (byteArray[i+1] >= (byte)0x80 && byteArray[i+1] <= (byte)0xfc))
{ i++; }
else
{ return false; } }
else
{ return false; } }
return true; } /** * 대상문자열(strTarget)이 반각문자로 구성되어 있는지 확인한다. * * @param strTarget 반각여부를 확인할 문자열 * @return 반각문자만으로 구성된 문자열일 경우 true반환. 아니면 false */ public static boolean isHalfWord(String strTarget)
{ byte[] byteArray = null; byteArray = strTarget.getBytes();
for(int i = 0; i < byteArray.length; i++)
{ if((byteArray[i] >= (byte)0x81 && byteArray[i] <= (byte)0x9f) || (byteArray[i] >= (byte)0xe0 && byteArray[i] <= (byte)0xef))
{ if((byteArray[i+1] >= (byte)0x40 && byteArray[i+1] <= (byte)0x7e) || (byteArray[i+1] >= (byte)0x80 && byteArray[i+1] <= (byte)0xfc))
{ return false; } } }
return true; } 소프트웨어 기술의 강국! 우리나라 만세~ ^^
 
출처: http://www.javaservice.net/~java/bbs/read.cgi?m=resource&b=javatip&c=r_p&n=1016839954&k=전각&d=tb#1016839954

'프로그래밍 > Library' 카테고리의 다른 글

[펌] 자바로 엑셀 때려잡기!!  (0) 2007.11.28
[펌] 각종 제어  (0) 2007.11.28
[펌] 반각문자를 전각문자로  (0) 2007.11.28
[펌] 전각/반각 체크  (0) 2007.11.28
PDF 파일 만들기 - fop 0.93  (0) 2007.11.28