Spring Boot结合easyExcel实现自增序号

2023-05-16

有些业务功能要求能导出序号,现在提供两种实现方式。

  1. 通过mysql查询实现;
  2. 实现RowWriteHandler接口,自定义拦截器;
一、通过mysql查询实现

通过自定义变量实现每行数据+1,得到序号。当然在对应的实体里加上sequenceNumber,直接导出即可。

  SELECT    (@rownum := @rownum + 1) AS sequenceNumber,
            memberEvidencedata.*
        FROM
            (
                SELECT evidence_name,merchant_name FROM member_evidence 
            ) AS memberEvidencedata,
            
            ( SELECT @rownum := 0 ) AS rn
    </select>
二、实现RowWriteHandler接口,自定义拦截器

easyExcel提供的接口有RowWriteHandler、CellWriteHandler、SheetWriteHandler和WorkbookWriteHandler拦截器,我们实现RowWriteHandler接口,自定义拦截器。

2.1 自定义行拦截器
package com.meiyuan.food.research.common.utils.easyexcel;


import com.alibaba.excel.write.handler.RowWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.*;

/**
 * 自定义行拦截器
 * @author zj
 * @date 2021/07/08 19:08
 */
public class CustomRowWriteHandler implements RowWriteHandler {

	/**
	 *  序号的样式,与其他列保持一样的样式
	 */
	private CellStyle firstCellStyle;

	private static final String FIRST_CELL_NAME = "序号";
	/**
	 * 列号
	 */
	private int count = 0;

	@Override
	public void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Integer integer, Integer integer1, Boolean aBoolean) {

	}

	@Override
	public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer integer, Boolean aBoolean) {
		// 每一行首列单元格
		Cell cell = row.createCell(0);
		if (firstCellStyle == null) {
			Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
			firstCellStyle = CellStyleUtil.firstCellStyle(workbook);
		}
		//设置列宽  0列 10个字符宽度
		writeSheetHolder.getSheet().setColumnWidth(0, 10 * 256);
		if (row.getRowNum() == 0) {
			cell.setCellValue(FIRST_CELL_NAME);
			cell.setCellStyle(firstCellStyle);
			return;
		}
		cell.setCellValue(++count);
	}
	@Override
	public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer integer, Boolean aBoolean) {

	}
}
2.2 导出添加拦截器
package com.meiyuan.food.research.common.utils.easyexcel;

import com.alibaba.excel.EasyExcel;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;

/**
 * excel工具类
 *
 * @author Zhang Jie
 * @version 1.0.0
 * @since 2021/8/2 15:08
 */
public class ExcelUtils {
	/**
	 * 导出包含序号的excel数据
	 * @param response 响应对象
	 * @param exportData excel数据内容
	 * @param clazz 导出类
	 * @param fileName 文件名称
	 * @throws IOException ex
	 */
	public static  void exportSerialNumber(HttpServletResponse response, List<?> exportData, Class clazz, String fileName) throws IOException {
		response.setContentType("application/vnd.ms-excel");
		response.setCharacterEncoding("utf-8");
		// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
		fileName = URLEncoder.encode(fileName, "UTF-8");
		response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
		EasyExcel.write(response.getOutputStream(), clazz)
				// 添加拦截器
				.registerWriteHandler(new CustomRowWriteHandler())
				.registerConverter(new LocalDateTimeConverter())
				.sheet(fileName).doWrite(exportData);
	}

	/**
	 * 直接导出excel数据
	 * @param response 响应对象
	 * @param exportData excel数据内容
	 * @param clazz 导出类
	 * @param fileName 文件名称
	 * @throws IOException ex
	 */
	public static  void export(HttpServletResponse response, List<?> exportData, Class clazz, String fileName) throws IOException {
		response.setContentType("application/vnd.ms-excel");
		response.setCharacterEncoding("utf-8");
		// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
		fileName = URLEncoder.encode(fileName, "UTF-8");
		response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
		EasyExcel.write(response.getOutputStream(), clazz)
				.registerConverter(new LocalDateTimeConverter())
				.sheet(fileName).doWrite(exportData);
	}
}
2.3 添加“序号”单元格样式
package com.meiyuan.food.research.common.utils.easyexcel;

