EasyExcel生成多sheet页的excel

一、controller层

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

二、serviceimpl

@Overridepublic 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);//创建一个sheetWriteSheet 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写入excelwriterexcelWriter.write(detail, writeSheet);}if (excelWriter != null) {excelWriter.finish();}}

三、entity

DeptSummaryReq
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")@ExcelIgnoreprivate Integer deptId;@ApiModelProperty(name = "科室名称")@ExcelIgnoreprivate String deptName;}

四、效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/234514.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python函数装饰器的用法

Python函数装饰器的用法 文章目录 1.装饰器的优点2. 使用装饰器前3. 使用装饰器后 装饰器是Python中一种强大的语法特性&#xff0c;它允许在不修改已有代码的情况下&#xff0c;对函数或类进行增强或修改。装饰器的本质是一个函数&#xff0c;它接受一个函数作为参数&#xf…

软件测试面试最全八股文

请你说一说测试用例的边界 参考回答&#xff1a; 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充&#xff0c;这种情况下&#xff0c;其测试用例来自等价类的边界。 常见的边界值 1)对16-bit 的整数而言 32…

故障排查:rpm安装报错事务锁定(can‘t create transaction lock on /var/lib/rpm/.rpm.lock)

博客主页&#xff1a;https://tomcat.blog.csdn.net 博主昵称&#xff1a;农民工老王 主要领域&#xff1a;Java、Linux、K8S 期待大家的关注&#x1f496;点赞&#x1f44d;收藏⭐留言&#x1f4ac; 目录 故障详情故障原因解决办法 故障详情 自己编写spec文件&#xff0c;制…

《C++ Primer》第10章 算法(二)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 10.4 再探迭代器&#xff08;P357&#xff09; 除了为每个容器定义的迭代器外&#xff0c;头文件 iterator 中还定义了额外的几种迭代器&#xff1a; 插入迭代器&#xff08;insert iterator&#xff09;&…

AMESim与MATLAB联合仿真demo

本文是AMESim与MATLAB联合仿真的demo&#xff0c;记录一下如何进行联合仿真。 AMESim与MATLAB联合仿真可以大幅度提高工作效率。 author&#xff1a;xiao黄 缓慢而坚定的生长 csdn:https://blog.csdn.net/Python_Matlab?typeblog主页传送门 博主的联合仿真环境如下&#xff…

数字图像处理(实践篇)十五 基于傅里叶变换的高通滤波和低通滤波

目录 一 Numpy 实现傅里叶变换 1 涉及的函数 2 实践 二 OpenCV 实现傅里叶变换 1 涉及的函数 2 实践 为了有效地和快速地对图像进行处理和分析&#xff0c;常常需要将原定义在图像空间的图像以某种形式转换&#xff08;正变换&#xff09;到另外一些空间&#xff0c;并利…

物业报修管理系统

物业报修管理系统是一种能够提高物业管理效率和服务质量的软件&#xff0c;它可以帮助物业公司和业主之间实现快速、方便、高效的报修沟通和处理。 但是很多物业公司还在使用传统的报修方式&#xff0c;比如电话、纸质表格、微信群等&#xff0c;这些方式存在很多问题&#xff…

Linux系统编程:进程总结

这一章主要为进程的基本内容作一个总结&#xff0c;为后面的多进程多线程并发作一个铺垫。 进程标识符pid pid类型为 pid_t。 在涉及有关进程相关内容的时候&#xff0c;一定要熟悉 ps 命令的使用&#xff0c;该命令专门用来打印当前系统的进程信息&#xff1a; 这里经常使用…

【Python数据结构与算法】--- 递归算法的应用 ---[乌龟走迷宫] |人工智能|探索扫地机器人工作原理

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:PYTHON数据结构与算法学习系列专栏&#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 导言 解决过程 1.建立数据结构 2.探索迷宫: 算法思路 递归调用的“基本结束条件” 3.乌龟走迷宫的实现代码: …

【MATLAB源码-第92期】基于simulink的QPSK调制解调仿真,采用相干解调对比原始信号和解调信号。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 QPSK&#xff0c;有时也称作四位元PSK、四相位PSK、4-PSK&#xff0c;在坐标图上看是圆上四个对称的点。通过四个相位&#xff0c;QPSK可以编码2位元符号。图中采用格雷码来达到最小位元错误率&#xff08;BER&#xff09; —…

Electronica慕尼黑电子展 Samtec团队与21ic分享虎家产品与方案

【摘要/前言】 “希望但凡是能够使用到连接器的场合都有Samtec的身影” 在慕尼黑上海电子展现场&#xff0c;Samtec华东区销售经理章桢彦先生在与21ic副主编刘岩轩老师的采访中&#xff0c;如是说道。这是一种愿景&#xff0c;更是Samtec的努力方向。短短一句话&#xff0c;…

​[Oracle]编写程序,键盘输入n,计算1+前n项之和。测试案例:输入:10 输出:22.47​

编写程序&#xff0c;键盘输入n,计算1前n项之和。 测试案例&#xff1a; 输入&#xff1a;10 输出&#xff1a;22.47 代码如下&#xff1a; set serveroutput on declare v_sum number:0;v_n number;beginv_n:&n;for i in 1..v_n loopv_sum:v_sumsqrt(i); end loop; d…