需求说明
java/excel模板/excel模板数据写入/文件压缩/发送邮件/ssl发送邮件
通过指定模板及数据生成不同的excel文件,文件汇总压缩,并通过SSL方式将附件发送至指定邮箱,全程数据不落地。
- 实现效果
实现分析
数据不落地思路:
1.查询数据填入excel模板输出得到LIst<byte[]> ;
2.传入byte[]进行压缩,导出ByteArrayInputStream ;
3.根据ByteArrayInputStream发送邮件传附件 ;
实现步骤
- 引入依赖包
<!--email start-->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>2.0.8.RELEASE</version>
</dependency>
<!--email end-->
<!--excel export strart-->
<dependency>
<groupId>net.sf.jxls</groupId>
<artifactId>jxls-core</artifactId>
<version>1.0.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.sf.jxls/jxls-reader -->
<dependency>
<groupId>net.sf.jxls</groupId>
<artifactId>jxls-reader</artifactId>
<version>1.0.6</version>
</dependency>
<!--excel export end-->
-
excel模板
文档这里是需要处理一下,需要插入数据的,通过“${}
”的方式协商对应实体类中的属性,例如,姓名对应的TestBackupDataVO中的name,而因此是${result.name}
,这里的result也是我们自己定义的,具体在“运行”部分有体现; -
实体类
package com.leo.model.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* 数据备份vo
*
* @author LA
*/
@Data
@ApiModel(value = "数据备份vo")
public class TestBackupDataVO {
public TestBackupDataVO(String name, String age, String className, List<TestBackupScoreDataVO> scoreInfo) {
this.name = name;
this.age = age;
this.className = className;
this.scoreInfo = scoreInfo;
}
/**
* 姓名
*/
@ApiModelProperty(value = "姓名")
private String name;
/**
* 年龄
*/
@ApiModelProperty(value = "年龄")
private String age;
/**
* 班级
*/
@ApiModelProperty(value = "班级")
private String className;
/**
* 分数详情
*/
@ApiModelProperty(value = "分数详情")
private List<TestBackupScoreDataVO> scoreInfo;
public TestBackupDataVO() {
}
}
package com.leo.model.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 数据备份-分数详情vo
*
* @author LA
*/
@Data
@ApiModel(value = "数据备份-分数详情vo")
public class TestBackupScoreDataVO {
public TestBackupScoreDataVO() {
}
public TestBackupScoreDataVO(String courseName, String score) {
this.courseName = courseName;
this.score = score;
}
/**
* 课程名称
*/
@ApiModelProperty(value = "课程名称")
private String courseName;
/**
* 分数
*/
@ApiModelProperty(value = "分数")
private String score;
}
ssl邮件附件文件流类
package com.leo.util;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.ByteArrayInputStream;
/**
* @author LA
* ssl邮件附件文件流类
*/
@Data
@ApiModel(value = "ssl邮件附件文件流类")
public class SslMailInputStream {
/**
* 文件名
*/
@ApiModelProperty(value = "文件名")
private String fileName;
/**
* ByteArrayInputStream
*/
@ApiModelProperty(value = "ByteArrayInputStream")
private ByteArrayInputStream inputStream;
public SslMailInputStream() {
}
public SslMailInputStream(String fileName, ByteArrayInputStream inputStream) {
this.fileName = fileName;
this.inputStream = inputStream;
}
}
- 配置及配置读取
mailConfig.properties
#服务器
mailHost=你的邮箱服务器地址
#端口号
mailPort=465
#邮箱账号
mailUsername=你的发送邮箱
#邮箱授权码
mailPassword=你的邮箱授权码
#时间延迟
mailTimeout=25000
#发送人
mailFrom=你的发送邮箱
#发件人
personal=
#收件人
mailTo=
#发送手机号
mailPhone=
#标题
subject=#%s#成绩单数据备份
配置读取:
package com.leo.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
/**
* MailConfig
*
* @author LA
*/
public class MailConfig {
private static final String PROPERTIES_DEFAULT = "conf/mailConfig.properties";
public static String host;
public static Integer port;
public static String userName;
public static String passWord;
public static String emailForm;
public static String timeout;
public static String personal;
public static String html;
public static String subject;
public static Properties properties;
public static String mailTo;
public static String mailPhone;
static{
init();
}
/**
* 初始化
*/
private static void init() {
properties = new Properties();
try{
InputStream inputStream = MailConfig.class.getClassLoader().getResourceAsStream(PROPERTIES_DEFAULT);
//解决中文乱码,采取reader把inputStream转换成reader用字符流来读取中文
BufferedReader bf = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
properties.load(bf);
host = properties.getProperty(