项目实战 | Excel导出(三)——Excel导出样式

项目实战 | Excel导出(三)——Excel导出样式

章节
一、Excel导出方式
二、Excel返回内容优化
三、Excel导出样式

1、填充Excel的样式

仅需要在Excel上改变导出模板的样式,如:内容字体样式和大小、单元格边框、单元格底色等等
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pea3pSJc-1660275981772)(E:\AppData\Roaming\Typora\typora-user-images\image-20220811101558860.png)]
将采用模板导出方式,即可按照设置的模板样式格式进行导出
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udu4LqZb-1660275981775)(E:\AppData\Roaming\Typora\typora-user-images\image-20220811101808491.png)]
代码:

@Override
public String exportGradeTPList(String schoolID) throws IOException {

    List<GradeTpList> gradeTpLists =teachPlanMgrBaseInfoMapper.selectGradeTpListBySchoolId(schoolID);
    Date date=new Date();
    String excelName =  "个人教案库-年级详细统计数据(" + DateUtils.getTime(date) + ")";
    String fileName = "个人教案库-年级详细统计数据(" + DateUtils.getExcelTime(date) + ")" + ".xlsx";
    
    File file = new File(ResourceUtils.getURL("classpath:").getPath()+"static/outExcel/" + fileName);
    File parentFile = file.getParentFile();
    if (!parentFile.exists()) {
        parentFile.mkdir();
    }
    InputStream is = getGradeTemplateIn("excel/GradeTeachPlanData.xlsx",gradeTpLists);
    ExcelWriter excelWriter = EasyExcel.write(file)
        .withTemplate(is)
        .registerConverter(new FileSizeConverter())
        .registerConverter(new RateConverter())
        .build();

    for (int i = 0; i < gradeTpLists.size(); i++) {
        WriteSheet writeSheet = EasyExcel.writerSheet(i).build();
        excelWriter.fill(gradeTpLists.get(i).getGradeTpExcelInfoList(), writeSheet);
        Map<String, Object> map = new HashMap<>(5);
        map.put("excelName", excelName);
        map.put("gradeName", gradeTpLists.get(i).getGradeName());
        map.put("countTeachPlan", gradeTpLists.get(i).getCountTeachPlan());
        map.put("tpSize", gradeTpLists.get(i).getTpSize());
        map.put("frozenCount", gradeTpLists.get(i).getFrozenCount());
        excelWriter.fill(map, writeSheet);
    }
    excelWriter.finish();
    String filePath = baseInfo.getResMgrRootUrl()+"/outExcel/"+fileName;
    return filePath;
}

2、通过类结构导出Excel的样式

样图:
在这里插入图片描述

思路:通过类属性和注解去映射出Excel的布局,再去通过拦截器修改样式和相关内容。

①类结构:

@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("共享教案库教师统计数据")
public class ShareTpExcelInfo {


    @ExcelProperty(value = { "共享教案-教师统计数据","教师姓名"})
    @ColumnWidth(20)
    @JSONField(name = "SharerName")
    @ApiModelProperty("共享者名称")
    private String sharerName;

    @ExcelProperty(value = { "共享教案-教师统计数据","所属学科"})
    @ColumnWidth(35)
    @JSONField(serialize = false)
    @ApiModelProperty(value = "所属学科",hidden = true)
    private String sharerSubject;

    @ExcelProperty(value = { "共享教案-教师统计数据","教案共享数量"})
    @ColumnWidth(20)
    @JSONField(name = "SharerCount")
    @ApiModelProperty("教案共享数量")
    private Integer sharerCount;

    @NumberFormat("#.###%")
    @ExcelProperty(value = { "共享教案-教师统计数据", "教案使用率"})
    @ColumnWidth(15)
    @JSONField(name="UsageRate",format = "#0.000")
    @ApiModelProperty("教案使用率")
    private Double usageRate;

    @NumberFormat("#0.0")
    @ExcelProperty(value = { "共享教案-教师统计数据","综合值"})
    @ColumnWidth(15)
    @ApiModelProperty("综合值" +
            "综合值= 上传教案数*5%+被使用教案数*75% +使用次数*20%")
    @JSONField(name="CompositeIndex",format = "#0.0")
    private Double compositeIndex;

}

②行列的高度宽度设置

@HeadRowHeight(35) :表头每行高度为35

@ContentRowHeight(28):内容每行高度为28

@ColumnWidth(22):每列宽度为22

③值格式的调整

@NumberFormat("#.###%"):值保存三位小数,再转换

@NumberFormat("#0.0"):值保存一位小数点
    
@DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒") :将Date转换为标准日期格式

④两行表头

//第一行表头为:共享教案-教师统计数据
//第二行表头为:教师姓名|所属学科
@ExcelProperty({ "共享教案-教师统计数据","教师姓名"})
@ExcelProperty({ "共享教案-教师统计数据","所属学科"})

⑤导出代码

EasyExcel.write(file, ShareTpExcelInfo.class)
    .registerWriteHandler(new LevelCellStyleStrategy())
    .registerWriteHandler(
   		 new ShareWorkbookWriteHandlerUtil(excelName,4,
                                      list.size()+4,"综合值= 上传教案数*5%+被使用教案数*75% +使用次数*20%")
	)
    .sheet("统计数据").doWrite(list);

