EasyExcel生成多sheet页的excel

news/2024/7/21 4:25:59 标签: excel, java

一、controller层

java">@ApiOperation(value = "明细查询导出")
@PostMapping(value = "/SummaryDetailExport")
public void summaryDetailExport(@RequestBody SearchDTO dto, HttpServletResponse response) throws IOException {
    reportService.deptPackagingSummaryDetailExport(dto, response);
}

二、serviceimpl

java">@Override
    public void deptPackagingSummaryDetailExport(SearchDTO dto, HttpServletResponse response) throws IOException {
        // 这里必须指定需要头,table 会继承sheet的配置,sheet配置了不需要,table 默认也是不需要
        List<DeptSummaryReq> exportVos = configPackageTaskMapper.DeptPackagingSummary(dto);
        DecimalFormat df = new DecimalFormat("#.00");
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("科室打包明细查询" + ".xlsx", "UTF-8"));
        ServletOutputStream outputStream = response.getOutputStream();
        ExcelWriter excelWriter = EasyExcel.write(outputStream).build();
        //在根据科室id去查询有哪些包,以及价格
        for (int i = 0; i < exportVos.size(); i++) {
            dto.setDeptId(exportVos.get(i).getDeptId());
            List<DeptSummaryReq> detail = configPackageTaskMapper.queryDeptPackagingDetailBydeptId(dto);
            for (DeptSummaryReq regDetail : detail) {
                if (regDetail.getPrice() == null) {
                    regDetail.setAmount(0.00);
                    regDetail.setPrice(0.00);
                } else {
                    regDetail.setAmount(BigDecimal.valueOf(regDetail.getPrice()).multiply(BigDecimal.valueOf(regDetail.getPackageCount())).doubleValue());
                }
            }

            DeptSummaryReq regDetail1 = new DeptSummaryReq();
            regDetail1.setPackageCode(dto.getStartTime() + "    " + dto.getEndTime() + "    打印时间:" + DateUtil.now());
            DeptSummaryReq regDetail2 = new DeptSummaryReq();
            if (dto.getPackageType() == null) {
                List<String> typeName = recoverPackagesMapper.queryPackageType();
                regDetail2.setPackageCode("包类型:" + String.join(",", typeName));
            } else {
                regDetail2.setPackageCode("包类型:" + String.join(",", dto.getPackageName()));
            }
            DeptSummaryReq regDetail = new DeptSummaryReq();
            regDetail.setPackageCode("科室数量合计:    " + detail.stream().mapToInt(DeptSummaryReq::getPackageCount).sum()
                    + "       科室金额合计:   ¥" + Double.valueOf(df.format(detail.stream().mapToDouble(DeptSummaryReq::getAmount).sum())));
            detail.add(regDetail);
            detail.add(regDetail1);
            detail.add(regDetail2);
            //创建合并策略
            //这里我们上面手动给我们的list添加了3条数据
            //这3天数据是需要合并单元格显示的,所以我们这里需要new 3个OnceAbsoluteMergeStrategy
            // 前面2个数字代表的是行,后面两个代表从那一列开始,到那一列结束
            //比如我们要展示五个字段,那么就是0,4;从0开始到4就一共5列
            OnceAbsoluteMergeStrategy onceAbsoluteMergeStrategy = new OnceAbsoluteMergeStrategy(detail.size() + 1, detail.size() + 1, 0, 4);
            OnceAbsoluteMergeStrategy onceAbsoluteMergeStrategy1 = new OnceAbsoluteMergeStrategy(detail.size(), detail.size(), 0, 4);
            OnceAbsoluteMergeStrategy onceAbsoluteMergeStrategy2 = new OnceAbsoluteMergeStrategy(detail.size() - 1, detail.size() - 1, 0, 4);

            //创建一个sheet
            WriteSheet writeSheet = EasyExcel.writerSheet(i, exportVos.get(i).getDeptName())
                    .head(DeptPackagingSummaryDetailExcel.class)
                    //.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                    .registerWriteHandler(ExcelUtil.writeCenterStyle())
                    .registerWriteHandler(onceAbsoluteMergeStrategy)
                    .registerWriteHandler(onceAbsoluteMergeStrategy1)
                    .registerWriteHandler(onceAbsoluteMergeStrategy2)
                    .build();

            //将sheet写入excelwriter
            excelWriter.write(detail, writeSheet);
        }
        if (excelWriter != null) {
            excelWriter.finish();
        }
    }

三、entity

DeptSummaryReq
java">import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentStyle;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import com.alibaba.excel.annotation.write.style.HeadStyle;
import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
import com.cloud.common.core.annotation.ExcelParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

