spring boot导出excel文件报表并发送至邮箱实现步骤

1:pom.xml文件中引入POI相关依赖


        <!--POI报表-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>LATEST</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>LATEST</version>
        </dependency>
        <!--邮件依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

2:配置文件:


# @author 噎翔

spring:
	mail:
	  host: smtp.qq.com #邮箱服务商的protocol服务器主机 #
	  username: 4448956@qq.com #7557*****@qq.com指定邮箱服务商的邮箱账号
	  default-encoding: UTF-8
	  password: jhtkhdbwnobhhi #jwgteykojlf*****邮箱账号密码或者三方登录授权码
	  port: 25

3:controller映射方法


/**
 * @author 噎翔
 * @date 2020/7/27 8:41
 */
    @RequestMapping(value = "/export/v1", method = {RequestMethod.POST})
    public ResponseEntity<?> transactionExport(@RequestBody WithdrawUpdateRequest request) {

        Date startTime = DateUtils.format(request.getStartTime(), "yyyy-MM-dd HH:mm:ss");
        Date endTime = DateUtils.format(request.getEndTime(), "yyyy-MM-dd HH:mm:ss");


        Result<?> result = bizGpoTransactionService.transactionExport(startTime, endTime,request.getEmail());

        return new ResponseEntity<>(result, HttpStatus.OK);
    }

4:查询数据库封装数据

/**
 * @author 噎翔
 * @date 2020/7/27 8:41
 */
@Override
    public Result<?> transactionExport(Date startTime, Date endTime,  String toUser) {
  	  	//封装报表所需数据
        List<Map<String, Object>> List = new ArrayList<>();
        List<GpoTransaction> gpoList = gpoTransactionService.getListByTime(startTime, endTime);
        for (GpoTransaction gpoTransaction : gpoList ) {
            Map<String, Object> bean = new HashMap<>();
            String name = gpoMap.get(gpoTransaction.getGpoId()) == null ? "团组已删除" : gpoMap.get(gpoTransaction.getGpoId()).getName();
            
            //每个map对应excel表中的每一行数据,key用来定位value在哪个格内显示
            bean.put("0", DateUtils.format(gpoTransaction.getCreateTime(), "yyyy-MM-dd HH:mm:ss"));  //结算日期
            bean.put("1", name);                                        //团组名称
            bean.put("2", gpoTransaction.getPrice() / 100);
            bean.put("3", gpoTransaction.getPrice() / 100);
            bean.put("4", gpoTransaction.getPrice() / 100);
            bean.put("5", gpoTransaction.getPrice() / 100);
            bean.put("6", gpoTransaction.getAvailableAmount() / 100);   //余额
            List.add(bean);
        }
        //调用邮件服务,传入数据,创建基于模板文件生成的报表文件,并以附件形式发送到邮箱
        try {
            mailService.sendsd(List, "template.xlsx", toUser);
            return ResultUtils.success();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ResultUtils.error(ResultEnum.ACQ_INVALID_PARAMETER);
    }  

在这里插入图片描述
在这里插入图片描述

5:邮件服务实现流程:

/**
 * @author 噎翔
 * @date 2020/7/27 8:41
 */
@Service
public class MailServiceImpl implements MailService {
	//获取配置文件参数,封装邮件内容是会用到
    @Value("${spring.mail.username}")
    private String userName;
	//将邮件工具放入容器
    @Resource
    private JavaMailSender javaMailSender;
	//定义模板文件所在的相对路径, File.separator表示文件分隔符,可自动适配Windows和Linux系统
    public static String PASH = "src" + File.separator + "main" + File.separator + "resources" + File.separator + "templates" + File.separator;

    @Override
    public Boolean sendsd(List<Map<String, Object>> rtnList, String templateId, String to) throws Exception {
    	//生成随机的报表名
        String dataExcel= UUID.randomUUID().toString() + ".xlsx";
        //读取模板文件(相对路径+模板文件名)
        FileInputStream fileInputStream = new FileInputStream(PASH + templateId);
        XSSFWorkbook excel = new XSSFWorkbook(fileInputStream);
        //创建居中样式
        XSSFCellStyle cellStyle = excel.createCellStyle();
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        //封装数据
        for (int i = 0; i < rtnList.size(); i++) {
            XSSFRow row = excel.getSheetAt(0).createRow(i + 1);
            Map<String, Object> map = rtnList.get(i);
            for (int j = 0; j < map.size(); j++) {
                XSSFCell statTime = row.createCell(j);
                statTime.setCellValue(map.get(j + "").toString());
                statTime.setCellStyle(cellStyle);
            }
        }
        //生成文件
        FileOutputStream fileOutputStream = new FileOutputStream(PASH + dataExcel);
        excel.write(fileOutputStream);
        //刷新
        fileOutputStream.flush();
        //关闭流
        fileOutputStream.close();
        fileInputStream.close();
        //调用下面的sendMail方法,完成有邮件的发送
        sendMail(to, "内容:提现流水", "名头:提现流水", dataExcel);
        return true;
    }

    public void sendMail(String to, String text, String title, String excelName) throws Exception {
    	//新建带附件的邮件内容对象
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
		mimeMessageHelper.setFrom(userName);   //上面取的配置文件中的值,作为发件人
        mimeMessageHelper.setTo(to);			//收件人邮箱
        mimeMessageHelper.setSubject(title);	//标题
        mimeMessageHelper.setText(text);		//邮件正文
        File file = new File(PASH + excelName);	//读取中项目中生成的报表文件
        mimeMessageHelper.addAttachment(excelName, file);//将文件加入附件(附件名,附件)
        //发送邮件
        javaMailSender.send(mimeMessage);
        //删除刚刚生成的报表文件
        file.delete();
    }
}

            

扩展:与上文无关,该代码为将文件传回浏览器,供用户下载保存


            //创建输出流,用于从服务器写数据到客户端浏览器
            ServletOutputStream out = response.getOutputStream();
            response.setContentType("application/vnd.ms-excel"); //代表excel类型为文件类型
            response.setHeader("content-Disposition", "attachment;filename=report.xlsx"); //指定以附件形式进行打开
            excel.write(out);
            out.flush();
            out.close();
            excel.close();
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值