POI HSLF
Java API To Access Microsoft Powerpoint Format Files
1. POI API Document
http://jakarta.apache.org/poi/apidocs/index.html
2. POI Download
http://www.apache.org/dyn/closer.cgi/jakarta/poi/
3. 간단한 텍스트 읽기
4. 테스트버젼
PPT 2000
POI HSLF
Java API To Access Microsoft Powerpoint Format Files
1. POI API Document
http://jakarta.apache.org/poi/apidocs/index.html
2. POI Download
http://www.apache.org/dyn/closer.cgi/jakarta/poi/
3. 간단한 텍스트 읽기
4. 테스트버젼
PPT 2000
POI HWPF
Java API to Handle Microsoft Word File
1. POI API Document
http://jakarta.apache.org/poi/apidocs/index.html
2. POI Download
http://www.apache.org/dyn/closer.cgi/jakarta/poi/
3. 간단한 텍스트 읽기
4. MS Word 테스트 버젼
MS워드 2000, MS워드 2003
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
from http://www.javaservice.net/~java/bbs/read.cgi?m=resource&b=qna2&c=r_p&n=1131692449&p=1&s=t
제목 : POI로 엑셀파일 읽을때, Invalid header signature 에러 글쓴이: 손님(guest) 2005/11/11 11:37:30 조회수:20 줄수:44 |
poi를 이용하여 클라이언트의 엑셀문서를 서버에 업로드후 읽어내는 작업을 하려합니다. 작업의 목적은 화면상에 입력필드가 너무 많아서(대략 240여개 정도 됩니다), 일일이 입력하기에 불편함이 초래되어,엑셀로 다운받은 다음에 해당 입력값들을 엑셀에서 입력후, 입력한 값을 다시 화면상에 뿌려주려는 것입니다. 업로드 완료후 엑셀파일을 읽을때, Error occurred : Invalid header signature; read 5789751444030890300, expected -2226271756974174256 java.io.IOException: Invalid header signature; read 5789751444030890300, expected -2226271756974174256 at org.apache.poi.poifs.storage.HeaderBlockReader.<init>(HeaderBlockReader.java:88) at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:83)....... 위와 같은 에러가 발생합니다.해당 라인을 쫓아가보면, POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(filePath + fileName)); 이부분입니다. 읽으려 하는 엑셀은 jsp내에서, response.setContentType("application/vnd.ms-excel;charset=euc-kr"); response.setHeader("Content-Disposition", "attachment; filename="+jspName+".xls"); response.setHeader("Content-Description", "JSP Generated Data"); 을 이용해서 생성한것입니다.해당 엑셀파일을 일반 텍스트 에디터에서 열어보면, <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"> <head> <meta http-equiv=Content-Type content="text/html; charset=ks_c_5601-1987"> <meta name=ProgId content=Excel.Sheet> (이하 생략) meta 태그내의 'content="text/html;' 부분이 의심이 갑니다만. 엑셀을 생성하는 jsp내의 meta 태그부분을 삭제해도,생성된 엑셀을 보면 해당부분이 들어가있는데요. 다시 처음으로 와서,content='text/html' 부분때문에 Invalid header signature...의 오류가 발생하는것인지요? jsp에서 생성된 엑셀이 아닌 일반 엑셀문서로 테스트 해봤을때는 이상없이 제대로 실행됩니다. 제가 의심한 부분이 맞는것이라면, 해결책은 어떤것이 있을런지 조언 부탁드립니다. |
제목 : Re: 실제 엑셀파일이 아니라서 그런거 같습니다. 글쓴이: 손님(guest) 2005/11/11 16:00:49 조회수:7 줄수:16 |
Invalid Header라는 에러메시지의 의미가 파일 헤더가 엑셀타입이 아니라서 그런거 같습니다. POI가 해석하는 엑셀파일은 MS OLE Compound로 생성된 파일포맷일 경우에만 해당됩니다..html의 header를 excel이라 조작해서 생성된 엑셀파일은 실제론 텍스트파일일뿐 OLE 타입이 아니라서요. 서버에서 생성시 jsp로 생성하지 말고 poi를 이용해서 서버측에 실제 엑셀파일을 생성한 후 클라이언트로 스트리밍을 통해 다운로드 해주는 방식을 택해야할 것같네요. |
제목 : Re: 답변 고맙습니다. 글쓴이: 손님(guest) 2005/11/11 16:31:58 조회수:2 줄수:5 |
그렇군요. 실제로 jsp내에서 생성되는 엑셀을 다른이름으로 저장해서 'Micrisoft Excel 통합문서' 형식으로 저장하니, 정상적으로 실행이 되는군요. 충고해주신데로, poi를 이용해서 엑셀을 생성하는 쪽으로 다시 해봐야겠습니다. 답변 고맙습니다.좋은 주말 되세요. |
Jakarta POI
X. 이미지
POI 3.0 부터 드디어 이미지를 지원하는군요.
아직 알파버젼이구요 http://www.apache.org/dyn/closer.cgi/jakarta/poi/ 에서 최신버젼을 다운 받을 수 있습니다
최신링크
http://mirror.apache.or.kr/jakarta/poi/dev/bin/poi-bin-3.0-alpha1-20050704.zip
아래 소스는 OKJSP의 "이루"님이 작성한 소스입니다
from http://www.okjsp.pe.kr/bbs?act=VIEW&seq=60543&bbs=bbs4&keyfield=content&keyword=&pg=0
Jakarta POI
IX. Cell을 좀더 유연하게!
1. Date타입 셀 만들기
① 소스
② 결과
③ HSSFDateFormat이 지원하는 날짜 포맷
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm")); 에서 다음과 같이 포맷을 정할 수 있다 (현재시간은 2005년 3월 14일 0시 52분 17초.. 헛 화이트데이 --;)
2. Cell의 Align속성
① 소스
② 결과
3. Cell의 Border 속성
① 소스
② 결과
③ HSSFCellStyle
HSSFCellStyle에는 다음과 같은 static 멤버변수가 존재합니다
ALIGN_CENTER | center horizontal alignment |
ALIGN_CENTER_SELECTION | center-selection? horizontal alignment |
ALIGN_FILL | fill? horizontal alignment |
ALIGN_GENERAL | general (normal) horizontal alignment |
ALIGN_JUSTIFY | justified horizontal alignment |
ALIGN_LEFT | left-justified horizontal alignment |
ALIGN_RIGHT | right-justified horizontal alignment |
ALT_BARS | Wide dots |
BIG_SPOTS | Large spots |
BORDER_DASH_DOT | dash-dot border |
BORDER_DASH_DOT_DOT | dash-dot-dot border |
BORDER_DASHED | dash border |
BORDER_DOTTED | hair-line border |
BORDER_DOUBLE | double-line border |
BORDER_HAIR | dot border |
BORDER_MEDIUM | Medium border |
BORDER_MEDIUM_DASH_DOT | medium dash-dot border |
BORDER_MEDIUM_DASH_DOT_DOT | medium dash-dot-dot border |
BORDER_MEDIUM_DASHED | Medium dashed border |
BORDER_NONE | No border |
BORDER_SLANTED_DASH_DOT | slanted dash-dot border |
BORDER_THICK | Thick border |
BORDER_THIN | Thin border |
BRICKS | Brick-like layout |
DIAMONDS | Diamonds |
FINE_DOTS | Small fine dots |
NO_FILL | No background |
SOLID_FOREGROUND | Solidly filled |
SPARSE_DOTS | Sparse dots |
SQUARES | Squares |
THICK_BACKWARD_DIAG | Thick backward facing diagonals |
THICK_FORWARD_DIAG | Thick forward facing diagonals |
THICK_HORZ_BANDS | Thick horizontal bands |
THICK_VERT_BANDS | Thick vertical bands |
THIN_BACKWARD_DIAG | Thin backward diagonal |
THIN_FORWARD_DIAG | Thin forward diagonal |
THIN_HORZ_BANDS | Thin horizontal bands |
THIN_VERT_BANDS | Thin vertical bands |
VERTICAL_BOTTOM | bottom-aligned vertical alignment |
VERTICAL_CENTER | center-aligned vertical alignment |
VERTICAL_JUSTIFY | vertically justified vertical alignment |
VERTICAL_TOP | top-aligned vertical alignment |
4. Cell의 색갈 채우기
① 소스② 결과
③ HSSFColor 정리!
5. Cell 병합
① 소스
② 결과
③ Region
특정셀을 합칠 때는 HSSFSheet의 addMergedRegion(Region region)와
합칠 셀의 영역을 나타내는 Region을 사용한다.
Region region = new (int 시작ROW, short 시작COL, int 종료ROW, short 종료COL);
6. Cell에 폰트 설정하기
① 소스
② 결과
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
Jakarta POI
VII. 엑셀 쓰기예제
쓰기도 역시 읽기와 비슷합니다.
① 엑셀 워크북을 생성합니다. 행과 셀을 생성하려면 당연한 절차겠죠?
HSSFWorkbook workbook = new HSSFWorkbook();
② 시트를 생성합니다.
시트명을 파라미터로 바로 생성 합니다.
HSSFSheet sheet = workbook.createSheet("sheet name");
만약 한글로 시트명을 만들려면 다음과 같이 인코딩이 필요합니다.
HSSFSheet sheet = workbook.createSheet();
workbook.setSheetName( 0 , "한글" , HSSFWorkbook.ENCODING_UTF_16 );
③ 셀에 사용할 스타일을 미리 생성해 둡니다.
HSSFCellStyle style = wb.createCellStyle();
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBottomBorderColor(HSSFColor.BLACK.index);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setLeftBorderColor(HSSFColor.GREEN.index);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setRightBorderColor(HSSFColor.BLUE.index);
style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM_DASHED);
style.setTopBorderColor(HSSFColor.BLACK.index);
등 여러가지 스타일을 만들 수 있습니다.
스타일은 다음 주소를 참고하세요
http://jakarta.apache.org/poi/apidocs/org/apache/poi/hssf/usermodel/HSSFCellStyle.html
④ 로우를 하나 생성합니다.
HSSFRow row = sheet.createRow(0);
⑤ 셀츨 하나 생성하여 스타일을 주고 값을 입력합니다.
HSSFCell cell = row.createCell((short)0);
cell.setCellStyle(style);
cell.setCellValue("jakarta project!");
만약 한글을 입력한다면 인코딩 해야 하며 값 세팅전에 해야 합니다.
cell.setEncoding(HSSFCell.ENCODING_UTF_16); //한글 처리
cell.setCellStyle(style);
cell.setCellValue("자카드타 프로젝트!");
⑥ 모든 셀이 다 입력되었으면 파일을 만듭니다.
FileOutputStream fs = new FileOutputStream("excelfile.xls");
workbook.write(fs);
fs.close();
VIII. 쓰기샘플 소스
<%@ page language="java" contentType="text/html;charset=euc-kr" %>
<% try { String[] cell_value = {"자카르타","프로젝트","www.jakartaproject.com"}; HSSFWorkbook workbook = new HSSFWorkbook();
HSSFCellStyle style = workbook.createCellStyle(); HSSFRow row = sheet.createRow(0); </body> |
자 결과화면 입니다.
성공!
위의 소스를 기본으로 한다면 그리 어렵지 않을겁니다 ^^
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
Jakarta POI
I. POI 란?
일반적으로 POI가 엑셀파일을 쓰는 컴퍼넌트로 알려져 있으나 POI는 프로젝트 이름입니다.
즉 POI는 Microsoft Format File을 액세스 할 수 있는 API를 제공합니다. (한마디로 자바에서 MS파일을 읽고 쓸수있도록 지원합니다.)
POI안에는 여러 컴퍼넌트들이 있습니다.
① POIFS
Microsoft의 OLE2 포맷 형식의 문서를 자바로 읽고 쓸수 있는 컴퍼넌트입니다
기본적으로 POI의 모든 컴퍼넌트들이 POIFS를 사용합니다.
② HSSF
Microsoft의 엑셀파일을 읽고 쓸수 있도록 지원하는 컴퍼넌트입니다.
③ HWPF
Microsoft의 워드파일을 읽고 쓸수 있도록 지원하는 컴퍼넌트입니다.
이 컴퍼넌트는 디자인 초기단계입니다.
④ HPSF
Microsoft의 OLE2 포맷 형식의 문서 속성을 어플리케이션에서 사용 할수 있도록 지원하는 컴퍼넌트입니다.
현재 읽기 기능만 제공합니다
워드파일을 핸들링 하는 HWPF는 초기단계라 사용을 못하지만 기대는 되는군요 ^^
ps. 영어사전을 찾아보니 poi는 하와이의 토란 요리를 뜻하더군요.
우리나라말로 하니 자카르타 토란 프로젝트 쯤 될라나? ㅎㅎ
II. 다운로드 및 설치
다운로드 받으러 갑시다~!
http://jakarta.apache.org/site/downloads/downloads_poi.cgi
현재 2.5.1버젼입니다.
다운받은 파일을 압축을 풀면 *.jar 파일들이 있을겁니다 이 파일들을 자신의 어플리케이션 /lib/에 복사합시다
POI API http://jakarta.apache.org/poi/apidocs/index.html
Quick Guide http://jakarta.apache.org/poi/hssf/quick-guide.html
III. Formula(수식) 지원에 관해..
엑셀을 읽고 쓸때 수식을 지원합니다.
org.apache.poi.hssf.usermodel.HSSFCell의 setCellFormula("formulaString") 메쏘드는 스프레드시트에 수식을 추가하는데 사용되며 getCellFormula() 메쏘드는 수식을 대표하는 문자열을 해석하는데 사용됩니다. 하지만 엑셀에서 사용하는 수식을 모두 사용 할 수는 없습니다.
① 지원되는 부분
-. 셀 참조, 시트참조, 지역참조
-. 상대적 혹은 절대적 참조
-. 수연산 및 논리연산
-. 시트 혹은 매크로 함수
-. 수식 결과값 반환
② 부분적 지원
문자열을 포함하는 수식을 해석할 수는 있지만 문자열값을 반환하는 수식은 아직 지원하지 않습니다.
③ 지원되지 않는 부분
-. 배열 수식
-. 1진법 수식
-. 3D 참조
-. 에러 값 (cells containing #REF's or #VALUE's)
IV. 기본객체
가장 기본이되는 객체가 다음 4가지 입니다
이름에서 무엇을 뜻하는지 대강 짐작 할 수 있겠죵?
① HSSFWorkbook - 엑셀 워크북을 말합니다.
② HSSFSheet - 엑셀 쉬트를 나타냅니다.
③ HSSFRow - 엑셀에서 특정 행입니다.
④ HSSFCell - 엑셀에서 특정 행에대한 특정 셀입니다
위 4가지 객체는 앞으로 계속 나올겁니다. 눈여겨 미리 봐 둡시다. @.@
V. 엑셀 읽기 예제
① POSFS을 이용하여 엑셀 워크북을 생성합니다.
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("excelfile.xls"));
HSSFWorkbook workbook = new HSSFWorkbook(fs);
② 생성된 워크북을 이용하여 시트 수만큼 돌면서 엑셀 시트 하나씩을 생성합니다.
int sheetNum = workbook.getNumberOfSheets();
for (int k = 0; k < sheetNum; k++) {
System.out.println("Sheet Number : "+k);
System.out.println(Sheet Name : " + workbook.getSheetName(k));
HSSFSheet sheet = workbook.getSheetAt(k);
}
③ 생성된 시트를 이용하여 그 행의 수만큼 돌면서 행을 하나씩 생성합니다.
int rows = sheet.getPhysicalNumberOfRows();
for (int r = 0; r < rows; r++) {
HSSFRow row = sheet.getRow(r);
System.out.println("Row : "+row.getRowNum());
}
④ 역시나 생성된 행을 이용하여 그 셀의 수만큼 돌면서 셀을 하나씩 생성합니다.
int cells = row.getPhysicalNumberOfCells();
for (short c = 0; c < cells; c++) { <--!! short 형입니다. 255개가 max!int celltype = cell.getCellType();
...
}
셀을 생성하여 셀 타입에 따라 처리를 해주면 끝~
⑤ 주의사항
만약 엑셀에서 A열에 아무런 값이 없으면 그 행은 읽지 못합니다.
행을 읽지 못하니 셀또한 처리 할 수 없습니다
VI. 엑셀읽기 샘플소스
샘플 데이터
A열은 B열에 대한 셀 타입을 나타내며 C열은 D열에대한 셀 타입을 나타냅니다.
즉 B:1 의 123456의 셀 타입은 A:1 일반 이라는 것이며 마찬가지로
D:1의 2005-02-09의 셀타입은 C:1 사용자정의로 세팅하였다는 겁니다
이 엑셀의 데이터를 다음 소스로 읽어 보겠습니다.
<%@ page <html> <% String excelfile = "C:\\Tomcat 5.0\\webapps\\ROOT\\example.xls"; try { //워크북을 생성! HSSFWorkbook workbook = new HSSFWorkbook(fs); int sheetNum = workbook.getNumberOfSheets(); for (int k = 0; k < sheetNum; k++) { //시트 이름과 시트번호를 추출 <br><br> for (int r = 0; r < rows; r++) { // 시트에 대한 행을 하나씩 추출 for (short c = 0; c < cells; c++) { // 행에대한 셀을 하나씩 추출하여 셀 타입에 따라 처리 switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_FORMULA : %>
|
위 소스의 결과입니다.
Sheet Number 0 |
결과를 보니 사용자가 지정한 셀 타입에 관계없이
숫자관련 셀은 POI에서 모두 숫자 타입으로 인식해 버렸습니다.
날짜 역시 지정한 셀 타입에 관계없이 모두 숫자 타입으로 인식해 버리는군요!
그럼 어떻게 날짜를 제대로 표현할까요?
날짜 타입을 제대로 나타내기 위해서는 날짜 Cell에는 getDateCellValue()를 사용하면
정상적으로 처리 할 수 있습니다.
SimpleDateformat sdf = new SimpleDateformat("yyyy-MM-dd hh:mm");
String date = sdf.format(cell.getDateCellValue());
등을 이용하면 나타내고자 하는 알짜를 표현 하기 더 쉽겠지요
나머지 수식을 가져 올때도 마찬가지입니다. 이런 사항을 도표로 나타내보았습니다.
org.apache.poi.hssf.usermodel.HSSFCell 에는 모두 6가지의 Cell Type이 있는데,
cell.getCellType()을 하면 그 셀의 반환값을 알 수 있으며 그에 상응하는 static 필드타입은 다음과 같습니다.
셀타입 | 필드타입 |
함수 |
함수반환값 |
0 | CELL_TYPE_NUMERIC |
getNumericCellValue() -> 숫자 타입일때 getDateCellValue() -> 날짜 타입일때 |
double Date |
1 | CELL_TYPE_STRING |
getStringCellValue() |
String |
2 | CELL_TYPE_FORMULA |
getCellFormula() -> 수식자체를 가져올때 getNumericCellValue() -> 수식 반환값이 숫자일때 getStringCellValue() -> 수식 반환값이 문자일때 |
String double String |
3 | CELL_TYPE_BLANK |
|
|
4 | CELL_TYPE_BOOLEAN |
getBooleanCellValue() |
boolean |
5 | CELL_TYPE_ERROR |
getErrorCellvalue() |
byte |
이번시간에는 POI 프로젝트를 이용하여 엑셀 파일을 읽어보았습니다.
다음 시간에는 엑셀파일에 쓰는 핸드링을 해 보도록 하지요~
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================