import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import org.apache.poi.ss.usermodel.*;

/**
 * excel 样式工具类
 * @author zj
 * @date 2021/07/08 19:08
 */
public class CellStyleUtil {

	/**
	 * excel首列序号列样式
	 * @param workbook
	 * @return
	 */
	public static CellStyle firstCellStyle(Workbook workbook) {
		CellStyle cellStyle = workbook.createCellStyle();
		//居中
		cellStyle.setAlignment(HorizontalAlignment.CENTER);
		cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
		cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
		// 灰色
		cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
		//设置边框
		cellStyle.setBorderBottom(BorderStyle.THIN);
		cellStyle.setBorderLeft(BorderStyle.THIN);
		cellStyle.setBorderRight(BorderStyle.THIN);
		cellStyle.setBorderTop(BorderStyle.THIN);
		//文字
		Font font = workbook.createFont();
		font.setBold(Boolean.TRUE);
		cellStyle.setFont(font);
		return cellStyle;
	}
}
2.4 导出实体添加注解

需要导出的列从“orderNumber”开始,index=1,相当于将index=0给到了序号的那列。

@Data
@ApiModel("OrderPageVO")
public class OrderPageVO {
	@ApiModelProperty("订单ID")
	@ExcelIgnore
	private Long id;

	@ApiModelProperty("预订单号")
	@ColumnWidth(18)
	@ExcelProperty(value = "预订单号",index = 1)
	private String orderNumber;

	@ApiModelProperty("预订人姓名")
	@ColumnWidth(15)
	@ExcelProperty(value = "预订人姓名",index = 2)
	private String reserveName;
}
2.5 接口导出数据
@PostMapping(value = "/export")
	@ApiOperation("导出订单列表")
	public void export(@RequestBody OrderPageDTO param,
					   HttpServletResponse response) throws IOException {
		// 最大导出数据为5000
		param.setPageNo(Objects.isNull(param.getPageNo())? 0L:param.getPageNo());
		param.setPageSize(Objects.isNull(param.getPageSize())? 5000L:param.getPageSize());
		PageData<OrderPageVO> page = ordersService.page(param);
		// 直接使用工具导出数据
		ExcelUtils.exportSerialNumber(response, page.getContent(), OrderPageVO.class,"订单列表");
	}
2.6 结果

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot结合easyExcel实现自增序号 的相关文章