⑥样式策略类:

public class LevelCellStyleStrategy extends AbstractVerticalCellStyleStrategy {

    @Override
    protected WriteCellStyle headCellStyle(Head head) {
        // 头的策略  样式调整
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 头背景 白
        headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        WriteFont headWriteFont = new WriteFont();
        // 头字号
        headWriteFont.setFontHeightInPoints((short) 14);
        // 字体样式
        headWriteFont.setFontName("宋体");
        headWriteCellStyle.setWriteFont(headWriteFont);
        // 自动换行
        headWriteCellStyle.setWrapped(true);

        // 设置细边框
        headWriteCellStyle.setBorderBottom(BorderStyle.THIN);
        headWriteCellStyle.setBorderLeft(BorderStyle.THIN);
        headWriteCellStyle.setBorderRight(BorderStyle.THIN);
        headWriteCellStyle.setBorderTop(BorderStyle.THIN);
        // 设置边框颜色 黑
        headWriteCellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
        headWriteCellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
        headWriteCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
        headWriteCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());

        // 水平对齐方式
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        // 垂直对齐方式
        headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        return headWriteCellStyle;
    }

    @Override
    protected WriteCellStyle contentCellStyle(Head head) {
        //内容样式策略
        WriteCellStyle writeCellStyle = new WriteCellStyle();
        // 根据不同字段名,采用不同的对其方式
        if (
                head.getFieldName().equals("uploadNum")
                || head.getFieldName().equals("frozenCount")
                || head.getFieldName().equals("usageRate")
                || head.getFieldName().equals("sharerCount")
                || head.getFieldName().equals("compositeIndex")
        ){
            writeCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        }else if(head.getFieldName().equals("tpSize")){
            writeCellStyle.setHorizontalAlignment(HorizontalAlignment.RIGHT);
        }else {
            writeCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
        }
        // 自动换行
        writeCellStyle.setWrapped(true);
        // 水平对齐方式
        writeCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        // 设置细边框
        writeCellStyle.setBorderBottom(BorderStyle.THIN);
        writeCellStyle.setBorderLeft(BorderStyle.THIN);
        writeCellStyle.setBorderRight(BorderStyle.THIN);
        writeCellStyle.setBorderTop(BorderStyle.THIN);
        // 设置边框颜色 黑
        writeCellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
        writeCellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
        writeCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
        writeCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
        return writeCellStyle;
    }

⑦通过拦截器对文档进行切面处理

EasyExcel常用的两种拦截器:WorkbookWriteHandler 和 SheetWriteHandler

WorkbookWriteHandler 拦截器:可编写EasyExcel创建完Excel的WorkBook单元格需要执行的前置方法和后置方法

SheetWriteHandler拦截器:可编写EasyExcel创建完Excel的Sheet需要执行的前置方法和后置方法

public class ShareWorkbookWriteHandlerUtil implements WorkbookWriteHandler{

    private final String title;
    private final Integer size;
    private final Integer outputSize;
    private final String remark;

    public ShareWorkbookWriteHandlerUtil(String title, Integer size,Integer outputSize,String remark) {
        this.title = title;
        this.size =size;
        this.remark = remark;
        this.outputSize = outputSize;
    }

    @Override
    public void beforeWorkbookCreate() {

    }

    @Override
    public void afterWorkbookCreate(WriteWorkbookHolder writeWorkbookHolder) {

    }

    @Override
    public void afterWorkbookDispose(WriteWorkbookHolder writeWorkbookHolder) {
        Workbook workbook = writeWorkbookHolder.getWorkbook();
        Sheet sheet = workbook.getSheetAt(0);
        //设置第一行表头内容
        Row row1 = sheet.getRow(0);
        row1.setHeight((short) 1000);

        for (int i = 0; i < size; i++) {
            Cell cell = row1.getCell(i);
            if (cell!=null){
                //设置单元格内容
                cell.setCellValue(title);
                CellStyle cellStyle = workbook.createCellStyle();
                cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
                cellStyle.setAlignment(HorizontalAlignment.CENTER);

                // 设置细边框
                cellStyle.setBorderBottom(BorderStyle.NONE);
                cellStyle.setBorderLeft(BorderStyle.NONE);
                cellStyle.setBorderRight(BorderStyle.NONE);
                cellStyle.setBorderTop(BorderStyle.NONE);

                Font font = workbook.createFont();
                font.setBold(true);
                font.setFontHeight((short) 320);
                font.setFontName("宋体");

                cellStyle.setFont(font);
                cellStyle.setWrapText(true);
                cell.setCellStyle(cellStyle);
            }
        }

        //设置表末尾的备注提示
        Row row = sheet.createRow(outputSize);
        row.setHeight((short) 400);
        Cell cell = row.createCell(1);
        //设置单元格内容
        cell.setCellValue(remark);
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        Font font = workbook.createFont();
        font.setBold(false);
        font.setFontHeight((short) 250);
        font.setColor(IndexedColors.RED.getIndex());

        cellStyle.setFont(font);
        cell.setCellStyle(cellStyle);
    }

}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值