@Data
@ColumnWidth(25)//设置列宽
@HeadRowHeight(20)//设置行高
@EqualsAndHashCode
@HeadStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER)//表头样式
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER)//内容样式
@ApiModel(value="DeptSummaryReq", description="导出出参")
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DeptSummaryReq {
    private static final long serialVersionUID=1L;

    @ApiModelProperty(value = "包编码")
    @ExcelProperty({"明细报表", "包编码"})
    private String packageCode;

    @ApiModelProperty(value = "包名称")
    @ExcelProperty({"明细报表", "包名称"})
    private String packageName;

    @ApiModelProperty(name = "数量")
    @ExcelProperty({"明细报表", "数量"})
    private int packageCount;

    @ApiModelProperty(name = "单价")
    @ExcelProperty({"明细报表", "单价"})
    private Double price;

    @ApiModelProperty(name = "金额")
    @ExcelProperty({"明细报表", "金额"})
    private Double  amount;

    @ApiModelProperty(name = "科室id")
    @ExcelIgnore
    private Integer deptId;

    @ApiModelProperty(name = "科室名称")
    @ExcelIgnore
    private String deptName;

}

四、效果

在这里插入图片描述


http://www.niftyadmin.cn/n/5219084.html

相关文章

智能物流时代:快递物流信息订阅与推送API自动推送物流变更信息

引言 在当今数字化和智能化的时代&#xff0c;物流行业也在迅速演变&#xff0c;通过技术创新提高效率、提升服务质量。其中&#xff0c;快递物流信息订阅与推送API的自动推送功能成为推动物流领域发展的重要驱动力。本文将深入探讨这一趋势&#xff0c;并分析快递物流信息订阅…

TikTok小店运营秘籍:打造有温度的社交电商

引言 TikTok作为全球短视频平台的领军者&#xff0c;日渐成为创业者和小商家的新天地。通过TikTok小店&#xff0c;创业者们可以将独特的产品呈现给全球观众。 然而&#xff0c;要在这个竞争激烈的市场中脱颖而出&#xff0c;不仅需要敏锐的商业嗅觉&#xff0c;还需要打造一个…

Linux 挂载文件系统为可读写 mount -uw / 和 mount -o remount,rw /

Linux 挂载文件系统为可读写 mount -uw / 和 mount -o remount,rw / 在挂载文件系统为可读写时&#xff0c;我发现一个问题&#xff0c;有时用mount -uw /就可以把文件系统挂载成可写的状态。但有时就会发生 “read-only file system” 的错误&#xff0c;这时我用mount -o re…

一个GPU版本的遗传算法迭代xgboost最优参数的示例,这里用的是自定义损失函数

一个简单的遗传算法迭代xgboost最优参数的示例&#xff0c;这里用的是自定义损失函数 import pandas as pd import numpy as np import xgboost as xgb from sko.GA import GA from sklearn.model_selection import train_test_split from sklearn.linear_model import Logisti…

蓝桥杯官网练习题(平均)

问题描述 有一个长度为 n 的数组&#xff08; n 是 10 的倍数&#xff09;&#xff0c;每个数 ai 都是区间 [0,9] 中的整数。小明发现数组里每种数出现的次数不太平均&#xff0c;而更改第 i 个数的代价为 bi&#xff0c;他想更改若干个数的值使得这 10 种数出现的次数相等…

C++学习之值传递

c/c中存在三种传值方式&#xff0c;在局部函数中&#xff0c;对这三种传值方式传入的参数进行修改&#xff0c;会得到不同的结果。具体见下例&#xff1a; #include <stdlib.h> #include <stdio.h>static int dummny 10000;// 传值(传过来的是原始值的副本&#…

数据库系统原理与实践 笔记 #10

文章目录 数据库系统原理与实践 笔记 #10存储管理与索引(续)数据字典存储系统元数据的关系表示 数据缓冲区存储访问缓冲区管理器缓冲区替换策略 顺序索引基本概念索引技术评价指标顺序索引稠密索引稀疏索引索引多级索引辅助索引主索引与辅助索引多码索引 B树索引B树索引文件B树…

探索人类命运与宇宙奥秘的震撼之旅 豆瓣高分巨作《三体》湖北卫视开播

当思考触及宇宙的边缘&#xff0c;当人类命运与外星文明相碰撞&#xff0c;电视剧《三体》以其深邃的内涵和引人深思的故事&#xff0c;重新审视人类的过去、现在和未来&#xff0c;带我们逐步揭开地外未知文明“三体”世界的神秘面纱。根据著名科幻作家刘慈欣同名小说改编&…