目录

一:引入pom依赖

二:完整代码如下(真实可用)


本文章主要是讲述如何使用EasyExcel生成excel文件,并将文件写入到邮件附件中进行邮件发送。

一:引入pom依赖

<!-- 邮件 -->
<dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.7</version>
</dependency>
<!-- excel -->
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.7</version>
</dependency>

二:完整代码如下(真实可用)

有一些地方注意:

1.生成excel和发送邮件本身不属于很必要及时的动作,所以使用了线程池进行异步处理,有消息队列也可。

2.强烈建议类似的功能拆分成独立的模块服务进行部署,因为在后台生成excel写数据很耗费内存,容易导致oom。

3.邮件的附件是有大小限制的,需要注意。

@Data
public class GenerateExcelSendEmailVo<T> {/*** 生成excel的数据*/private List<T> dataList;/*** excel的表头*/private List<String> tableHeadList;/*** 邮件收件人邮箱,支持多个收件人邮箱*/private List<String> acceptAddressList;/*** 邮件的标题*/private String emailTitle;/*** 邮件内容*/private String emailContent;
}
/*** @Author xuhongchang* @Date 2021/3/4  5:38 下午* @Describetion 项目中使用发送邮件*/
@Component
@Slf4j
public class EmailUtil <T extends BaseRowModel>{@Autowiredprivate ExcelFactory excelFactory;@Autowiredprivate EmailService emailService;@Resourceprivate ThreadPoolTaskExecutor threadPool;/*** @Author      xuhongchang* @Date        2021/3/5  10:47 上午* @Describetion 发送邮件的入口方法*/public void sendEmail(GenerateExcelSendEmailVo vo) {Long nanoTime = System.nanoTime();log.info("####开始发送邮件#### : {} -- {}", vo, nanoTime);threadPool.execute(() -> {generateExcelSendEmail(vo.getDataList(), vo.getTableHeadList(), vo.getAcceptAddressList(), vo.getEmailTitle(), vo.getEmailContent());log.info("####发送邮件结束#### : {}", nanoTime);});}/*** @Author xuhongchang* @Date 2021/3/4  11:26 上午* @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";//生成excelexcelFactory.createExportExcel().createExcel(out, dataList, tableHeadList);// 发送邮件emailService.sendMsgFileDs(acceptAddressList, emailTitle, content, fileName, new ByteArrayInputStream(out.toByteArray()));} catch (Exception e) {log.error("发送邮件时报错:{}", e);}}}
@Component
public class ExcelFactory<T extends BaseRowModel> {public ExportExcelUtil<T> createExportExcel() {return new ExportExcelUtil<>();}
}
@Component
@Slf4j
public class EmailService {private String USER_NAME = "";private String PASSWORD = "";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(USER_NAME));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) {e.printStackTrace();}}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) {e.printStackTrace();}return tos;}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);//开启SSLprops.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(USER_NAME, PASSWORD));return session;}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的抽象方法PasswordAuthenticationstatic class MyAuthenricator extends Authenticator {String u = null;String p = null;public MyAuthenricator(String u, String p) {this.u = u;this.p = p;}@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(u, p);}}}
@Slf4j
@Configuration
public class ThreadPoolConfiguration {/*** 发送邮件的线程池* @return*/@Bean("threadPool")public ThreadPoolTaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();// 设置核心线程数executor.setCorePoolSize(20);// 设置最大线程数executor.setMaxPoolSize(128);// 设置队列容量executor.setQueueCapacity(1000);// 设置线程活跃时间(秒)executor.setKeepAliveSeconds(60);// 设置默认线程名称executor.setThreadNamePrefix("发送邮件线程-");// 设置拒绝策略executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());// 等待所有任务结束后再关闭线程池executor.setWaitForTasksToCompleteOnShutdown(true);return executor;}
}

测试类代码如下:

// 测试对象
@Data
public class Student {private String userName;private String address;
}
----------测试----------------------
GenerateExcelSendEmailVo vo = new GenerateExcelSendEmailVo<>();// 1.构建导出数据内容
List<Student> dataList = new ArrayList<>();
Student student = new Student();
student.setUserName("小许");
student.setAddress("上海市 浦东新区");
dataList.add(student);
vo.setDataList(dataList);// 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@163.com");
vo.setAcceptAddressList(acceptAddressList);// 6.发送邮件
emailUtil.sendEmail(vo);
// 补流程缺少的类
@Component
@Slf4j
public class ExportExcelUtil<T extends BaseRowModel> {public ExportExcelUtil() {}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();}}}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;}}

大家有什么疑问,可以在下方留言讨论。