随机推荐

  • 网卡接口

    网络接口 网络接口 xff08 以太网 xff09 是硬件接口 xff0c LwIP是软件 xff0c 并且网卡也是由很多种的 LwIP使用一个数据结构 xff0c nitif来描述网卡 用户提供最底层的接口函数 xff0c LwIP则提供
  • 系统扇区

    系统结构 DBR xff0c 主引导记录 xff1b DPT xff0c 分区表 xff1b DBR xff0c 分区引导扇区 引导扇区 MBR Main Boot Record xff0c 主引导扇区 xff0c 硬盘主引导记录区 xff
  • 华为3COM交换机配置命令详解

    1 配置文件相关命令 Quidway display current configuration 显示当前生效的配置 Quidway display saved configuration xff1b 显示flash中配置文件 xff0c
  • 分区结构

    分区结构 DBR xff0c 引导记录区 xff0c 包括一个引导程序和一个BPB xff0c 即本分区参数记录表 系统可直接访问的第一个扇区 xff0c 大小为512个字节 xff08 特殊情况占用其他保留扇区 xff09 512字节中
  • 1. 列表和列表项

    列表和列表项 列表 列表是一个数据结构 xff0c 用来追踪任务 xff0c 列表中有一个指针指向列表项 列表是一个结构体 xff0c 内部携带一个指针 xff0c 指针指向列表项 xff0c 列表项形成双向链式结构挂载在列表下 一个列表下
  • C#简单串口调试助手【傻瓜教程】chanson_chapter01

    简易串口调试助手制作教程 C Winform chanson chapter01 说明 xff1a 本教程基于win10 x64 位操作系统 xff0c 软件环境为Microsoft Visual Studio Community 2015
  • 快速上手Ubuntu之安装篇——安装win7,Ubuntu16.04双系统

    Linux可以说是开发者的系统 xff0c 对于开发者来说 xff0c Linux发行版不仅为我们提供了无数强大的开发工具 xff0c 还能帮助我们从源码上学习操作系统是工作的 而且经常在命令行上工作的我们还能在别人面前耍下酷 Ubuntu
  • SpringBoot中事件的使用

    项目中很多场景可以使用事件来对系统进行解耦 xff0c 让系统更便于维护和扩展 SpringBoot项目默认是支持事件的 xff0c 我们只需要自定义事件 xff0c 然后发布事件 xff0c 之后监听事件处理业务逻辑即可 SpringBo
  • STM32F4串口通信(UART)详解

    UART串口通信 我们在生活中处处都会接触到或者是用到通信 QQ 微信 电话 这些都是最常见的人与人之间远程无线通信的方式 那么也有像红外遥控 蓝牙数据传输等器件或硬件之间的通信 这些通信方式都有一些共同点 无线 易受干扰 信号变差 等 而
  • 高度自定义的简繁转换 VS2022 C++ 工程

    首先秀一下简繁转换结果图 如下 include lt iostream gt include 34 KOpenCC KOpenCCExport h 34 include lt string gt ifdef WIN64 pragma com
  • 关于 make_unique 和 make_shared

    C 43 43 14 才加入make unique xff0c 据说当时忘记实现了 那么C 43 43 11 可以自己实现这个功能 xff1a template lt typename T typename Args gt std uniq
  • 音视频OSD——修改叠加信息的尺寸

    目录 分析 原理 错误想法 思考 代码 c h 效果 分析 在实际场景中 可能出现字模尺寸使用不合理的情况 此时就需要对OSD叠加的信息进行相应的缩放 思路如下 放大 位图中每个点 在YUV图像中画四个点 即放大两倍 缩小 位图中取奇数行或
  • ABAP 常用的系统变量說明

    系统内部有一个专门存放系统变量的结构SYST 其中最常用的系统变量有 SY SUBRC 系统执行某指令后 表示执行成功与否的变量 0 表示成功 SY UNAME 当前使用者登入SAP的USERNAME SY DATUM 当前系统日期 SY
  • 第四次产业革命源于人工智能(趋势…

    第四次产业革命源于人工智能 xff08 趋势解读 20 k字 xff09 秦陇纪10汇编 第四次产业革命源于人工智能 xff08 趋势解读 20 k字 xff09 xff0c 附 数据简化DataSimp 技术描述 学会及社区1k字 欢迎关
  • 无人机开源吊舱+云台+AI芯片级解决方案 (回复“无人机AI方案”下载PDF资料)

    无人机开源吊舱 43 云台 43 AI芯片级解决方案 xff08 回复 无人机AI方案 下载PDF资料 xff09 原创 xff1a 云汉智能 科学Sciences 今天 科学 Sciences 导读 xff1a 无人机开源吊舱 43 云台
  • Ubuntu16.04 远程桌面连接(VNC)

    1 查看我的Ubuntu系统版本 2 客户机win10下载vnc viewer安装 xff1a 下载地址 xff1a https download csdn net download qq 28284093 10387251 点击打开链接
  • Mark一下YOLO检测和跟踪

    主要在看这个 YOLO算法的原理与实现 https blog csdn net xiaohu2022 article details 79211732 E7 AE 97 E6 B3 95 E7 9A 84tf E5 AE 9E E7 8E
  • ROS中的launch文件

    launch文件怎么写 首先 xff0c ROS中的launch文件是自己创建的 xff08 我在ROS包源文件中并没有发现 xff09 接下来是launch文件的编写 xff0c 需要注意 1 xff1a 开头是 lt launch gt
  • Git Submodule管理项目子模块

    使用场景 当项目越来越庞大之后 xff0c 不可避免的要拆分成多个子模块 xff0c 我们希望各个子模块有独立的版本管理 xff0c 并且由专门的人去维护 xff0c 这时候我们就要用到git的submodule功能 常用命令 git cl
  • Spring Boot结合easyExcel实现自增序号

    有些业务功能要求能导出序号 xff0c 现在提供两种实现方式 通过mysql查询实现 xff1b 实现RowWriteHandler接口 xff0c 自定义拦截器 xff1b 一 通过mysql查询实现 通过自定义变量实现每行数据 43 1