Java使用easyExcel生成excel文件直接写入邮件附件并发送

1.引入pom依赖

<!-- 邮箱 -->
  <dependency>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-email</artifactId>
     <version>1.4</version>
    </dependency>
  <!-- easyexcel-->
  <dependency>
     <groupId>cn.afterturn</groupId>
     <artifactId>easypoi-spring-boot-starter</artifactId>
     <version>4.0.0</version>
  </dependency>
  <dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi</artifactId>
     <version>4.1.2</version>
   </dependency>
 

1.创建邮箱是实体类`

import lombok.Data;
import java.util.List;

/**
 * 创建邮箱实体类
 *
 * @author ZL
 */
@Data
public class CreateExcelSendEmailVo<T> {
    /**
     * 生成excel的数据
     */
    private List<T>dataList;

    /**
     * excel的表头
     */
    private List<String> tableHeadList;

    /**
     * 邮件的标题
     */
    private String emailTitle;

    /**
     * 邮件内容
     */
    private String emailContent;

    /**
     * 邮件收件人邮箱,支持多个收件人邮箱
     */
    private List<String> acceptAddressList;
}

2.工具类(这里是两个工具类,别看错了)

import com.alibaba.excel.metadata.BaseRowModel;
import org.springframework.stereotype.Component;

/**
 * @author ZL
 */
@Component
public class ExcelFactory<T extends BaseRowModel> {
 
    public ExportExcelUtil<T> createExportExcel() {
        return new ExportExcelUtil<>();
    }
}



import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.metadata.Table;
import com.alibaba.excel.support.ExcelTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Excel创建工具类
 *
 * @author ZL
 */
@Component
@Slf4j
public class ExportExcelUtil<T extends BaseRowModel> {
    public ExportExcelUtil() {
    }

    /**
     * 创建excel表
     *
     * @param out
     * @param data
     * @param tableHeadList
     * @throws IOException
     */
    public void createExcel(ByteArrayOutputStream out, List<T> data, List<String> tableHeadList) throws IOException {
        try {
            List<List<String>> head = getExcelHead(tableHeadList);

            ExcelWriter writer = new ExcelWriter(null, out, ExcelTypeEnum.XLSX, true);
            Table table = new Table(0);
            table.setHead(head);
            Sheet sheet1 = new Sheet(1, 0);
            sheet1.setAutoWidth(true);
            sheet1.setSheetName("sheet1");
            writer.write(data, sheet1, table);
            writer.finish();
            out.flush();
        } finally {
            if (out != null) {
                out.close();
            }
        }
    }

    /**
     * 创建excel表头
     *
     * @param tableHeadList
     * @return
     */
    private List<List<String>> getExcelHead(List<String> tableHeadList) {
        List<List<String>> head = new ArrayList<List<String>>();
        for (String s : tableHeadList) {
            List<String> column = new ArrayList<String>();
            column.add(s);
            head.add(column);
        }
        return head;
    }

}

3.创建邮箱业务类

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.util.ByteArrayDataSource;
import java.io.ByteArrayInputStream;
import java.util.List;
import java.util.Properties;

/**
 * 创建邮箱业务类
 *
 * @author ZL
 */
@Component
@Slf4j
public class EmailService {
    @Value("${email.userName:null}")
    private String userName;
    @Value("${email.passWord:null}")
    private String passWord;


    /**
     * 消息发送方法
     * @param acceptAddressList
     * @param title
     * @param text
     * @param affixName
     * @param inputstream
     */
    public void sendMsgFileDs(List<String> acceptAddressList, String title, String text, String affixName, ByteArrayInputStream inputstream) {
        Session session = assembleSession();
        Message msg = new MimeMessage(session);
        try {
            msg.setFrom(new InternetAddress(userName));
            msg.setSubject(title);

            Address[] addressArr = acceptAddressList(acceptAddressList);
            msg.setRecipients(Message.RecipientType.TO, addressArr);
            MimeBodyPart contentPart = (MimeBodyPart) createContent(text, inputstream, affixName);//参数为正文内容和附件流
            MimeMultipart mime = new MimeMultipart("mixed");
            mime.addBodyPart(contentPart);
            msg.setContent(mime);
            Transport.send(msg);
        } catch (Exception e) {
           log.error("创建消息失败,{}",e);
        }
    }

    /**
     * 创建邮件消息接收者
     *
     * @param acceptAddressList
     * @return
     */
    public Address[] acceptAddressList(List<String> acceptAddressList) {
        Address[] tos = new InternetAddress[acceptAddressList.size()];
        try {
            for (int i = 0; i < acceptAddressList.size(); i++) {
                tos[i] = new InternetAddress(acceptAddressList.get(i));
            }
        } catch (AddressException e) {
            log.error("创建邮件消息接收者失败,{}",e);
        }
        return tos;
    }

    /**
     * 以QQ邮箱为例,邮箱配置类
     *
     * @return
     */
    public Session assembleSession() {

        String host = "host";
        String mailStoreType = "smtp";
        String popPort = "587";

        final Properties props = new Properties();

        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", host);
        props.put("mail.store.protocol", mailStoreType);
        props.put("mail.smtp.port", popPort);
        //开启SSL
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.socketFactory.port", popPort);
        props.put("mail.smtp.socketFactory.fallback", "false");

        Session session = Session.getDefaultInstance(props, new MyAuthenricator(userName, passWord));
        return session;
    }

    /**
     * 输出的excel文件配置
     *
     * @param content
     * @param inputstream
     * @param affixName
     * @return
     */
    static Part createContent(String content, ByteArrayInputStream inputstream, String affixName) {
        MimeBodyPart contentPart = null;
        try {
            contentPart = new MimeBodyPart();
            MimeMultipart contentMultipart = new MimeMultipart("related");
            MimeBodyPart htmlPart = new MimeBodyPart();
            htmlPart.setContent(content, "text/html;charset=gbk");
            contentMultipart.addBodyPart(htmlPart);
            //附件部分
            MimeBodyPart excelBodyPart = new MimeBodyPart();
            DataSource dataSource = new ByteArrayDataSource(inputstream, "application/excel");
            DataHandler dataHandler = new DataHandler(dataSource);
            excelBodyPart.setDataHandler(dataHandler);
            excelBodyPart.setFileName(MimeUtility.encodeText(affixName));
            contentMultipart.addBodyPart(excelBodyPart);
            contentPart.setContent(contentMultipart);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return contentPart;
    }

    /**
     * 用户名密码验证,需要实现抽象类Authenticator的抽象方法PasswordAuthentication
     * 注意:这里的用户密码不是邮箱登录密码,而是授权码
     */
    static class MyAuthenricator extends Authenticator {
        String u = null;
        String p = null;

        public MyAuthenricator(String u, String p) {
            this.u = u;
            this.p = p;
        }

        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(u, p);
        }
    }
}

4.邮件发送工具类

import com.alibaba.excel.metadata.BaseRowModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.List;
import java.util.Random;

/**
 * 邮件发送工具类
 *
 * @author ZL
 */
@Component
@Slf4j
public class EmailUtil<T extends BaseRowModel> {
    @Autowired
    private ExcelFactory excelFactory;

    @Autowired
    private EmailService emailService;


    /**
     * @Author ZL
     * @Describetion 发送邮件的入口方法
     */
    public void sendEmail(CreateExcelSendEmailVo vo) {
        try {
            log.info("开始发送邮件: {}", vo);
            generateExcelSendEmail(vo.getDataList(), vo.getTableHeadList(), vo.getAcceptAddressList(), vo.getEmailTitle(), vo.getEmailContent());
            log.info("发送邮件成功");
        } catch (Exception e) {
            log.info("发送邮件失败", e);
        }

    }

    /**
     * @Author ZL
     * @Describetion 生成excel并发送邮件
     */
    public void generateExcelSendEmail(List<T> dataList, List<String> tableHeadList, List<String> acceptAddressList, String emailTitle, String content) {
        try {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            String fileName = "email_" + new Random().nextInt(10000) + System.currentTimeMillis() + ".xlsx";
            //生成excel
            excelFactory.createExportExcel().createExcel(out, dataList, tableHeadList);
            // 发送邮件
            emailService.sendMsgFileDs(acceptAddressList, emailTitle, content, fileName, new ByteArrayInputStream(out.toByteArray()));
        } catch (Exception e) {
            log.error("发送邮件时出错:{}", e);
        }
    }
}

4.测试(以上代码可直接使用)

/**
     * 测试
     */
    @Test
    public void test() {
        CreateExcelSendEmailVo vo = new CreateExcelSendEmailVo<>();
        // 1.构建导出数据内容,这里我是查询自己的用户表
        List<Usre> usreList = userService.getUserList;
        vo.setDataList(usreList);
        // 2.设置表头
        List<String> headList = new ArrayList<>();
        headList.add("姓名");
        headList.add("年龄");
        vo.setTableHeadList(headList);
        // 3.设置email的title
        vo.setEmailTitle("测试");
        //4.设置email的内容
        vo.setEmailContent("学生表");
        // 5.设置收件人
        List<String> acceptAddressList = new ArrayList<>();
        acceptAddressList.add("xxx@qq.com");
        vo.setAcceptAddressList(acceptAddressList);
        // 6.发送邮件
        emailUtil.sendEmail(vo);
    }
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值