easyexcel导出动态头、指定列、自定义样式(不创建对象)

Controller:

    public void exportDetailLeave(@RequestBody Map<String, Object> params, HttpServletResponse response) {
        List<Map<String,Object>> list = faceBedService.selectBedOnlineBy(params);
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition", "attachment;");
        String[] header = {"宿舍","姓名","学号","状态","归寝时间"};
        String fileName = "实时离寝情况报表";
        // 标题样式
        WriteCellStyle headWriteCellStyle = EasyExcelUtil.getHeadStyle();
        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        HorizontalCellStyleStrategy horizontalCellStyleStrategy =
            new HorizontalCellStyleStrategy(headWriteCellStyle, new WriteCellStyle());
            EasyExcel.write(response.getOutputStream())
                    // 第一行大标题样式设置
                    .registerWriteHandler(new SheetWriteHandlerUtil(fileName))
                    //设置默认样式及写入头信息开始的行数
                    .useDefaultStyle(true).relativeHeadRowIndex(1)
                    // 表头、内容样式设置
                    .registerWriteHandler(horizontalCellStyleStrategy)
                    // 统一列宽,如需设置自动列宽则new LongestMatchColumnWidthStyleStrategy()
                    .registerWriteHandler(new SimpleColumnWidthStyleStrategy(25))
                    .sheet(fileName)
                    // 这里放入动态头
                    .head(head(header,fileName))
                    // 当然这里数据也可以用 List<List<String>> 去传入
                    .doWrite(detail(list));
    }
    private List<List<Object>> detail(List<Map<String,Object>> mapList) {
        List<List<Object>> list =  new ArrayList<List<Object>>();
        for (Map<String, Object> map : mapList) {
            List<Object> objectList = new ArrayList<>();
            objectList.add(map.get("dorm"));
            objectList.add(map.get("stuName"));
            objectList.add(map.get("stuNo"));
            objectList.add(map.get("status"));
            objectList.add(map.get("returnLeave"));
            list.add(objectList);
        }
        return list;
    }

EasyExcelUtil:

    /**动态头传入*/
    public static List<List<String>> head(String[] header, String bigTitle) {
        List<String> head0 = null;
        List<List<String>> list = new LinkedList<List<String>>();
        for (String h : header) {
            head0 = new LinkedList<>();
            head0.add(bigTitle);
            head0.add(h);
            list.add(head0);
        }
        return list;
    }

    public static WriteCellStyle getHeadStyle(){
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 背景颜色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
        headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
        // 字体
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontName("黑体");//设置字体名字
        headWriteFont.setFontHeightInPoints((short)15);//设置字体大小
        headWriteFont.setBold(true);//字体加粗
        headWriteCellStyle.setWriteFont(headWriteFont); //在样式用应用设置的字体;
        // 样式
        headWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框;
        headWriteCellStyle.setBottomBorderColor((short) 0);//设置底边框颜色;
        headWriteCellStyle.setBorderLeft(BorderStyle.THIN);  //设置左边框;
        headWriteCellStyle.setLeftBorderColor((short) 0);//设置左边框颜色;
        headWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框;
        headWriteCellStyle.setRightBorderColor((short) 0);//设置右边框颜色;
        headWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框;
        headWriteCellStyle.setTopBorderColor((short) 0); //设置顶边框颜色;
        headWriteCellStyle.setWrapped(true);  //设置自动换行;
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);//设置水平对齐的样式为居中对齐;
        headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);  //设置垂直对齐的样式为居中对齐;
        //        headWriteCellStyle.setShrinkToFit(true);//设置文本收缩至合适

        return headWriteCellStyle;
    }

SheetWriteHandlerUtil:(设置第一行大标题样式)

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;


public class SheetWriteHandlerUtil implements SheetWriteHandler {

    private final String title;
    private final String[] header;

    public SheetWriteHandlerUtil(String title, String[] header) {
        this.title = title;
        this.header = header;
    }

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

    }

    @Override
    public 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(title);
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        Font font = workbook.createFont();
        font.setBold(true);
        font.setFontHeight((short) 400);
        cellStyle.setFont(font);
        cell.setCellStyle(cellStyle);
        // 第一行大标题占位设置
        sheet.addMergedRegionUnsafe(new CellRangeAddress(0, 0, 0, header.length-1));
    }
}

ps:尽量每个registerWriteHandler拦截器功能单一/尽量少的拦截器,否则可能会产生冲突没效果。controller这里只自定义了标题样式,不自定义内容样式的原因是使用动态头可能会导致自定义的内容样式失效!!!

效果图:
在这里插入图片描述

  • 9
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于复杂自定义导出,可以使用EasyExcel的注解`@ExcelProperty`来实现。具体步骤如下: 1. 创建表实体类,使用`@ExcelProperty`注解来定义表名称和对应的字段。 ```java public class ComplexHeadData { @ExcelProperty({"主标题", "名称"}) private String name; @ExcelProperty({"主标题", "数量"}) private Integer number; @ExcelProperty({"主标题", "价格"}) private Double price; @ExcelProperty({"次标题", "子名称"}) private String subName; @ExcelProperty({"次标题", "子数量"}) private Integer subNumber; @ExcelProperty({"次标题", "子价格"}) private Double subPrice; // 省略getter和setter方法 } ``` 2. 创建导出数据集合,并将数据集合和表实体类传入`EasyExcel.write()`方法中,使用`Sheet`对象来设置表。 ```java List<ComplexHeadData> data = ... Sheet sheet = new Sheet(1, 0, ComplexHeadData.class); // 设置主标题行 List<List<String>> head = new ArrayList<>(); head.add(Arrays.asList("主标题", "名称", "数量", "价格")); // 设置次标题行 head.add(Arrays.asList("次标题", "子名称", "子数量", "子价格")); // 设置表样式 WriteCellStyle headStyle = new WriteCellStyle(); // ... 设置样式 // 设置主标题行的样式 WriteCellStyle mainHeadStyle = new WriteCellStyle(headStyle); mainHeadStyle.setFillForegroundColor(IndexedColors.BLUE_GREY.getIndex()); // 设置次标题行的样式 WriteCellStyle subHeadStyle = new WriteCellStyle(headStyle); subHeadStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); // 设置主标题行和次标题行的样式 WriteCellStyle headCellStyle = new WriteCellStyle(); headCellStyle.setWrapped(true); headCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); headCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); headCellStyle.setMainHeadStyle(mainHeadStyle); headCellStyle.setSubHeadStyle(subHeadStyle); // 设置表 sheet.setHead(head); sheet.setHeadStyle(headCellStyle); // 写入数据到Excel EasyExcel.write(outputStream, ComplexHeadData.class).sheet().doWrite(data); ``` 通过以上步骤,即可实现复杂自定义导出。需要注意的是,`@ExcelProperty`注解中的数组参数表示表的层级关系,数组的第一个元素为主标题,第二个元素为次标题,以此类推。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值