반응형

excel업로드 java에서 읽기, 엑셀 파일 db로 등록.

 

다음은 jxl 컴포넌트를 이용한 엑셀파일 업로드구현이다.

excel파일을 업로드해서 컨트롤러단에서 읽고 필요한 시트나 셀의 데이타를

일괄적으로 DB에 등록시키는데 유용함.

jxl.jar파일 첨부함.

단, 엑셀 확장자는 xls만 가능하며 xlsx확장자는 poi 컴포넌트를 이용해야 가능.

 

처음으로 구현해봤는데 처음에는 버벅거리다가 제대로 되니까 기분이 좋음

 

try{
// FileInputStream클래스의 인스턴스화 하여 파일객체를 얻어온다.java.io.FileInputStream fi = new java.io.FileInputStream(new java.io.File(파일경로));
Workbook workbook = Workbook.getWorkbook(fi);Sheet sheet = workbook.getSheet(0); // 첫번째 시트를 얻어옴
int rows = sheet.getRows();
for(int h=1 ; h < rows; h++){
Cell a = null; //첫번째 셀Cell b = null; //두번째 셀Cell c = null; //세번째 셀
String aCell = "";String bCell = "";String cCell = "";
a = sheet.getCell(0,h);aCell = a.getContents();
b = sheet.getCell(1,h);bCell = b.getContents();
c = sheet.getCell(2,h);cCell = c.getContents();
// branchInfoVO는 컬럼매핑(세터와 게터가 있는 클래스임)
branchInfoVO.setCode(aCell); branchInfoVO.setBranchName(bCell);branchInfoVO.setUseYn(cCell);
// 리스트를 조회해서 isCode 가 널이 아니면 업데이트를 실행
List isCode = branchInfoService.branchInfoisCode(branchInfoVO); 
if ((isCode != null) || (isCode.size() != 0)){log.info(h+".수정=> "+ aCell);// 이부분은 스프링프레임워크시 DB로 업데이트문을 실행시키는 메소드임 
branchInfoService.updateBranchExcel(branchInfoVO);}else{//아무작업없음
}
}
fi.close(); // 생성된 파일객체를 닫아줌 ( 닫지 않는 상태면 파일 삭제가 안됨 )}catch(Exception e){log.error(e.getMessage(), e);return "";}
반응형



Posted by 궁극의 java개발자
,





반응형

특정 문자열에서 원하는 문자가 포함되어 있는지 확인해야 될 때가 있다.
주로 문자열 포함 여부에 따라서 if문과 같은 분기문을 작성하거나 할때가 그러한데, Java에서는 여러가지 방법으로 문자열 검색이 가능하다.

그중에서도 오늘은 contains, indexOf, matches를 이용하여 문자열을 검색하는 방법을 포스팅 하겠다.

[예제]

public class StringFinder {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		
		
		String txt1 = "가나다라" ;
		String txt2 = "해당 내용은 테스트 입니다" ;
		String txt3 = "가격은 29,000원 입니다" ;
		
		
		
		// contains를 이용한 방법(true, false 반환)
		if(txt1.contains("나다"))
			System.out.println("문자열 있음!");
		else
			System.out.println("문자열 없음!");
		
		
		// indexOf를 이용한 방법
		if(txt2.indexOf("테스트") > -1)
			System.out.println("문자열 있음!");
		else
			System.out.println("문자열 없음!");
		
		
		// matches를 이용한 방법
		if(txt2.matches(".*테스트.*"))
			System.out.println("문자열 있음!");
		else
			System.out.println("문자열 없음!");
		
		
		// matches를 이용하여 정규 표현식으로 문자열에 숫자가 있는지 확인
		if(txt3.matches(".*[0-9].*"))
			System.out.println("숫자 있음!");
		else
			System.out.println("숫자 없음!");

	}

}


 

구분

설명

포함

미포함

contains

문자열에 검색하고자 하는 문자가 있는지 확인

true

false

indexOf

문자열에서 검색하는 문자의 위치를 반환

문자 위치

-1

matches

정규식을 이용하여 문자열을 검색한다.

특정 문자열을 검색할때 사용하기 보다는 한글, 숫자 등과 같이 해당 형태의 텍스트가 존재하는지 확인할때 사용하면 좋다

true

false

 



 

반응형



Posted by 궁극의 java개발자
,





반응형

다음과 같은 특정 규칙으로 정의된 문자열이 있다고 가정하자.

"홍길동,28,남자,서울 강남구"

해당 문자열을 구분자로 구분하여 나누는 방법으로는 몇가지가 있는데 오늘은 StringTokenizer 와 split을 이용해 보겠다

StringTokenizer는 특정 구분자를 기준으로 token 단위로 끊어서 읽을수 있게 해준다.
split의 경우 구분자를 기준으로 문자열을 분리하여 배열로 리턴한다.


import java.util.StringTokenizer;

public class StringTokenTest {

