文章目錄
- 一、后端部分
- 二、前端部分
- 三、模板制作
一、后端部分
//1、在application-dev.yml文件增加模板路徑path :#模板路徑saxls: /data/opt/saxls/
//2、控制層寫法
public class sabassalController extends JeecgController<sabassalVo, IsabassalService> {@Autowiredprivate IsabassalService isabassalservice;@Autowiredprivate IMonthNonmeddisbpayService imonthnonmeddisbpayservice;private static String saxls;@Value(value = "${jeecg.path.saxls}")public void setsaxls(String saxls) {sabassalController.saxls = saxls; // 通過setter注入靜態變量}/*** 一鍵按模板導出** @param request* @return*/@RequestMapping(value = "/exsabassal")public void exbsamt(HttpServletRequest request, HttpServletResponse response) throws Exception {Map<String, String[]> parameterMap = request.getParameterMap();
//獲取前段傳入的參數String[] months = parameterMap.get("months");String smonths=null;if (months != null && months.length > 0) {smonths = months[0];}// 第一個模板Workbook workbook1 = ExcelExportUtil.exportExcel(getTemplateParams("zbjb"), createDataMapzb(smonths));// 設置ZIP響應頭response.setContentType("application/zip");String fileName = "sa_reports_" + LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE) + ".zip";response.setHeader("Content-Disposition", "attachment;filename=" + fileName);try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {// 寫入第一個ExceladdToZip(zos, workbook1, smonthst+"人員表.xlsx");}}/*** 獲取相關數據**/private Map<String, Object> createDataMapzb(String months) {String estab ="11";String poscat=null;Map<String, Object> map = new HashMap<>();//查詢條件參數 months,estab,poscatList<sabassalVo> list = isabassalservice.exsabassal(months,estab,poscat);
//1、求和數據列 lvsalString sumlvsaltotal = calculateSum(list, sabassalVo::getLvsal);// 設置樣式(確保 Excel 單元格格式正確)Map<String, Object> styles = new HashMap<>();styles.put("numberFormat", "0.00"); // 強制兩位小數map.put("title", "全員表");map.put("list", list);map.put("sumlvsaltotal", sumlvsaltotal); // 添加合計值map.put("years", years);map.put("month", month);map.put("styles", styles);return map;}/*** 將xls轉為zip**/private void addToZip(ZipOutputStream zos, Workbook workbook, String fileName) throws IOException {ZipEntry entry = new ZipEntry(fileName);zos.putNextEntry(entry);workbook.write(zos);workbook.close();zos.closeEntry();}/*** 獲取基本模板* @return*/public static TemplateExportParams getTemplateParams(String name) throws IOException {return new TemplateExportParams(saxls+"//jb//"+name+".xlsx");}//公共方法求和統計private String calculateSum(List<sabassalVo> list, Function<sabassalVo, BigDecimal> fieldExtractor) {return list.stream().filter(vo -> fieldExtractor.apply(vo) != null) // 過濾null值.map(fieldExtractor) // 直接提取 BigDecimal.reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP).toPlainString();}private String calculatefwbSum(List<MonthNonmeddisbpay> list, Function<MonthNonmeddisbpay, BigDecimal> fieldExtractor) {return list.stream().filter(vo -> fieldExtractor.apply(vo) != null) // 過濾null值.map(fieldExtractor) // 直接提取 BigDecimal.reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP).toPlainString();}}
二、前端部分
#1、增加一個按鈕<a-button type="primary" icon="download" @click="handleExportbassalzip('基本表')">1、基本表導出</a-button>#2、增加請求方法url: {exportbassalXlsUrl: "/sa/saBasic/exsabassal",},#3、增加一個方法handleExportbassalzip(fileName){// 增加嚴格空值判斷(包括null/undefined/空字符串)if (!this.queryParam.months) {this.$message.warning("請選擇月份")return // 增加返回語句阻止繼續執行}if(!fileName || typeof fileName != "string"){fileName = "導出文件"}let param = this.getQueryParams();if(this.selectedRowKeys && this.selectedRowKeys.length>0){param['selections'] = this.selectedRowKeys.join(",")}downFile(this.url.exportbassalXlsUrl,param).then((data)=>{if (!data) {this.$message.warning("文件下載失敗")return}if (typeof window.navigator.msSaveBlob !== 'undefined') {window.navigator.msSaveBlob(new Blob([data],{type: 'application/vnd.ms-excel'}), fileName+'.zip')}else{let url = window.URL.createObjectURL(new Blob([data],{type: 'application/vnd.ms-excel'}))let link = document.createElement('a')link.style.display = 'none'link.href = urllink.setAttribute('download', fileName+'.zip')document.body.appendChild(link)link.click()document.body.removeChild(link); //下載完成移除元素window.URL.revokeObjectURL(url); //釋放掉blob對象}})},
三、模板制作
zbjb.xlsx
文件內容如下:
其中循環列表如下:
{{$fe:list t.id t.names t.depts t.hrtit t.lvl t.lvsal}}