Spring Boot结合easyExcel 三种方式实现自增序号

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

  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 结果

在这里插入图片描述

三、查询数据后遍历,写入序号

对查询出的数据通过AtomicInteger 递增

List<ExcelVO> list = this.baseMapper.list(dto);
AtomicInteger index = new AtomicInteger(1);
list.forEach(vo-> {
    // 序号递增
    vo.setIndex(index.getAndIncrement());
});
  • 11
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring BootEasyExcel可以很好地结合使用,来实现Excel文件的读写操作。下面是一个简单的示例代码,演示如何在Spring Boot项目中使用EasyExcel进行Excel文件的读写: 1. 首先,在pom.xml文件中添加EasyExcel的依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.10</version> </dependency> ``` 2. 创建一个Excel读写的服务类,例如ExcelService: ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.metadata.Sheet; import com.alibaba.excel.metadata.Table; import org.springframework.stereotype.Service; import java.util.List; @Service public class ExcelService { // 读取Excel文件 public List<User> readExcel(String filePath) { return EasyExcel.read(filePath).head(User.class).sheet().doReadSync(); } // 写入Excel文件 public void writeExcel(String filePath, List<User> userList) { ExcelWriter excelWriter = EasyExcel.write(filePath).build(); Sheet sheet = new Sheet(1, 0, User.class); excelWriter.write(userList, sheet); excelWriter.finish(); } } ``` 3. 创建一个User实体类,对应Excel中的每一行数据: ```java public class User { private String name; private Integer age; // Getters and setters... } ``` 4. 在控制器中注入ExcelService,并通过调用其方法来实现Excel的读写操作。 ```java @RestController public class ExcelController { @Autowired private ExcelService excelService; // 读取Excel文件 @GetMapping("/readExcel") public List<User> readExcel(@RequestParam String filePath) { return excelService.readExcel(filePath); } // 写入Excel文件 @PostMapping("/writeExcel") public void writeExcel(@RequestParam String filePath, @RequestBody List<User> userList) { excelService.writeExcel(filePath, userList); } } ``` 这样就可以通过访问"/readExcel"接口来读取Excel文件,通过访问"/writeExcel"接口来写入Excel文件。 以上是一个简单的示例,你可以根据实际需求进行相应的扩展和优化。希望对你有所帮助!如果有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值