	public static void main(String[] args) {
		
		
		// 이름,나이,성별,지역
		String txt = "홍길동,28,남자,서울 강남구" ;
		
		
		// StringTokenizer를 이용한 문자열 분리
		StringTokenizer tokens = new StringTokenizer(txt);
		
		String sName 	= tokens.nextToken(",") ;	// 이름
		String sAge 	= tokens.nextToken(",") ;	// 나이
		String sSex 	= tokens.nextToken(",") ;	// 성별
		String sLoc 	= tokens.nextToken(",") ;	// 지역
		
		System.out.println("[StringTokenizer 이용]") ;
		System.out.println(sName) ;
		System.out.println(sAge) ;
		System.out.println(sSex) ;
		System.out.println(sLoc) ;
		
		System.out.println("") ;
		
		
		
		// split을 이용한 문자열 분리
		String[] txtArr = txt.split(",") ;
		
		System.out.println("[split 이용]") ;
		for(int i=0; i < txtArr.length; i++){
			System.out.println(txtArr[i]) ;
		}
		
		
	}
}


사용방법은 둘다 간단하지만 특히 split을 이용한 방법이 코드도 짧고 꽤 간단하다.
하지만 상황에 맞게 StringTokenizer 과 split을 구분하여 사용하는게 좋다.

StringTokenizer는 "남자,,서울 강남구" 처럼 null값이 있을경우 null을 무시해 버린다.

즉 실제 출력은 "남자, 서울 강남구"가 되버린다. 이 경우는 구분자 앞뒤로 공백을 주어 토큰을 trim 처리해서 공백을 지워버리면 되지만, split은 null 이 있을경우에도 무시하지 않으므로 차라리 해당 문자열이 적을경우 split을 이용하는게 편하다.

또다른 상황으로 나 같은 경우 StringTokenizer을 사용하는곳은 CSV형식의 파일을 읽어서 뭔가를 처리해야 할때 인데, 이때 CSV 파일의 용량이 상당히 크다.


해당 작업을 split으로 처리하면 처리속도가 굉장히 떨어져 비효율적인 문제가 발생하였다.

반응형



Posted by 궁극의 java개발자
,





반응형
필요에 의해 로그 파일과 같은 텍스트 파일을 생성할 일들이 있다.

나 같은 경우는 배치 프로그램의 실행 결과 등을 주로 남기거나, DB 데이터 등을 CSV로 생성하거나 할때 Java로 파일 생성을 한다.

Java에서 파일 생성을 하는 방법은 간단하다.

FileWriter 객체를 이용하여 파일을 생성하고 필요한 텍스트 문자들을 넣어주면 된다.

워낙 간단하니 소스만 봐도 쉽게 이해가 갈 것이다.


1. FileWriter를 이용한 파일 생성

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;


public class FileWriterTest {
	
	
	public static void main(String[] args) {
		
		String txt = "테스트입니다!!" ;
		
		String fileName = "C:\\test11.txt" ;
		
		
		try{
			
			// 파일 객체 생성
			File file = new File(fileName) ;
			
			// true 지정시 파일의 기존 내용에 이어서 작성
			FileWriter fw = new FileWriter(file, true) ;
			
			// 파일안에 문자열 쓰기
			fw.write(txt);
			fw.flush();

			// 객체 닫기
			fw.close(); 
			
			
		}catch(Exception e){
			e.printStackTrace();
		}
		

	}
}

 

2. BufferedWriter + FileWriter를 이용한 생성

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;


public class FileWriterTest {
	
	
	public static void main(String[] args) {
		
		String txt = "테스트입니다!!" ;
		
		String fileName = "C:\\test11.txt" ;
		
		
		try{
						
			// BufferedWriter 와 FileWriter를 조합하여 사용 (속도 향상)
			BufferedWriter fw = new BufferedWriter(new FileWriter(fileName, true));
			
			// 파일안에 문자열 쓰기
			fw.write(txt);
			fw.flush();

			// 객체 닫기
			fw.close(); 
			
			
		}catch(Exception e){
			e.printStackTrace();
		}
		

	}
}


위의 1, 2번 코드는 모두 동일한 형태의 파일을 생성한다. 하지만 성능에는 큰 차이가 발생한다.
기록하고자 하는 파일의 크기가 100K를 넘는다면 FileWriter를 단독으로 쓰기보다는 BufferedWriter + FileWriter

혼합하여 사용하는게 파일 기록할때 속도가 더 빠르다.

아. 물론 위 방법 말고도 Java를 통해 파일 생성하는 법이 여러가지가 있는데,

마찬가지로 최고의 성능은 BufferedWriter + FileWriter 조합이다.

어느 개발자분이 테스트한 자료가 있는데, 그 분은 50K를 넘어가는 시점부터 성능차이가 발생한다고 하였다.


특히 대용량 파일을 생성할때에는 BufferedWriter + FileWriter 를 조합하여 함께 사용하자.
참고로 나같은 경우 대용량 파일을 주기적으로 생성하는데,

이때 파일안에 작성하는 문자열도 String 보다는 StringBuilder나 StringBuffer를 사용해야 한다.


해당 이유는 조만간 포스팅 하도록 하겠다.



ps ) 사실 단순 로그를 남기는것은 log4j 라이브러리를 이용하는게 편하다.

 

반응형



Posted by 궁극의 java개발자
,