1: はじめに
最近の開発では、複雑なマルチヘッダー、マルチシート、マルチ画像の Excel エクスポートの問題に遭遇しました。
この記事で使用している Excel を操作するためのフレームワークは EasyPoi です。
EasyPoiの機能はその名の通りeasy、主な機能は簡単なので、poiに触れたことがない人でも、簡単な注釈とテンプレートを介して、Excelのエクスポート、Excelのテンプレートのエクスポート、Excelのインポート、Wordのテンプレートのエクスポートを簡単に書くことができます言語(表現文法に精通している)、以前の複雑な文章を完成させる
公式ホームページ: www.wupaas.com/easypoi.htm…
API ドキュメント: doc.wupaas.com/docs/easypo…
2: EasyPoi テンプレートコマンドの紹介
テンプレートは、複雑な Excel を処理する簡単な方法です.複雑な Excel スタイルは Excel で直接編集できるため、コーディング スタイルの地雷原を完全に回避できます.同時に、コマンドのサポートにより、テンプレートの有効性も向上します.
EasyPoi でサポートされているコマンドと機能を以下に示します。 最も重要なのは、さまざまな fe の使用方法です。
- スペーススプリット
- 三眼操作 { {test ? obj:obj2}}
- n: このセルが数値型であることを示します { {n:}}
- le: 長さの略 { {le:()}} use { {le:() > 8 ? obj1 : obj2}} if/else
- fd: フォーマット時間 { {fd:(obj;yyyy-MM-dd)}}
- fn: フォーマット番号 { {fn:(obj;###.00)}}
- fe: データのトラバース、行の作成
- !fe: 行を作成せずにデータをトラバースする
- $fe: 下に移動して挿入、現在の行と次の行を下に移動. size() 行、次に挿入
- #fe: 水平トラバーサル
- v_fe: 水平トラバーサル値
- !if: 現在の列を削除 { {!if:(test)}}
- 一重引用符は「1」などの定数値を表し、出力は 1 です
- &NULL&スペース
- &INDEX& は、ループ内のシーケンス番号を示し、自動的に追加されます
- ]] 改行文字の複数行トラバーサル エクスポート
- 合計: 統計
- cal: ベース +-X% 計算
- dict: 辞書
- i18n: 国際化
3: デザインのアイデア
1. easypoi テンプレートの指示に従って、データ構造を設計およびエクスポートし、Excel テンプレートに入力します。
2. データをクエリし、トラバースする必要があるリストに設計されたシート ページとセルを前処理します。
テンプレート テーブル内の対応するセルを下に移動し、結合する必要があるセルを結合します。
//セルを下に移動します sheet.shiftRows(startRow, endRow, n); コードをコピー
//結合セル sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol)); コードをコピー
3. テンプレートのエクスポート パラメータを作成する
// テンプレート エクスポート パラメータを作成する TemplateExportParams params = new TemplateExportParams(dealTemplatePath, true, sheetNames); コードをコピー
4. ワークブックの生成とエクスポート
// ワークブックを生成してエクスポート Workbook workbook = templateExcelExportHelper.createExcelByTemplate(getMinioInputStream(BUCKET_NAME, dealTemplatePath), params, sheetMap); コードをコピー
5. easypoi によって生成されたワークブックを処理する
/** * 設定外边框 * @param workbook 工作表 * @param i sheet下标 */ public static void setSheetBorder(Workbook workbook, int i) { CellRangeAddress cellRangeAddress = new CellRangeAddress(0, workbook.getSheetAt(i).getLastRowNum (),0, workbook.getSheetAt(i).getRow(0).getPhysicalNumberOfCells() -1); RegionUtil.setBorderBottom(BorderStyle.MEDIUM,cellRangeAddress, workbook.getSheetAt(i)); RegionUtil.setBorderLeft(BorderStyle.MEDIUM,cellRangeAddress, workbook.getSheetAt(i)); RegionUtil.setBorderRight(BorderStyle.MEDIUM,cellRangeAddress, workbook.getSheetAt(i)); RegionUtil.setBorderTop(BorderStyle.MEDIUM,cellRangeAddress, workbook.getSheetAt(i)); } 复制代码
6. ファイルを出力し、前処理によって生成されたテンプレート ファイルを削除します
//サーブレットへの出力ファイルの流れ setExportExcelFormat(response, workbook, exportExcelName); //生成された前処理テンプレートを削除 deleteTemplate(dealTemplatePath); コードをコピー
/** * 输出文件流 * * @param 応答 * @param ワークブック * @param ファイル名 * @throws 例外 */ public void setExportExcelFormat(HttpServletResponse 応答、ワークブック ワークブック、文字列ファイル名) 例外をスローします { ServletOutputStream outStream = null; 文字列 fileNameURL = URLEncoder.encode(fileName, "UTF-8"); response.setContentType("オクテット/ストリーム"); response.setHeader("Content-disposition", "attachment;filename=" + fileNameURL + ";" + "filename*=utf-8''" + fileNameURL); response.addHeader("Pargam", "no-cache"); response.addHeader(" outStream = response.getOutputStream(); workbook.write(outStream); } 最終的に { outStream.close (); } }