先看效果:
1、引入maven依赖
<!--EasyExcel --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version> </dependency>
2、实体类
package com.huawei.it.domain;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;/*** @description: 嫁功率考勤实体类* @author: yeyong* @create: 2024-01-16*/
public class Jglkq{@ExcelProperty({"考勤状态"})private String kqzt; //考勤状态@ExcelProperty({"日期"})@ColumnWidth(20)private String rq; //日期@ExcelProperty({"工号"})private String gh; //工号@ExcelProperty({"姓名"})private String xm; //姓名@ExcelProperty({"应出勤"})private String ycq; //应出勤@ExcelProperty({"实出勤"})private String scq; //实出勤@ExcelProperty({"班制名称"})private String bzmc; //班制名称@ExcelProperty({"班一","上"})private String sw; //上@ExcelProperty({"班一","下"})private String xw; //下@ExcelProperty({"平时加班"})private String psjb; //平时加班@ExcelProperty({"假日加班"})private String jrjb; //假日加班@ExcelProperty({"周六排班8小时"})private String str1; //周六排班8小时@ExcelProperty({"周六超8小时"})private String str2; //周六超8小时//忽略这个字段@ExcelIgnoreprivate String IsNight; //是否夜班 0:否 1:是public String getKqzt() {return kqzt;}public void setKqzt(String kqzt) {this.kqzt = "正常";}public String getRq() {return rq;}public void setRq(String rq) {this.rq = rq;}public String getGh() {return gh;}public void setGh(String gh) {this.gh = gh;}public String getXm() {return xm;}public void setXm(String xm) {this.xm = xm;}public String getYcq() {return ycq;}public void setYcq(String ycq) {this.ycq = ycq;}public String getScq() {return scq;}public void setScq(String scq) {this.scq = scq;}public String getBzmc() {return bzmc;}public void setBzmc(String bzmc) {this.bzmc = bzmc;}public String getSw() {return sw;}public void setSw(String sw) {this.sw = sw;}public String getXw() {return xw;}public void setXw(String xw) {this.xw = xw;}public String getPsjb() {return psjb;}public void setPsjb(String psjb) {this.psjb = psjb;}public String getJrjb() {return jrjb;}public void setJrjb(String jrjb) {this.jrjb = jrjb;}public String getStr1() {return str1;}public void setStr1(String str1) {this.str1 = str1;}public String getStr2() {return str2;}public void setStr2(String str2) {this.str2 = str2;}public String getIsNight() {return IsNight;}public void setIsNight(String isNight) {IsNight = isNight;}}
3、web导出 controller
package com.huawei.web.controller.it;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.merge.LoopMergeStrategy;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy;
import com.huawei.common.core.controller.BaseController;
import com.huawei.common.core.page.TableDataInfo;
import com.huawei.common.utils.poi.MonthSheetWriteHandler;
import com.huawei.it.domain.DemoData;
import com.huawei.it.domain.Jglkq;
import com.huawei.it.service.JglkqService;
import org.apache.poi.ss.usermodel.*;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;/*** @description:* @author: yeyong* @create: 2024-01-16*/
@Controller
@RequestMapping("/hr/jglkq")
public class JglkqController extends BaseController {private String prefix = "it/hr";@Autowiredprivate JglkqService jglkqService;//使用easyExcel导出@GetMapping("/export")public void easyExcelExport(HttpServletResponse response,Jglkq jglkq){//备注:使用easyExcel导出多级表头try {//准备数据List<Jglkq> kqList =new ArrayList<Jglkq>();List<Jglkq> list = jglkqService.selectJglkqList(jglkq);for (Jglkq kq1 : list) {Jglkq kq = new Jglkq();kq.setKqzt(kq1.getKqzt()); //考勤状态kq.setRq(kq1.getRq()); //日期kq.setGh(kq1.getGh()); //工号kq.setXm(kq1.getXm()); //姓名kq.setYcq("1"); //应出勤kq.setScq("1"); //实出勤kq.setBzmc(kq1.getBzmc()); //班制名称kq.setSw(kq1.getSw()); //上班kq.setXw(kq1.getXw()); //下班kq.setPsjb(kq1.getPsjb()); //平时加班kq.setJrjb(kq1.getJrjb()); //假日加班kq.setStr1(kq1.getStr1()); //kq.setStr2(kq1.getStr2()); //kqList.add(kq);}//response.setContentType("application/vnd.ms-excel");response.setContentType("application/vnd.ms-excel;charset=utf-8");response.setCharacterEncoding("utf-8");//StringBuffer bigTitle = new StringBuffer("考勤结果明细查询");//String fileName = URLEncoder.encode(bigTitle.toString(), "UTF-8")+ ".xlsx";String fileName = System.currentTimeMillis()+".xlsx";response.setHeader("Content-disposition", "attachment;filename=" + fileName);// 头的策略WriteCellStyle headWriteCellStyle = new WriteCellStyle();headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());// 默认设置为水平居中WriteCellStyle contentWriteCellStyle = new WriteCellStyle();contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);contentWriteCellStyle.setBorderRight(BorderStyle.THIN);contentWriteCellStyle.setBorderTop(BorderStyle.THIN);// 这里需要设置不关闭流EasyExcel.write(response.getOutputStream(), Jglkq.class)//.autoCloseStream(Boolean.FALSE).registerWriteHandler(horizontalCellStyleStrategy).sheet("考勤结果明细查询").relativeHeadRowIndex(1)//设置拦截器或自定义样式.registerWriteHandler(new MonthSheetWriteHandler()).registerWriteHandler(new HorizontalCellStyleStrategy(headWriteCellStyle,contentWriteCellStyle)).doWrite(kqList);} catch (IOException e) {e.printStackTrace();}}}
4、在拦截器中对表头的样式进行自定义的覆盖
package com.huawei.common.utils.poi;
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;/*** @description: 表头设置拦截器* @author: yeyong* @create: 2024-01-17*/
public class MonthSheetWriteHandler implements SheetWriteHandler {@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {Workbook workbook = writeWorkbookHolder.getWorkbook();Sheet sheet = workbook.getSheetAt(0);Row row1 = sheet.createRow(0);row1.setHeight((short) 800);Cell cell = row1.createCell(0);//设置标题cell.setCellValue("考勤结果明细查询" );CellStyle cellStyle = workbook.createCellStyle();cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellStyle.setAlignment(HorizontalAlignment.CENTER);Font font = workbook.createFont();font.setBold(true);font.setFontHeight((short) 400);font.setFontName("宋体");cellStyle.setFont(font);cell.setCellStyle(cellStyle);sheet.addMergedRegionUnsafe(new CellRangeAddress(0, 0, 0, 15));}}