Excelとの一般的な方法を使用する方法をエクスポートするためにJavaのリフレクション・メカニズムを使用します

インポートにjava.io.IOException;

インポートにjava.io.OutputStream;

インポートをjava.lang.reflect.Field;

インポートにjava.lang.reflect.InvocationTargetException;

輸入java.lang.reflect.Methodオブジェクト。

輸入java.text.SimpleDateFormatの。

インポートのjava.util.Collection;

輸入java.util.Date;

インポートするjava.util.Iterator;

輸入java.util.regex.Matcher;

輸入java.util.regex.Patternの。



輸入javax.servlet.http.HttpSession。



輸入org.apache.poi.ss.usermodel.CellStyle。

輸入org.apache.poi.ss.usermodel.IndexedColors。

輸入org.apache.poi.xssf.usermodel.XSSFCell;

輸入org.apache.poi.xssf.usermodel.XSSFCellStyle。

輸入org.apache.poi.xssf.usermodel.XSSFClientAnchor;

輸入org.apache.poi.xssf.usermodel.XSSFDrawing。

輸入org.apache.poi.xssf.usermodel.XSSFFont;

輸入org.apache.poi.xssf.usermodel.XSSFRichTextString。

輸入org.apache.poi.xssf.usermodel.XSSFRow。

輸入org.apache.poi.xssf.usermodel.XSSFSheet。

輸入org.apache.poi.xssf.usermodel.XSSFWorkbook;



輸入com.cddgg.lianyoulw.utils.Arith。



/ **

 *エクスポートExcelの表

 *  

 * @author wangbowen

 * 

 * @Param <T>ジェネリックアプリケーション、JavaBeanのスタイルに沿って、任意のクラスの代表

 * /

