アイデア+安らかなスタイルを使用します
まず:依存関係の導入:
<! - POI - > <依存> <groupIdを> org.apache.xmlbeans </ groupIdを> <たartifactId> XMLBeansの</たartifactId> <バージョン> 2.6.0 </バージョン> </依存関係> <依存> <groupIdを> DOM4J </のgroupId> <たartifactId> DOM4J </たartifactId> <バージョン> 1.6.1 </バージョン> </依存> <依存性> <のgroupId> org.apache.poi </のgroupId> <たartifactId> POI </たartifactId > <バージョン> 3.9 </ version>の </依存関係> <依存> <groupIdを> org.apache.poi </ groupIdを> <たartifactId> POI-OOXML </たartifactId> <バージョン> 3.9 </ version>の </依存関係> <! - POI - >
ステップ2:
ファイルアップロードツール
輸入java.io.BufferedInputStreamの。 輸入java.io.BufferedOutputStream。 輸入java.io.ByteArrayInputStream。 輸入java.io.ByteArrayOutputStreamを。 インポートにjava.io.IOException; 輸入java.io.InputStreamを。 輸入java.lang.reflect.Methodオブジェクト。 輸入はjava.util.ArrayList; 輸入java.util.HashMapを; 輸入はjava.util.List; 輸入java.util.Map; インポートのjavax.servlet.ServletOutputStream。 インポートのjavax.servlet.http.HttpServletResponse; 輸入org.apache.poi.hssf.usermodel.HSSFWorkbook; 輸入org.apache.poi.ss.usermodel.Cell; 輸入org.apache.poi.ss.usermodel.CellStyle。 輸入org.apache.poi.ss.usermodel.Font; 輸入org.apache.poi.ss.usermodel.IndexedColors。 org.apache.poi.ss.usermodel.Rowインポート、 インポートorg.apache.poi.ss.usermodel.Sheet; インポートorg.apache.poi.ss.usermodel.Workbook; / ** * @author Qingmu * @versionを作成時間:2017年12月28日午前4時53分29秒PM *クラス説明:POI輸出ツールクラス * / パブリッククラスExportPOIUtils { //パラメーター:ファイル名:ファイル名のプロジェクト:オブジェクトのCOLUMNNAMESのコレクション:列名キー:マップキー パブリック静的ボイドstart_download(HttpServletResponseの応答、文字列のファイル名、リスト<?>プロジェクトは、 String []型COLUMNNAMES、文字列[]キー)のIOException {スロー //属性のコレクション・リスト内のオブジェクトに対応する<地図<文字列、オブジェクト>>を 一覧<地図<文字列、オブジェクトリスト>> = createExcelRecord(プロジェクト、キー); ByteArrayOutputStream ByteArrayOutputStream新しい新OS =(); {試します //ワークブックオブジェクトによって変換され、ダウンロードストリーミング ; createWorkBook(一覧、キー、COLUMNNAMES).WRITE(OS) }キャッチ(IOExceptionをEを){ e.printStackTrace(); } バイト[ ] os.toByteArrayコンテンツ=(); のInputStream AれるByteArrayInputStreamは=(コンテンツ)新しいIS新しい; //設定ダウンロードページ開くことができます応答パラメータ response.reset(); response.setContentType(「ファイルアプリケーション/ vnd.ms-Excelを;のcharset = UTF -8 "); response.setHeader("コンテンツ・処分""添付ファイル;ファイル名= "+新新しいString((fileNameに+" * .XLS ")GetBytesメソッド(),." ISO-8859-1「)); ServletOutputStreamをOUT response.getOutputStream =(); BufferedInputStreamをBIS = NULL; BufferedOutputStreamがBOS = NULL; 試す{ ビス=新しいBufferedInputStreamを(です); BOS =新しいBufferedOutputStreamが(アウト); バイト[] = BUFF新しい新しいバイト[2048]; int型bytesRead。 一方(-1 =(bytesRead = bis.read(バフ、0、buff.length))!){ bos.write(バフ、0、bytesRead)。 } }キャッチ(最終のIOException電子){ Eを投げます。 }最後に、{ (!ビス= NULL)場合 )(bis.close。 (BOS = nullを!)もし bos.close(); } } プライベート静的リスト<地図<文字列オブジェクト>> createExcelRecord(一覧<?>プロジェクト、文字列[]キー){ リスト<地図<文字列オブジェクト>> listmap =新規のArrayList <地図<文字列オブジェクト>>() ; 地図<文字列、オブジェクト>マップ=新しいHashMapの<文字列、オブジェクト>(); map.put( "SHEETNAME"、 "シート")。 listmap.add(マップ) オブジェクトプロジェクト= NULL; 以下のための(int型J = 0; J <projects.size(); J ++){ プロジェクト= projects.get(J)。 地図<文字列、オブジェクト> mapValue =新しいHashMapの<文字列、オブジェクト>(); 以下のために(INT i = 0; I <keys.length; I ++){ mapValue.put(キー[I]、getFieldValueByName(キー[I]、プロジェクト))。 } listmap.add(mapValue)。 } 戻りlistmap。 } / ** *利用反射根据属性名获取属性值 * / プライベート静的オブジェクトgetFieldValueByName(文字列フィールド名、オブジェクトo){ {試みる 文字列firstLetter = fieldName.substring(0、1).toUpperCase(); 文字列のゲッター= "GET" + firstLetter + fieldName.substring(1); 方法メソッド= o.getClass()getMethod(ゲッター、新しいクラス[] {})。 オブジェクト値= method.invoke(O、新しいオブジェクト[] {})。 値を返します。 キャッチ}(例外E){ e.printStackTrace(); 戻り値はnull; } } / ** *エクセル文書オブジェクト作成 マップのキー配列に設定* @paramキーのリストを * @paramのCOLUMNNAMESはの列名秀でる * * / プライベート静的createWorkBookブック(一覧<地図<文字列オブジェクト>>リスト、文字列[]キー、COLUMNNAMESのString []){ // Excelワークブックの作成 ワークブックWB =新しい新しいHSSFWorkbookを(); //最初のシート(ページ)を作成し、そして、指定 シートシート= wb.createSheet(List.get(0)に.get( "SHEETNAME")のtoString()); //最初の行を作成します //手動で列幅を設定します。列の最初のパラメータセットに、2番目の列は、幅パラメータを示し、nは高いことがピクセルの列の数です。 以下のために(INT I = 0; I <keys.length; I ++){ sheet.setColumnWidth((ショート)I、(ショート)(35.7 * 150)); } 行の行= sheet.createRow((ショート)、0); / /書式二つの細胞の作成 、CellStyle wb.createCellStyle CS =()を CellStyle wb.createCellStyle CS2 =を(); // 2つのフォントを作成する フォントwb.createFont F =(); フォントwb.createFont F2 =(); / /最初のフォントスタイル(カラム名)を作成 f.setFontHeightInPoints((ショート)10); f.setColor(IndexedColors.BLACK.getIndex()); f.setBoldweight(Font.BOLDWEIGHT_BOLD); //第二の作成フォントスタイル(値用) f2.setFontHeightInPoints((ショート)10)。 f2.setColor(IndexedColors.BLACK.getIndex()); //(カラム名用)最初のセルのスタイルを設定 するための(INT i = 0; iは columnNames.lengthを<。 I ++){ cs.setFont(F); cs.setBorderLeft(CellStyle.BORDER_THIN)。 cs.setBorderRight(CellStyle.BORDER_THIN); cs.setBorderTop(CellStyle.BORDER_THIN); cs.setBorderBottom(CellStyle.BORDER_THIN); cs.setAlignment(CellStyle.ALIGN_CENTER); //設定された第2のセルパターン(値) cs2.setFont(F2); cs2.setBorderLeft(CellStyle.BORDER_THIN); cs2.setBorderRight(CellStyle.BORDER_THIN); cs2.setBorderTop(CellStyle.BORDER_THIN); cs2.setBorderBottom(CellStyle.BORDER_THIN); cs2.setAlignment(CellStyle。 ALIGN_CENTER); //列の名前を設定する cell.setCellValue(COLUMNNAMES [I]); cell.setCellStyle(CS)。 = Row.createCellセルCELL(I); } 行ごと//設定値 のため(=ショートI 1、。私は()はlist.sizeを<; Iは++){ //行の行、セル格子、行セルとは、0からカウントさ 作成//ページ・シート上の線 列sheet.createRow ROW1 =((ショート)I); //行ライン上にグリッドを作成 するための(ショートJ = 0; J <keys.length; J ++){ セルCELL = ROW1。 createCell(J); cell.setCellValue(list.get(I)に.get(キー[J])== NULL "":list.get(I)に.get(キー[J])のtoString()+。)。 cell.setCellStyle(CS2); } } WBを返します; } }
第三段階:コントローラ層を書きます
輸入com.example.uploaddemo.util.ExportPOIUtils。 輸入org.springframework.web.bind.annotation.RequestMapping。 インポートのjavax.servlet.http.HttpServletResponse; インポートにjava.io.IOException; 輸入はjava.util.ArrayList; 輸入はjava.util.List; / ** * @author qingmu * @date * / パブリック クラスUserControllerで{ @RequestMapping( "exportList" ) 公共 ボイドexportList(HttpServletResponseの応答、ストリングID){ 文字列fileNameに = "人员档案列表" 。 リスト試す{ ExportPOIUtils.start_download(応答、ファイル名、ユーザ、COLUMNNAMES、キー) } キャッチ(IOExceptionを電子){ e.printStackTrace(); } } }
ここで一つ少なく、ユーザエンティティクラスだ、あなたは大丈夫、エクスポートするエンティティ・クラスに直接置き換えることができます。
クリーンコード、および効率的なコード。