java使用easyExcel生成excel文件直接写入邮件附件并发送相关推荐

  1. java使用poi生成Excel文件并合并单元格

    java使用poi生成Excel文件并合并单元格        业务需要根据 分管部门 字段进行合并,现在提供一种思路. controller层 @Inject(target = "/inf ...

  2. Java 使用EasyExcel导出excel文件

    Java 使用EasyExcel导出excel文件 一.引入pom依赖 二.导出实体 三. 生成excelController 四.效果 一.引入pom依赖 <dependency>< ...

  3. python xlwt写入excel_python xlwt模块生成excel文件并写入数据 xlrd读取数据

    python中一般使用 xlwt (excel write)来生成Excel文件(可以控制单元格格式),用 xlrd 来读取Excel文件,用xlrd读取excel是不能对其进行操作的. 1.xlrd ...

  4. python xlwt模块生成excel文件并写入数据 xlrd读取数据

    python中一般使用 xlwt (excel write)来生成Excel文件(可以控制单元格格式),用 xlrd 来读取Excel文件,用xlrd读取excel是不能对其进行操作的. 1.xlrd ...

  5. Java根据模板生成excel文件【Java】【EasyExcel】【xls】

    Background 前两天客户反应对数据导出的文件格式不太满意,然后给了我们模板,让我们按照模板导出数据.于是一通修改(excel数据量有限制他们也不管,之前我们给的csv格式). Java操作ex ...

  6. easyexcel 检查表头是否匹配_利用easyexcel生成excel文件-自定义表头与数据栏对应的处理方式...

    前面几篇文章测试过用easyexcel生成动态表头,动态样式.特别是动态表头以及下面数据列表与表头字段的对应是采用注解方式实现的.但在实际工作中,有些到处是灵活生成的,也就是说对于同一个类,在不同的场 ...

  7. 【JAVA】easyexcel 导出excel文件带多个图片

    最终效果 pom版本 <developer> <groupId>com.alibaba</groupId><artifactId>easyexcel&l ...

  8. 使用phpword实现php生成word文件同时以邮件的形式发送word附件

    新版的phpword支持中文不用再修改插件代码 应客户需求需要在用户创建简历后把简历以附件的形式发送到其指定邮箱,所有想到 先把数据存储到数据库,然后把数据读取出来处理后保存为word文档,然后在以附 ...

  9. easyExcel导出excel文件并打包成zip压缩包下载

    文件导出 专栏收录该内容 2 篇文章0 订阅 订阅专栏 package com.business.testExcelPort; import java.io.BufferedInputStream; ...

最新文章

  1. 第三周项目三-输出星号图(2)
  2. Java8中的Mapreduce
  3. 各种NLP操作难实现?谷歌开源序列建模框架Lingvo
  4. g100显卡 linux驱动,nvidia geforce g100驱动
  5. 关于nginx upstream的几种配置方式
  6. 对List集合中的对象进行按某个属性排序
  7. 自己本地如何玩redis_如何把win10系统本地磁盘图标更改为自己的照片
  8. 洛谷 3959 宝藏——枚举+状压dp
  9. 拓端tecdat|R语言中不同类型的聚类方法比较
  10. 用puttygen工具把私钥id_rsa转换成公钥id_rsa.ppk
  11. cacti监控linux和windows磁盘io,为CactiEZ(或者Cacti)增加监控磁盘IO功能
  12. 单片机c语言实习报告,单片机实习心得
  13. iOS 性能优化之列表流畅度优化
  14. 计算机怎么配置IP地址,如何设置电脑IP地址?
  15. 软考高级 真题 2016年上半年 信息系统项目管理师 案例分析
  16. 《创业算法》:技术人做CEO的优势和劣势
  17. 战列舰机械计算机,问个事,二战时期的战列舰可以装备垂直稳定仪么?
  18. 灰狼(GWO)算法(附完整Matlab代码,可直接复制)
  19. linux 增加交换空间,在linux上增加swap交换空间
  20. Chrome浏览器查看、找回保存的网站账户密码

热门文章

  1. 宽信app 项目总结
  2. Unity3dUGUI十步三点教你创建游戏排行榜界面
  3. VCS专题之功能及其命令(二)
  4. 向隐形冠军学习:聚焦人效,用时间管理提效益
  5. 用WCAT进行IIS压力测试(转)
  6. asp sql ip地址排序_SQL语言基础
  7. ie浏览器无法显示jpg的图片
  8. 从卢松松博客文章学习网站的内链优化
  9. jmeter自定义java_【脚本开发】:在jmeter中使用自定义的java脚本
  10. AMC8-2020pronlem25矩形正方形拼接问题