パブリッククラスExportExcel <T> {

    / **

     *エクスポートエクセル

     * @Param footTitleフットタイトル

     * @Paramデータセットの制御データ

     *出力ストリームを@param

     * @Paramセッションセッション

     * /

    公共のボイドexportExcel(文字列footTitle、コレクション<T>データセット、OutputStreamのうち、HttpSessionのセッション){

        輸出(footTitle、ヌル、データセット、アウト、 "YYYY-MM-DD"、セッション)。

    }

    / **

     *エクスポートエクセル

     * @Param footTitleフットタイトル

     * @Paramヘッダヘッダ

     * @Paramデータセットの制御データ

     *出力ストリームを@param

     * @Paramセッションセッション

     * /

    公共のボイドexportExcel(文字列footTitle、String []型のヘッダー、コレクション<T>データセット、

            、HttpSessionのセッションを行ったOutputStream){

        輸出(footTitle、ヘッダ、データセット、アウト、 "YYYY-MM-DD"、セッション)。

    }

    / **

     *エクスポートエクセル

     * @Param footTitleフットタイトル

     * @Paramヘッダヘッダ

     * @Paramデータセットの制御データ

     *出力ストリームを@param

     * @Paramパターン検証

     * @Paramセッションセッション

     * /

    公共のボイドexportExcel(文字列footTitle、String []型のヘッダー、コレクション<T>データセット、

            、文字列パターンをのOutputStream、HttpSessionのセッション){

        輸出(footTitle、ヘッダ、データセット、アウト、パターン、セッション)。

    }



    / **

     *一般的な方法は、JAVAの反射を利用して、JAVAは、Excel形式でIOデバイスに指定された条件にデータシンボルおよび出力の特定のセットに配置することができます

     * 

     * @paramタイトル

     *表のタイトル

     * @paramヘッダ

     *表のプロパティのカラム名配列

     * @paramデータセット

     *データは、コレクションを表示する、コレクションは、オブジェクトのJavaBeanスタイルクラスに沿って配置する必要があります。このサポートの方法は、

     *基本データ型のデータ型JavaBeanの属性と文字列、日付、バイト[](画像データ)

     * @paramアウト

     出力デバイスに関連付けられている* Streamオブジェクトは、ローカルファイルやネットワークへの輸出書類をEXCELことができます

     * @paramパターン

     *出力形式を設定する時刻データがある場合。デフォルトでは、 "YYY-MM-DD" です

     * @Paramセッションセッション

     * /

    公共ボイド輸出(文字列のタイトル、String []型のヘッダー、

            コレクション<T>データセット、アウトのOutputStream、文字列パターン、HttpSessionのセッション){

        //ワークブックを宣言

        XSSFWorkbookブック=新しいXSSFWorkbook();

        //テーブルを作成します。

        XSSFSheetシート= book.createSheet()。

        //テーブルの設定し、デフォルトの列幅は30のバイトです

        sheet.setDefaultColumnWidth(25)。

        //トップレベルのマネージャーの描画を宣言

        XSSFDrawing族長= sheet.createDrawingPatriarch()。

        book.setSheetName(0、タイトルは); //最初のシートの名前を設定します。

        XSSFRow行= sheet.createRow((ショート)0)。

        XSSFFontフォント= book.createFont()。

        // font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD)。

        font.setFontHeightInPoints((ショート)9); //設定されたフォントサイズ

        font.setFontName( "マイクロソフトエレガントな黒");

        XSSFCellStyleスタイル= book.createCellStyle();

        style.setAlignment(XSSFCellStyle.ALIGN_CENTER); //整列

        style.setFont(フォント)。

        style.setBorderTop(XSSFCellStyle.BORDER_THIN)。

        style.setBorderBottom(XSSFCellStyle.BORDER_THIN)。

        style.setBorderLeft(XSSFCellStyle.BORDER_THIN)。

        style.setBorderRight(XSSFCellStyle.BORDER_THIN)。

        style.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex())。

        style.setFillPattern(CellStyle.SOLID_FOREGROUND)。

        XSSFCellStyleスタイル2 = book.createCellStyle()。

        style2.setAlignment(XSSFCellStyle.ALIGN_CENTER); //整列

        style2.setBorderTop(XSSFCellStyle.BORDER_THIN)。

        style2.setBorderBottom(XSSFCellStyle.BORDER_THIN)。

        style2.setBorderLeft(XSSFCellStyle.BORDER_THIN)。

        style2.setBorderRight(XSSFCellStyle.BORDER_THIN)。

        style2.setFont(フォント)。

        用(ショートi = 0; iは<headers.length; iは++){

            XSSFCellセル= row.createCell(I)。

            cell.setCellStyle(スタイル);

            XSSFRichTextStringテキスト=新しいXSSFRichTextString(ヘッダ[I])。

            cell.setCellValue(テキスト);

        }

        //ループデータ

        反復子<T>がdataset.iteratorを=();

        int型のインデックス= 0;

        一方、(it.hasNext()){

            インデックス++;

            行= sheet.createRow(インデックス)

            TがT =(T)it.next();

            //反射によって、注文JavaBeanプロパティに応じて、動的呼び出しのgetXXX()プロパティ値を取得する方法

            フィールド[]フィールド= t.getClass()getDeclaredFields()。



            以下のために(INT i = 0; iはfields.length <; iは++){

                XSSFCellセル= row.createCell(I)。

                cell.setCellStyle(スタイル2)。

                フィールドフィールド=項目[I]。

                文字列フィールド名= field.getName()。

                //フィールド名がidCard場合は入力された場合

                IF(fieldName.equals( "idCard")){

                フィールド名= fieldName.equals( "idCard") "IDCard":?フィールド名。

                }

                文字列getMethodNameに= "GET"

                        + fieldName.substring(0、1).toUpperCase()

                        + fieldName.substring(1)。

                {試します

                    クラス<?OBJECT>のTCL = t.getClass()延びています。

                    方法getMethod = tCls.getMethod(getMethodNameに、

                            新しいクラス[] {})。

                    オブジェクト値= getMethod.invoke(T、新しいオブジェクト[] {})。

                    キャストタイプの決意値の後に//

                    文字列textValue = NULL;

                    IF(ブールinstanceofの値){

                        ブールbValue =(ブール)値。

                        textValue = "男"。

                        (もし!bValue){

                            textValue = "女"。

                        }

                    }そうであれば(日instanceofの値){

                        日付日付=(日)値。

                        SDFのSimpleDateFormat =新しいてSimpleDateFormat(パターン)。

                        textValue = sdf.format(日付)。

                    }そうであれば(ダブルinstanceofの値){

                        二重値1 = Double.parseDouble(value.toString())。

                        textValue = Arith.doubleTransform(値1)。

                    }そうであれば(値のinstanceofバイト[]){

                        //画像は、60PXに行の高さを設定すると、

                        row.setHeightInPoints(60)。

                        //列幅が80pxである画像を設定し、どこ変換ユニットに注意を払います

                        sheet.setColumnWidth(I、(ショート)(35.7 * 80));

                        バイト[] bsValue =(バイト[])の値。

                        XSSFClientAnchorアンカー=新しいXSSFClientAnchor(0、0、

                                1023、255、(短い)6、インデックス、(短い)6、インデックス)

                        anchor.setAnchorType(2)。

                        patriarch.createPicture(アンカー、book.addPicture(

                                bsValue、XSSFWorkbook.PICTURE_TYPE_JPEG));

                    }他{

                        //値が空であるかどうかを判断します

                        もし(値!= NULL){

                        //他のデータ型は、単純な文字列として扱われます

                        textValue = value.toString()。

                        }

                    }

                    //そうでない場合はtextValueは桁のみで構成するかどうかを判断するための正規表現の使用上の画像データは、

                    もし(textValue!= NULL){

                        パターンp = Pattern.compile( "^ // Dの+(//.// D +)$?");

                        マッチマッチ= p.matcher(テキスト、値)。

                        IF(matcher.matches()){

                            //デジタル処理として、二重

                            cell.setCellValue(Double.parseDouble(textValue))。

                        }他{

                           XSSFRichTextString richString =新しいXSSFRichTextString(

                                    textValue);

                            richString.applyFont(フォント)。

                            cell.setCellValue(richString)。

                        }

                    }

                }キャッチ(SecurityExceptionが電子){



                    e.printStackTrace();

                }キャッチ(ないNoSuchMethodException電子){



                    e.printStackTrace();

                }キャッチ(例外:IllegalArgumentException電子){



                    e.printStackTrace();

                }キャッチ(IllegalAccessExceptionが電子){



                    e.printStackTrace();

                }キャッチ(にInvocationTargetException電子){



                    e.printStackTrace();

                } 最後に {

                    //リソースをクリーンアップ

                }

            }



        }

        {試します

            book.write(アウト)。

            out.flush();

            out.close();

        }キャッチ(IOExceptionを電子){

            e.printStackTrace();

        }



    }

    

}


どのように使用するには:


 ExportExcel <ContractVO> EX =新しいExportExcel <ContractVO>();

        //セットリスト名

        文字列[]ヘッダー= {「番号」、「従業員名」、「性別」、「契約種別」、「×××番号」、「派遣」

                「ディスパッチ時間」、「契約開始時刻」、「契約期間の終わり、」「契約期間」、「状態の契約」、「コントラクト名」};


       //エクスポートリスト名の値を照会

        一覧<ContractVO>データセット= contractExpireDmn.getContractMessage();

        response.reset();

        //生成されたファイルの種類を設定します

        response.setContentType( "アプリケーション/ vnd.ms-エクセル")。


      //設定するヘッダ

        response.setHeader( "コンテンツ・処分"、 "添付ファイル;ファイル名=" +新しいString(( "単位契約の早期警戒情報").getBytes( "GBK")、 "ISO8859-1")

        + "の.xlsx");

        OutputStreamのOS = response.getOutputStream()。

        //内部のExcelの道に入ってくるデータのエクスポート

        ex.exportExcel( "ユニットのスタッフの契約Excel文書"、ヘッダ、データセット、OS、セッション)。


おすすめ

転載: blog.51cto.com/14028890/2415255