easyExcel自定义导出,指定列,设置请求头背景色,加入合计行,设置合计行字体,背景色等等

效果图

1.引入easyExcel pom

        <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.1</version></dependency>

2.工具类-自定义样式handler-CustomCellWriteHandler

import java.util.HashMap;import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.util.BooleanUtils;
import com.alibaba.excel.write.handler.AbstractCellWriteHandler;
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
/*** easyexcel自定义行列样式* 表头背景色,合计行背景色-字体颜色,* @author cf** @date 2023-11-28 11:18:23*/
public class CustomCellWriteHandler extends AbstractCellWriteHandler {// 字体颜色private Short colorIndex;// 背景颜色private Short bgColorIndex;// 行,以及对应的列,多个列逗号拼接,全列,-1private HashMap<Integer, String> rowColMap;/*** * @param bgColorIndex -1 不设置* @param colorIndex   -1 不设置* @param rowColMap    value = -1,整行*/public CustomCellWriteHandler(Short bgColorIndex, Short colorIndex, HashMap<Integer, String> rowColMap) {this.colorIndex = colorIndex;this.bgColorIndex = bgColorIndex;this.rowColMap = rowColMap;}@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {// 设置行高int rowIndex = row.getRowNum();System.out.println("当前行: " + rowIndex);short height = 600;row.setHeight(height);}@Overridepublic void afterCellDispose(CellWriteHandlerContext context) {Cell cell = context.getCell();int rowIndex = cell.getRowIndex();int cellIndex = cell.getColumnIndex();// 自定义宽度处理// 自定义样式处理// 当前事件会在 数据设置到poi的cell里面才会回调// 判断不是头的情况 如果是fill 的情况 这里会==null 所以用not trueBoolean head = context.getHead();if (BooleanUtils.isNotTrue(head)) {// 指定行 列设置背景色if (null != rowColMap && rowColMap.get(rowIndex) != null && !rowColMap.get(rowIndex).equals("-1")&& rowColMap.get(rowIndex).contains(cellIndex + "")) {setCellStyle(context, cell);// 某几行设置背景色} else if (null != rowColMap && rowColMap.get(rowIndex) != null && rowColMap.get(rowIndex).equals("-1")) {setCellStyle(context, cell);}
//            if (cell.getColumnIndex() == 8 && cell.getStringCellValue().contains("已通过")) {
//                // 拿到poi的workbook
//                Workbook workbook = context.getWriteWorkbookHolder().getWorkbook();
//                // 这里千万记住 想办法能复用的地方把他缓存起来 一个表格最多创建6W个样式
//                // 不同单元格尽量传同一个 cellStyle
//                CellStyle cellStyle = workbook.createCellStyle();
//                cellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex());
//                // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND
//                cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//                cell.setCellStyle(cellStyle);
//                // 由于这里没有指定dataformat 最后展示的数据 格式可能会不太正确
//                // 这里要把 WriteCellData的样式清空, 不然后面还有一个拦截器 FillStyleCellWriteHandler 默认会将 WriteCellStyle 设置到
//                // cell里面去 会导致自己设置的不一样(很关键)
//                context.getFirstCellData().setWriteCellStyle(null);
//            } } else {// 表头}}private void setCellStyle(CellWriteHandlerContext context, Cell cell) {Workbook workbook = context.getWriteWorkbookHolder().getWorkbook();Font font = workbook.createFont();font.setFontName("宋体");font.setBold(true);if (colorIndex >= 0) {font.setColor(colorIndex);}
//		font.setFontHeightInPoints((short)11);CellStyle cellStyle = workbook.createCellStyle();cellStyle.setFillForegroundColor(bgColorIndex);if (bgColorIndex >= 0) {cellStyle.setFillForegroundColor(bgColorIndex);}// 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUNDcellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);cellStyle.setFont(font);cellStyle.setAlignment(HorizontalAlignment.CENTER);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellStyle.setBorderBottom(BorderStyle.MEDIUM);cellStyle.setBorderLeft(BorderStyle.MEDIUM);cellStyle.setBorderRight(BorderStyle.MEDIUM);cellStyle.setBorderTop(BorderStyle.MEDIUM);// 样式写入单元格cell.setCellStyle(cellStyle);// 由于这里没有指定dataformat 最后展示的数据 格式可能会不太正确// 这里要把 WriteCellData的样式清空, 不然后面还有一个拦截器 FillStyleCellWriteHandler 默认会将// WriteCellStyle 设置到// cell里面去 会导致自己设置的不一样context.getFirstCellData().setWriteCellStyle(null);}/*** 表头背景色等设置* * @return*/public static HorizontalCellStyleStrategy getStyleStrategy() {// 头的策略WriteCellStyle headWriteCellStyle = new WriteCellStyle();// 设置对齐// headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);// 背景色, 设置为绿色,也是默认颜色headWriteCellStyle.setFillForegroundColor(IndexedColors.CORNFLOWER_BLUE.getIndex());// 字体// WriteFont headWriteFont = new WriteFont();// headWriteFont.setFontHeightInPoints((short) 12);// headWriteCellStyle.setWriteFont(headWriteFont);// 内容的策略WriteCellStyle contentWriteCellStyle = new WriteCellStyle();// 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了// FillPatternType所以可以不指定// contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);// 背景绿色contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE1.getIndex());// 字体策略WriteFont contentWriteFont = new WriteFont();// contentWriteFont.setFontHeightInPoints((short) 12);contentWriteCellStyle.setWriteFont(contentWriteFont);// 设置 自动换行contentWriteCellStyle.setWrapped(true);// 设置 垂直居中contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 设置 水平居中contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 设置边框样式contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);contentWriteCellStyle.setBorderTop(BorderStyle.THIN);contentWriteCellStyle.setBorderRight(BorderStyle.THIN);contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);// 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle,contentWriteCellStyle);return horizontalCellStyleStrategy;}
}

