반응형
처음에 웹 시스템에서 데이터를 다운로드 할 때는 CSV 형식이 일반적이지만 Excel 형식으로 출력해야겠다는 요청도 많습니다.이는 금줄이나 글꼴 변경 등 보기 좋은 장표를 작성할 수 있고 Excel이 표계산 어플리케이션으로서 최종사용자에게 널리 받아들여지고 있기 때문인 것으로 보입니다.이에 본 글에서는 Java에서 Excel 파일을 출력하여 다운로드 받는 방법을 소개하겠습니다.샘플에서는 청구서번호를 입력하면 Excel에서 작성된 청구서를 다운로드할 수 있는 기능을 구현하고 있습니다.대상독자 자바 프로그래밍을 한 적이 있거나 혹은 자바 프로그래밍에 관심있는 분들을 대상으로 합니다.필요한 환경 이 샘플은 J2SE(TM) Development Kit 5.0 Update 2, Tomcat 5.5.7 에서 동작 확인을 하고 있습니다.또, Web 프레임 워크의 Struts 1.2를 사용하고 있습니다만, 샘플 소스에 내포하고 있기 때문에 J2SDK와 서블릿 컨테이너 이외의 환경은 필요 없습니다.Excel 설치 또한 필요하지 않습니다.환경에 대한 자세한 내용 및 설정방법은 ′서버사이드 기술 학습지 - WINGS′에 있는 ′서버사이드 환경구축 설정′을 참조하십시오.샘플 어플리케이션의 개요 샘플 어플리케이션의 흐름은 다음과 같습니다.브라우저에서 다운로드 버튼이 눌러진다.
요청을 받은 서블릿 컨테이너에서 템플릿으로 준비한 Excel 파일을 가져온다.
청구서 고유의 정보를 Excel 파일에 쓴다.
브라우저에 Excel 파일을 출력(다운로드)한다.제목이나 금줄 등 공통 레이아웃은 위 그림과 같은 템플릿으로 미리 작성해 두고, 고객명칭이나 금액과 같은 청구서별로 다른 값은 프로그램에서 설정하도록 합니다.레이아웃을 동적으로 설정할 수도 있지만 프로그램이 복잡해지기 때문에 템플릿을 작성해 둘 것을 권장합니다.덧붙여 샘플을 실제로 동작시켜 보고 싶은 경우에는, 기사 상부의 링크에서, 파일 「PoiExcel.war」를 다운로드해 Tomcat 등의 애플리케이션 서버의 「webapps」폴더에 배치(디플로이)해 주세요.애플리케이션 서버 기동 후에, 「http://local host:8080/PoiExcel」에 액세스하면 샘플을 동작시킬 수 있습니다(호스트명·포트 번호는 독자의 환경에 맞추어 변경해 주세요).또, 이번 샘플의 주요 파일은 이하와 같습니다.POI란 Java 에서 Excel파일의 판독이나 갱신을 실시하기 위해서는 「POI」라고 불리는 라이브러리를 사용합니다.POI는 Excel이나 Word와 같은 Microsoft OLE2 문서를 조작하는 API를 제공하고 있으며, Jakarta 프로젝트로 개발이 진행되고 있습니다.입수하려면 Jakarta 사이트에서 다운로드 할 수 있습니다.덧붙여 이번 샘플을 컴파일 하기 위해서는 「poi-2.5.1-final-20040804.jar」에 클래스 패스를 통과시켜 둘 필요가 있습니다.Excel 파일 다운로드 처리 그러면 소스 코드를 보면서 어플리케이션의 흐름을 보겠습니다.브라우저에서 Excel 출력 버튼을 누르면 Struts의 Action 클래스의 execute 메서드가 실행됩니다.「 InvoiceAction . java 」 抜粋
public class InvoiceAction extends Action {
public ActionForward execute ( ActionMapping mapping ,
ActionForm form , HttpServletRequest request ,
HttpServletResponse response ) throws Exception {
//청구서No를 바탕으로 청구서 상세정보를 취득하여
//「invoice Data」로 설정합니다.
InvoiceForm iForm = ( InvoiceForm ) form ;
InvoiceService iService = new InvoiceService ( ) ;
HeaderData invoiceData
= iService . getInvoiceByInvoiceNo ( iForm . getInvoiceNo ( )) ;
//(이하 생략)
}
}}여기서는 Struts의 ActionForm에서 요청 정보(청구서 번호)를 꺼내어 비즈니스 로직에 해당하는 Invoice Service 클래스로부터 청구서의 상세 데이터를 취득하고 있습니다.이 처리를 통해 invoice Data 객체에 장부출력용 데이터가 설정됩니다.이어서 다음 소스에서는 Excel 파일을 읽어들이고 갱신하고 있습니다.「 InvoiceAction . java 」 抜粋
public class InvoiceAction extends Action {
public ActionForward execute ( ActionMapping mapping ,
ActionForm form , HttpServletRequest request ,
HttpServletResponse response ) throws Exception {
//(중략)
//템플릿이 되는 Excel 파일의 경로를 가져옵니다.
final String INVOICE _ FILE
= ′ / WEB - INF / classes / to / msn / wings / invoice . xls ′ ;
String filePath = this . getServlet ( )
. getServletContext ( ) . getRealPath ( INVOICE _ FILE ) ;
//파일을 불러옵니다.
POIFSFileSystem filein
= new POIFSFileSystem ( new FileInputStream ( filePath )) ;
//워크북을 가져옵니다.
HSSFWorkbook wb = new HSSFWorkbook ( filein ) ;
//시트를 불러옵니다.
HSSFSheet sheet = wb . getSheet ( ′ invoice ′ ) ;
// 행번호용 상수(세로)
final int ROW _ INVOICE _ NO = 4 ;
final int ROW _ CUSTOMER _ NAME = 6 ;
final int ROW _ DETAIL _ START = 12 ;
// 열번호용 상수(가로)
final short COL _ HEADER = 5 ;
final short COL _ DETAIL _ GOODS _ NAME = 3 ;
final short COL _ DETAIL _ PRICE = 7 ;
final short COL _ DETAIL _ COUNT = 8 ;
final short COL _ DETAIL _ MEMO = 10 ;
// 청구서번호를 설정합니다.
HSSFRow row = sheet . getRow ( ROW _ INVOICE _ NO ) ;
HSSFCell cell = row . getCell ( COL _ HEADER ) ;
cell . setEncoding ( HSSFCell . ENCODING _ UTF _ 16 ) ;
cell . setCellValue ( invoiceData . getInvoiceNo ( )) ;
//고객명을 설정합니다.
row = sheet . getRow ( ROW _ CUSTOMER _ NAME ) ;
cell = row . getCell ( COL _ HEADER ) ;
cell . setEncoding ( HSSFCell . ENCODING _ UTF _ 16 ) ;
cell . setCellValue ( invoiceData . getCustomerName ( )) ;
//내역행을 설정합니다.반복자 it = invoiceData.getDetailList(). 반복자();
introwCount = 0;
(it. has Next() {
= sheet.getRow(ROW_DETAIL_START + 행 개수);
DetailData dd = (DetailData) it.next;
//商品名の設定
cell = row.getCell(COL_DETAIL_GOODS_NAME);
cell.setEncoding(HSSFCell).인코딩_UTF_16);
cell.setCellValue(dd.getGoodsName());
//cell.setCellStyle(스타일 B);
//価格の設定
셀 = row.getCell(COL_DETITAIL_PRICE);
cell.setCellValue(dd.getPrice());
//数の設定
cell = row.getCell(COL_DETAIL_COUNT);
cell.setCellValue(dd.getCount());
//摘要の設定
cell = row.getCell(COL_DETAIL_MEMO);
cell.setEncoding(HSSFCell).인코딩_UTF_16);
cell.setCellValue(dd.getMemo());
//次の明細行へ
행 개수++;
}
//(以下省略)
}
}ここでは、excelファイルを読み込み、請求書固有の値(顧客名や明細データ等)を設定しています。poiではまずワークブックにアクセスし、それから、ワークシート→行→列→セルという順番にたどっていくことで目的のセルにアクセスすることができます。excelファイルの読み込みと更新を行うための主要なクラexcelファイルを読み込む時に使用するクラスです。今回のサンプルでは特定の環境に依存しないように、パスを固定で埋め込まずservletcontextのgetrealpathメソッドを使用して相対的にパスを読み込むようにしています。hの行(hssfcellオブジェクト)を取得することができます。getcellメソッドの引数はshort型で、0をベースとしているためa列を取得したい場合は「0」を引数とします。hssfcellはセルを扱うクラスです。setcellvalueメソッドでセルの値に引数の文字列や数値を設定することができます。なお、文字列に日本語が含まれる場合には、事前にsetencoding(hssfcell.encoding_utf_16)を呼び出しておく必要があります。ここでは、作成したexcelファイルをブラウザに送ります。「invoiceaction.java」 抜粋
공용 클래스 InvoiceAction이 작업 {을(를) 확장합니다.
공개 작업 전달 실행(작업 매핑 매핑,
작업 양식 양식, HttpServletRequest 요청,
HttpServletResponse)가 예외 {을(를) 발생시킵니다.
//(中略)
//クライアントへのレスポンスを設定
반응.헤더를 설정합니다(′내용-처분′,
′syspartment;syspot=syspot.xls′;
반응.ContentType 설정(′application/vnd.ms-excel′);
wb.write(response.getOutputStream());
//(中略)
반환 null;
}
}hssfworkbookクラスのwriteメソッドを呼び出してexcelファイルを出力しています。ここではhttpservletresponse#getoutputstreamメソッドによってservletoutputstreamを出力先に指定しています。また、ダウンロtypeメソッドにて設定しています。この一連の流れにて、excelファイルのダウンロード処理が完成となります。tipsここまでは、javaからexcelを出力する方法を紹介しましたが、ここからはpoiを用いてプログラムをする上で便利なテクニックについて紹介します。excelのプログラムでは列番号と行番号を数字で指定してセルを特定しますが、その数字をそのまま書いてしまうのは避けたほうが良いでしょ
//行番号用の定数(縦)
최종 입력 ROW_INVOICE_NO = 4;
최종 introw_CUSTOMER_NAME = 6;
ROW_DETAIL_START = 12;
//列番号用の定数(横)
최종 단락 COL_HEADER = 5;
최종 단락 COL_DETAIL_GOODS_NAME = 3;
최종 단락 COL_DETAIL_PRISE = 7;
최종 단락 COL_DETAIL_COUNT = 8;
final short col_detail_memo = 10; なお、今回のサンプルでは「col~」や「row~」で始まる定数名にて統一しています。これはeclipseのような統合開発環境を使っている場合、自動的に定数の候補が表示されるといiv」というアルファベットで表示されていますが、javaのプログラムからは数字で指定する必要があります。そのためpoiのプログラムをするときには、excelのメニューの[ツール]-[オプション]で表示されるダイアログの[全般]-[r1c1参照形式を使用する]にチェックを入れておくと良いでしょう。この設定を行うiv」という表示が「1~256」という表示に変更されるため、アルファベットを数字に変換する手間が不要になります。複雑な帳票を作成するときには、この設定に変更しておくと便利でしょう。まとめこの記事では、jpoiを使用してexcelを出力させる方法を解説しました。excel出力のポイントを簡単にまとめると次のようになります。ファイルの読込···poifsfilesystemクラス
ワークブックの読込···hssfworkbookクラス
···HSSF 워크북#getsheetメソッド
···HSSF시트#getRow의 경우
···HSSFrow#getCell의 경우
セルのエンコードを設定···HSSFCell#setEncoding 지정
セルに文字列を設定···hssfcell#setcellvalueメソッドexcelに対するプログラムはサンプルと似たようなパターンがほとんどなので、この基本的な流れを押さえておくと良いでしょう。참고자료 Jakarta POI
POI 문서 번역
요청을 받은 서블릿 컨테이너에서 템플릿으로 준비한 Excel 파일을 가져온다.
청구서 고유의 정보를 Excel 파일에 쓴다.
브라우저에 Excel 파일을 출력(다운로드)한다.제목이나 금줄 등 공통 레이아웃은 위 그림과 같은 템플릿으로 미리 작성해 두고, 고객명칭이나 금액과 같은 청구서별로 다른 값은 프로그램에서 설정하도록 합니다.레이아웃을 동적으로 설정할 수도 있지만 프로그램이 복잡해지기 때문에 템플릿을 작성해 둘 것을 권장합니다.덧붙여 샘플을 실제로 동작시켜 보고 싶은 경우에는, 기사 상부의 링크에서, 파일 「PoiExcel.war」를 다운로드해 Tomcat 등의 애플리케이션 서버의 「webapps」폴더에 배치(디플로이)해 주세요.애플리케이션 서버 기동 후에, 「http://local host:8080/PoiExcel」에 액세스하면 샘플을 동작시킬 수 있습니다(호스트명·포트 번호는 독자의 환경에 맞추어 변경해 주세요).또, 이번 샘플의 주요 파일은 이하와 같습니다.POI란 Java 에서 Excel파일의 판독이나 갱신을 실시하기 위해서는 「POI」라고 불리는 라이브러리를 사용합니다.POI는 Excel이나 Word와 같은 Microsoft OLE2 문서를 조작하는 API를 제공하고 있으며, Jakarta 프로젝트로 개발이 진행되고 있습니다.입수하려면 Jakarta 사이트에서 다운로드 할 수 있습니다.덧붙여 이번 샘플을 컴파일 하기 위해서는 「poi-2.5.1-final-20040804.jar」에 클래스 패스를 통과시켜 둘 필요가 있습니다.Excel 파일 다운로드 처리 그러면 소스 코드를 보면서 어플리케이션의 흐름을 보겠습니다.브라우저에서 Excel 출력 버튼을 누르면 Struts의 Action 클래스의 execute 메서드가 실행됩니다.「 InvoiceAction . java 」 抜粋
public class InvoiceAction extends Action {
public ActionForward execute ( ActionMapping mapping ,
ActionForm form , HttpServletRequest request ,
HttpServletResponse response ) throws Exception {
//청구서No를 바탕으로 청구서 상세정보를 취득하여
//「invoice Data」로 설정합니다.
InvoiceForm iForm = ( InvoiceForm ) form ;
InvoiceService iService = new InvoiceService ( ) ;
HeaderData invoiceData
= iService . getInvoiceByInvoiceNo ( iForm . getInvoiceNo ( )) ;
//(이하 생략)
}
}}여기서는 Struts의 ActionForm에서 요청 정보(청구서 번호)를 꺼내어 비즈니스 로직에 해당하는 Invoice Service 클래스로부터 청구서의 상세 데이터를 취득하고 있습니다.이 처리를 통해 invoice Data 객체에 장부출력용 데이터가 설정됩니다.이어서 다음 소스에서는 Excel 파일을 읽어들이고 갱신하고 있습니다.「 InvoiceAction . java 」 抜粋
public class InvoiceAction extends Action {
public ActionForward execute ( ActionMapping mapping ,
ActionForm form , HttpServletRequest request ,
HttpServletResponse response ) throws Exception {
//(중략)
//템플릿이 되는 Excel 파일의 경로를 가져옵니다.
final String INVOICE _ FILE
= ′ / WEB - INF / classes / to / msn / wings / invoice . xls ′ ;
String filePath = this . getServlet ( )
. getServletContext ( ) . getRealPath ( INVOICE _ FILE ) ;
//파일을 불러옵니다.
POIFSFileSystem filein
= new POIFSFileSystem ( new FileInputStream ( filePath )) ;
//워크북을 가져옵니다.
HSSFWorkbook wb = new HSSFWorkbook ( filein ) ;
//시트를 불러옵니다.
HSSFSheet sheet = wb . getSheet ( ′ invoice ′ ) ;
// 행번호용 상수(세로)
final int ROW _ INVOICE _ NO = 4 ;
final int ROW _ CUSTOMER _ NAME = 6 ;
final int ROW _ DETAIL _ START = 12 ;
// 열번호용 상수(가로)
final short COL _ HEADER = 5 ;
final short COL _ DETAIL _ GOODS _ NAME = 3 ;
final short COL _ DETAIL _ PRICE = 7 ;
final short COL _ DETAIL _ COUNT = 8 ;
final short COL _ DETAIL _ MEMO = 10 ;
// 청구서번호를 설정합니다.
HSSFRow row = sheet . getRow ( ROW _ INVOICE _ NO ) ;
HSSFCell cell = row . getCell ( COL _ HEADER ) ;
cell . setEncoding ( HSSFCell . ENCODING _ UTF _ 16 ) ;
cell . setCellValue ( invoiceData . getInvoiceNo ( )) ;
//고객명을 설정합니다.
row = sheet . getRow ( ROW _ CUSTOMER _ NAME ) ;
cell = row . getCell ( COL _ HEADER ) ;
cell . setEncoding ( HSSFCell . ENCODING _ UTF _ 16 ) ;
cell . setCellValue ( invoiceData . getCustomerName ( )) ;
//내역행을 설정합니다.반복자 it = invoiceData.getDetailList(). 반복자();
introwCount = 0;
(it. has Next() {
= sheet.getRow(ROW_DETAIL_START + 행 개수);
DetailData dd = (DetailData) it.next;
//商品名の設定
cell = row.getCell(COL_DETAIL_GOODS_NAME);
cell.setEncoding(HSSFCell).인코딩_UTF_16);
cell.setCellValue(dd.getGoodsName());
//cell.setCellStyle(스타일 B);
//価格の設定
셀 = row.getCell(COL_DETITAIL_PRICE);
cell.setCellValue(dd.getPrice());
//数の設定
cell = row.getCell(COL_DETAIL_COUNT);
cell.setCellValue(dd.getCount());
//摘要の設定
cell = row.getCell(COL_DETAIL_MEMO);
cell.setEncoding(HSSFCell).인코딩_UTF_16);
cell.setCellValue(dd.getMemo());
//次の明細行へ
행 개수++;
}
//(以下省略)
}
}ここでは、excelファイルを読み込み、請求書固有の値(顧客名や明細データ等)を設定しています。poiではまずワークブックにアクセスし、それから、ワークシート→行→列→セルという順番にたどっていくことで目的のセルにアクセスすることができます。excelファイルの読み込みと更新を行うための主要なクラexcelファイルを読み込む時に使用するクラスです。今回のサンプルでは特定の環境に依存しないように、パスを固定で埋め込まずservletcontextのgetrealpathメソッドを使用して相対的にパスを読み込むようにしています。hの行(hssfcellオブジェクト)を取得することができます。getcellメソッドの引数はshort型で、0をベースとしているためa列を取得したい場合は「0」を引数とします。hssfcellはセルを扱うクラスです。setcellvalueメソッドでセルの値に引数の文字列や数値を設定することができます。なお、文字列に日本語が含まれる場合には、事前にsetencoding(hssfcell.encoding_utf_16)を呼び出しておく必要があります。ここでは、作成したexcelファイルをブラウザに送ります。「invoiceaction.java」 抜粋
공용 클래스 InvoiceAction이 작업 {을(를) 확장합니다.
공개 작업 전달 실행(작업 매핑 매핑,
작업 양식 양식, HttpServletRequest 요청,
HttpServletResponse)가 예외 {을(를) 발생시킵니다.
//(中略)
//クライアントへのレスポンスを設定
반응.헤더를 설정합니다(′내용-처분′,
′syspartment;syspot=syspot.xls′;
반응.ContentType 설정(′application/vnd.ms-excel′);
wb.write(response.getOutputStream());
//(中略)
반환 null;
}
}hssfworkbookクラスのwriteメソッドを呼び出してexcelファイルを出力しています。ここではhttpservletresponse#getoutputstreamメソッドによってservletoutputstreamを出力先に指定しています。また、ダウンロtypeメソッドにて設定しています。この一連の流れにて、excelファイルのダウンロード処理が完成となります。tipsここまでは、javaからexcelを出力する方法を紹介しましたが、ここからはpoiを用いてプログラムをする上で便利なテクニックについて紹介します。excelのプログラムでは列番号と行番号を数字で指定してセルを特定しますが、その数字をそのまま書いてしまうのは避けたほうが良いでしょ
//行番号用の定数(縦)
최종 입력 ROW_INVOICE_NO = 4;
최종 introw_CUSTOMER_NAME = 6;
ROW_DETAIL_START = 12;
//列番号用の定数(横)
최종 단락 COL_HEADER = 5;
최종 단락 COL_DETAIL_GOODS_NAME = 3;
최종 단락 COL_DETAIL_PRISE = 7;
최종 단락 COL_DETAIL_COUNT = 8;
final short col_detail_memo = 10; なお、今回のサンプルでは「col~」や「row~」で始まる定数名にて統一しています。これはeclipseのような統合開発環境を使っている場合、自動的に定数の候補が表示されるといiv」というアルファベットで表示されていますが、javaのプログラムからは数字で指定する必要があります。そのためpoiのプログラムをするときには、excelのメニューの[ツール]-[オプション]で表示されるダイアログの[全般]-[r1c1参照形式を使用する]にチェックを入れておくと良いでしょう。この設定を行うiv」という表示が「1~256」という表示に変更されるため、アルファベットを数字に変換する手間が不要になります。複雑な帳票を作成するときには、この設定に変更しておくと便利でしょう。まとめこの記事では、jpoiを使用してexcelを出力させる方法を解説しました。excel出力のポイントを簡単にまとめると次のようになります。ファイルの読込···poifsfilesystemクラス
ワークブックの読込···hssfworkbookクラス
···HSSF 워크북#getsheetメソッド
···HSSF시트#getRow의 경우
···HSSFrow#getCell의 경우
セルのエンコードを設定···HSSFCell#setEncoding 지정
セルに文字列を設定···hssfcell#setcellvalueメソッドexcelに対するプログラムはサンプルと似たようなパターンがほとんどなので、この基本的な流れを押さえておくと良いでしょう。참고자료 Jakarta POI
POI 문서 번역
반응형