package com.dy.pmsBase.MarkQrCode; import cn.hutool.core.codec.Base64; import com.alibaba.excel.EasyExcel; import com.dy.common.util.QrCodeGenerator; import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.pmsGlobal.util.QrCodeConstant; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.awt.image.BufferedImage; import java.io.File; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; /** * 生成标识类二维码 */ @Slf4j @RestController @RequestMapping(path = "markQrCode") @SuppressWarnings("unchecked")//java版本越高,对泛型约束越严,所以配置SuppressWarnings("unchecked") public class MarkQrCodeCtrl { private static final String fileName = "标识类二维码" ; private static final String sheetName = "标识类二维码" ; /** * 客户端请求得到标识类二维码 * @return */ @GetMapping(path = "show") public BaseResponse> show() { try{ List list = new ArrayList<>() ; Resource resource = new ClassPathResource("/images/logo.png"); File logoPngFile = resource.getFile() ; String[][] marks = QrCodeConstant.Marks() ; for(String[] mark : marks){ ResultVo vo = new ResultVo() ; vo.code = mark[0] ; vo.name = mark[1] ; //vo.code = "1234567890123456789012" ; //BufferedImage bufferedImage = QrCodeGenerator.toBufferedImage(QrCodeGenerator.createBitMatrix(vo.code, 30, 30)); BufferedImage bufferedImage = QrCodeGenerator.toBufferedImage(QrCodeGenerator.createBitMatrix(vo.code, QrCodeConstant.MarkQrCodeWidth, QrCodeConstant.MarkQrCodeHeight)); if(logoPngFile != null && logoPngFile.exists()){ bufferedImage = QrCodeGenerator.addQrCodeLogo(bufferedImage, logoPngFile); } byte[] codes = QrCodeGenerator.bufferedImageToByteArray(bufferedImage, "JPG"); vo.imgBase64 = "data:image/jpeg;base64," + Base64.encode(codes); list.add(vo) ; } return BaseResponseUtils.buildSuccess(list); }catch (Exception e){ log.error("生成标识类二维码时异常", e); return BaseResponseUtils.buildException(e.getMessage()); } } /** * 客户端请求下载标识类二维码的excel文件 * @return */ @GetMapping(path = "download") public void download(HttpServletResponse response){ try{ // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode(MarkQrCodeCtrl.fileName, "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); List list = new ArrayList<>() ; Resource resource = new ClassPathResource("/images/logo.png"); File logoPngFile = resource.getFile() ; String[][] marks = QrCodeConstant.Marks() ; for(String[] mark : marks){ ExcelVo vo = new ExcelVo() ; vo.code = mark[0] ; vo.name = mark[1] ; BufferedImage bufferedImage = QrCodeGenerator.toBufferedImage(QrCodeGenerator.createBitMatrix(vo.code, QrCodeConstant.MarkQrCodeWidth, QrCodeConstant.MarkQrCodeHeight)); if(logoPngFile != null && logoPngFile.exists()){ bufferedImage = QrCodeGenerator.addQrCodeLogo(bufferedImage, logoPngFile); } vo.image = QrCodeGenerator.bufferedImageToByteArray(bufferedImage, "JPG"); list.add(vo) ; } EasyExcel.write(response.getOutputStream(), ExcelVo.class).sheet(MarkQrCodeCtrl.sheetName).doWrite(list); }catch (Exception e){ log.error("下载标识类二维码时异常", e); } } }