3.工具类-导出  ExcelUtils

package com.yintong.xgj.common.util.excel;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Set;import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.springframework.beans.BeanUtils;
import org.springframework.web.multipart.MultipartFile;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.util.DateUtils;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.alibaba.excel.write.metadata.fill.FillWrapper;/*** excel工具类**/
public class ExcelUtils {/*** Excel导出** @param response  response* @param fileName  文件名* @param sheetName sheetName* @param list      数据List* @param pojoClass 对象Class* @param columns   自定义列表*/public static void exportExcel(HttpServletResponse response, String fileName, String sheetName, List<?> list,Class<?> pojoClass, Set<String> columns) throws IOException {if (StringUtils.isBlank(fileName)) {// 当前日期fileName = DateUtils.format(new Date());}response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("UTF-8");fileName = URLEncoder.encode(fileName, "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");// 写入合计行样式;默认表头只有一行
//        TotalRowHandler totalRowHandler = new TotalRowHandler(list.size());// 指定行列HashMap<Integer, String> rowColMap = new HashMap<>();
//        rowColMap.put(1,"1,2");
//        rowColMap.put(2,"2");rowColMap.put(list.size(), "-1");// 合计行,最后一行设置颜色CustomCellWriteHandler totalRowHandler = new CustomCellWriteHandler((short) -1, IndexedColors.RED.index,rowColMap);if (columns != null && columns.size() > 0) {// 自定义列EasyExcel.write(response.getOutputStream(), pojoClass).includeColumnFieldNames(columns).registerWriteHandler(CustomCellWriteHandler.getStyleStrategy()).registerWriteHandler(totalRowHandler).sheet(sheetName).doWrite(list);} else {EasyExcel.write(response.getOutputStream(), pojoClass).registerWriteHandler(CustomCellWriteHandler.getStyleStrategy()).registerWriteHandler(totalRowHandler).sheet(sheetName).doWrite(list);}}/*** Excel导出,先sourceList转换成List<targetClass>,再导出** @param response    response* @param fileName    文件名* @param sheetName   sheetName* @param sourceList  原数据List* @param targetClass 目标对象Class*/public static void exportExcelToTarget(HttpServletResponse response, String fileName, String sheetName,List<?> sourceList, Class<?> targetClass, Set<String> columns) throws Exception {List<Object> targetList = new ArrayList<Object>(sourceList.size());for (Object source : sourceList) {Object target = targetClass.newInstance();BeanUtils.copyProperties(source, target);targetList.add(target);}exportExcel(response, fileName, sheetName, targetList, targetClass, columns);}/*** 导入* * @param file* @param targetClass* @return* @throws Exception*/public static List<Object> importExcelToTarget(MultipartFile file, Class<?> targetClass) throws Exception {List<Object> list = EasyExcel.read(file.getInputStream()).head(targetClass).sheet().doReadSync();return list;}}

4.demo

实体

import java.math.BigDecimal;
import java.util.Date;import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.HeadStyle;
import com.yintong.xgj.entity.enums.TypeStateConvert;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;@Data
@ApiModel(value = "采购入库导出", description = "")
@HeadStyle(fillBackgroundColor = 24)
public class GoodsInExcel {@ApiModelProperty(value = "工单号")@ExcelProperty(value = "工单号")private String orderNo;@ApiModelProperty(value = "时间" )@ExcelProperty(value = "时间" )@ColumnWidth(20)@DateTimeFormat(value = "yyyy-MM-dd HH:mm:ss")private Date actionTime;@ApiModelProperty(value = "单据类型")@ExcelProperty(value = "单据类型" ,converter = TypeStateConvert.class)@ColumnWidth(15)private Integer typeState;@ApiModelProperty(value = "配件编码")@ExcelProperty(value = "配件编码")@ColumnWidth(15)private String postionNumber;@ApiModelProperty(value = "配件名称")@ExcelProperty(value = "配件名称")@ColumnWidth(15)private String gname;@ApiModelProperty(value = "规格")@ExcelProperty(value = "规格")private String spec;@ApiModelProperty(value = "单位")@ExcelProperty(value = "单位")private String unit;@ApiModelProperty(value = "数量")@ExcelProperty(value = "数量")private BigDecimal numbers;@ApiModelProperty(value = "单价")@ExcelProperty(value = "单价")private BigDecimal cost;@ApiModelProperty(value = "金额")@ExcelProperty(value = "金额")private BigDecimal price;@ApiModelProperty(value = "供应商")@ExcelProperty(value = "供应商")private String ftname;@ApiModelProperty(value = "采购人")@ExcelProperty(value = "采购人")private String acUserName;@ApiModelProperty(value = "备注")@ExcelProperty(value = "备注")@ColumnWidth(30)private String des;public GoodsInExcel() {};
}

接口

    @ApiOperation(value = "导出",response = GoodsInExcel.class)@GetMapping("inPageExport")@Permit(permit = "inPageExport")public void inPageExport(HttpServletResponse response,GoodsRecordQuery data,String columns) throws Exception {//查询数据List<Object> list = recordsService.exportList(data);//设置自定义导出列Set<String> hashSet = new HashSet<>();if (columns != null) {hashSet.addAll(Arrays.asList(columns.split(",")));}//获取或者计算合计行数据BigDecimal reduce = list.stream().map(gr ->{return gr.getNumbers();}).reduce(BigDecimal.ZERO, BigDecimal::add);BigDecimal reduce1 = list.stream().map(gr ->{return gr.getPrice();}).reduce(BigDecimal.ZERO, BigDecimal::add);GoodsRecord hj = new GoodsRecord();hj.setPrice(reduce1);hj.setNumbers(reduce);hj.setOrderNo("合计");//加入到导出数据最后一行list.add(hj);//调用工具类导出接口ExcelUtils.exportExcelToTarget(response, "明细表", "明细", list, GoodsInExcel.class,hashSet);}

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

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

相关文章

信号分析仪-4024CA频谱分析仪 频率范围9kHz~9GHz

01 4024CA频谱分析仪 产品综述&#xff1a; 4024CA频谱分析仪是一款专为外场测试而设计的大宽带手持式实时频谱分析仪&#xff0c;最大实时分析带宽达到120MHz&#xff0c;具有实时频谱分析、5G NR解调分析、LTE FDD/TDD解调分析、GSM/EDGE解调分析、定向分析等多种测量功能…

QT6 Creator编译KDDockWidgets并部署到QT

为什么使用KDDockWidgets 为什么使用KDDockWidgets呢&#xff1f; 首先它是一个优秀的开源dock库&#xff0c;弥补QDockWidget的不足&#xff0c;详情见官网。 其次它支持QML&#xff0c;这是我最终选择这个dock库的主要原因&#xff0c;因为最近在考虑将前端界面用QML做&…

SSM训练营管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 训练营管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系 统主要采用B/S模…

金字塔原理

金字塔原理 来自于麦肯锡公司的第一位女性咨询顾问芭芭拉•明托的著作《金字塔原理》。 原理介绍 此原理是一种重点突出、逻辑清晰、主次分明的逻辑思路、表达方式和规范动作。 金字塔的基本结构是&#xff1a;中心思想明确&#xff0c;结论先行&#xff0c;以上统下&#xff…

Maven——坐标和依赖

Maven的一大功能是管理项目依赖。为了能自动化地解析任何一个Java构件&#xff0c;Maven就必须将它们唯一标识&#xff0c;这就依赖管理的底层基础——坐标。将详细分析Maven坐标的作用&#xff0c;解释其每一个元素&#xff1b;在此基础上&#xff0c;再介绍如何配置Maven&…

Unity中Shader的BRDF解析(四)

文章目录 前言一、BRDF 中的 IBL二、解析一下其中的参数1、光照衰减系数 &#xff1a;surfaceReduction2、GI镜面反射在不同角度下的强弱 &#xff1a;gi.specular * FresnelLerp (specColor, grazingTerm, nv);在BRDF中&#xff0c;IBL&#xff08;Image Based Light&#xff…

【人工智能】人工智能的技术研究与安全问题的深入讨论

前言 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。 它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是新一轮科技革命和产业变革的重要驱动力量。 &#x1f4d5;作者简介&#x…

波兰边缘计算初创公司获得450w欧元融资

边缘计算社区获悉&#xff0c;近期&#xff0c;波兰边缘计算初创公司CTHINGS.CO 获得450w欧元A轮融资。 以下是官方声明&#xff1a; CTHINGS.CO 获得 2000 万兹罗提&#xff08;约450 万欧元&#xff09;用于国际扩张。此轮融资涉及 ORLEN VC、PKO VC、Freya Capital 和现有投…

embeddings

“embeddings”的中文翻译是“嵌入”或“嵌入向量”。在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;通常被称为“词向量”或“词嵌入”&#xff0c;它是表示词汇或令牌的一种方式&#xff0c;通过将这些词汇或令牌映射到一个向量空间中的点&#xff0c;以捕捉它们…

「Verilog学习笔记」整数倍数据位宽转换8to16

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 根据时序图&#xff0c;数据是在第二个数据到来之后输出&#xff0c;当仅有一个数据到来时&#xff0c;不产生输出&#xff0c;所以内部需要一个指示信号valid_cnt&#xf…

VMware虚机重启后静态IP不生效

配置好一套虚机之后&#xff0c;因为重启电脑&#xff0c;导致虚机的静态ip配置不生效&#xff0c;xshell连接不上虚机。以下是自查和解决方案&#xff1a; 1.使用su -进入root用户 2.查看打开虚机的teminal窗口查看配置的ip文件&#xff1a;vim /etc/sysconfig/network-script…

N8975A/安捷伦Agilent N8975A噪声系数分析仪

181/2461/8938产品概述N8975A是一款高性能噪声系数分析仪 用于进行快速、准确且可重复的噪声系统测量。 N8975A易用的特性能将复杂的测量简单化并让您获得值得信任的可重复且可靠的测量结果。 N8975A可同时提供噪声系数和增益测量&#xff0c;并可以多种格式查看、打印和保存…

学习知识随笔(Django)

文章目录 MVC与MTV模型MVCMTV Django目录结构Django请求生命周期流程图路由控制路由是什么路由匹配反向解析路由分发 视图层视图函数语法reqeust对象属性reqeust对象方法 MVC与MTV模型 MVC Web服务器开发领域里著名的MVC模式&#xff0c;所谓MVC就是把Web应用分为模型(M&#…

2023-简单点-yolox-pytorch代码解析(一)-nets/darknet.py

yolox-pytorch: nets/darknet.py yolox网络结构yolox-pytorch目录今天解析注释net/darknet.pyFocusBaseConvDWConvSPPBottleneckDarknet未完待续。。。 yolox网络结构 yolox-pytorch目录 今天解析注释net/darknet.py #!/usr/bin/env python3 # 指定使用python3来执行此脚本 …

主要分布式文件系统架构对比分析:GFS vs. Tectonic vs. JuiceFS

随着技术的进步和数据的不断爆炸&#xff0c;传统的磁盘文件系统已经暴露出它们的局限性。为了满足不断增长的存储需求&#xff0c;分布式文件系统作为动态且可扩展的解决方案应运而生。在本文中&#xff0c;我们探讨了三种代表性分布式文件系统的设计原则、创新和解决的挑战&a…

SEO工具-免费功能最全的5款SEO工具

随着互联网的蓬勃发展&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为许多企业和个人网站必备的关键技能。然而&#xff0c;对于初学者或者运营小型网站的人来说&#xff0c;使用专业的SEO工具可能涉及较高的成本。在这篇文章中&#xff0c;我们将向您推荐五款高…

西南科技大学模拟电子技术实验二(二极管特性测试及其应用电路)预习报告

目录 一、计算/设计过程 二、画出并填写实验指导书上的预表 三、画出并填写实验指导书上的虚表 四、粘贴原理仿真、工程仿真截图 一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入…

基于单片机的烟雾检测报警装置(论文+源码)

1.系统设计 &#xff08;1&#xff09;利用传感器实现环境中温度、烟雾浓度的实时检测&#xff1b; &#xff08;2&#xff09;系统检测的各项数据信息通过液晶模块进行显示&#xff0c;提高设计可视化&#xff1b; &#xff08;3&#xff09;系统可以根据实际情况利用按键模…

Mysql单表查询练习

一、单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker (部门号 int(11) NOT NULL,职工号 int(11) NOT NULL,工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10…

双十二有什么好物是值得推荐?智能家居好物推荐

都知十一月份跟十二月份都有两个大促的时间&#xff0c;那就是双十一跟双十二&#xff0c;距离双十一过去已经半个月了&#xff0c;是不是还有很多朋友在双十一的时候也没有买尽兴&#xff0c;别慌&#xff01;错过了双十一咱还有双十二&#xff0c;双十二的优惠力度也不会低于…