签名:但行好事,莫问前程。
前言
公司产品提出了一个新需求,要求把不满足团购商品利润和库存的Excel里面的数据展示到邮件正文,(之前本来是Excel作为附件发送到邮箱)。要求:正文展示的数据要美观。
一、需求分析
- 已经可以获取的数据:不满足团购商品利润和库存的list数据、需要发送邮件的人邮箱的数组,以及发送邮件的工具类。
- 需要优化的部分:把list数据展示到邮件正文。
- 解决思路:将list数据抽取成table表格,然后以html的形式展示到邮件正文(ps:邮件是支持解析html内容的)
二、代码编写
if(profitVOList != null && profitVOList.size() > 0){
String subject = "团购商品利润和库存预警";
//Step3:创建临时表格文件
String fileName = new String(subject.getBytes("utf-8"));
File sheetFile = new File(fileName + ".xlsx");
ExcelUtil.writeExcel(sheetFile, EmallGoodsStockAndProfitVO.class, profitVOList);
if (notifyEmail != null) {
logger.info("邮件通知人[{}],[{}]", sendTo,sendTo2);
logger.info("邮件通知内容[{}]", profitVOList);
// Excel内容在邮件正文显示
StringBuilder htmlText = new StringBuilder();
String htmlStar = "<html><body><table border=\"1px\" cellpadding=\"10px\">";
String htmlEnd = "</table></body></html>";
// 表头
String th = "<tr>" +
"<th>营销活动ID</th>" +
"<th>营销活动</th>" +
"<th>场次ID</th>" +
"<th>场次名称</th>" +
"<th>场次开始时间</th>" +
"<th>场次结束时间</th>" +
"<th>商品ID</th>" +
"<th>商品名称</th>" +
"<th>利润率</th>" +
"<th>库存</th></tr>";
// 行数据
StringBuilder tr = new StringBuilder();
// for循坏table的行数据
for (int i = 0; i < profitVOList.size(); i++) {
// 只展示前20条数据
if (i == 20) {
tr.append("更多数据请打开Excel附件查看详情O(∩_∩)O~");
break;
}
// 依次获取表头对应的字段值
tr.append(
"<tr>" +
"<td>" + profitVOList.get(i).getProjectId() + "</td>" +
"<td>" + profitVOList.get(i).getProjectName() + "</td>" +
"<td>" + profitVOList.get(i).getSessionId() + "</td>" +
"<td>" + profitVOList.get(i).getSessionName() + "</td>" +
"<td>" + profitVOList.get(i).getSessionStartTime() + "</td>" +
"<td>" + profitVOList.get(i).getSessionEndTime() + "</td>" +
"<td>" + profitVOList.get(i).getGoodsId() + "</td>" +
"<td>" + profitVOList.get(i).getGoodsName() + "</td>" +
"<td>" + profitVOList.get(i).getProfit() + "</td>" +
"<td>" + profitVOList.get(i).getSurplusNum() + "</td>" +
"</tr>");
}
// 拼接HTML页面
htmlText.append(htmlStar);
htmlText.append(th);
htmlText.append(tr);
htmlText.append(htmlEnd);
notifyService.notifyMailWithAttachmentAndHtmlText(emailStr.split(","), fileName, sheetFile, String.valueOf(htmlText), false);
}
} else {
logger.info("团购商品活动利润正常,无需预警, [{}]");
}
三、解决思路
- 定义html、body、table 头和尾
String htmlStar = "<html><body><table border=\"1px\" cellpadding=\"10px\">";
String htmlEnd = "</table></body></html>";
- 定义table的表头
// 表头
String th = "<tr>" +
"<th>营销活动ID</th>" +
"<th>营销活动</th>" +
"<th>场次ID</th>" +
"<th>场次名称</th>" +
"<th>场次开始时间</th>" +
"<th>场次结束时间</th>" +
"<th>商品ID</th>" +
"<th>商品名称</th>" +
"<th>利润率</th>" +
"<th>库存</th></tr>";
- for循坏遍历list生成行数据
// 行数据
StringBuilder tr = new StringBuilder();
// for循坏table的行数据
for (int i = 0; i < profitVOList.size(); i++) {
// 只展示前20条数据
if (i == 20) {
tr.append("更多数据请打开Excel附件查看详情O(∩_∩)O~");
break;
}
// 依次获取表头对应的字段值
tr.append(
"<tr>" +
"<td>" + profitVOList.get(i).getProjectId() + "</td>" +
"<td>" + profitVOList.get(i).getProjectName() + "</td>" +
"<td>" + profitVOList.get(i).getSessionId() + "</td>" +
"<td>" + profitVOList.get(i).getSessionName() + "</td>" +
"<td>" + profitVOList.get(i).getSessionStartTime() + "</td>" +
"<td>" + profitVOList.get(i).getSessionEndTime() + "</td>" +
"<td>" + profitVOList.get(i).getGoodsId() + "</td>" +
"<td>" + profitVOList.get(i).getGoodsName() + "</td>" +
"<td>" + profitVOList.get(i).getProfit() + "</td>" +
"<td>" + profitVOList.get(i).getSurplusNum() + "</td>" +
"</tr>");
}
- 拼接HTML页面
// 拼接HTML页面
htmlText.append(htmlStar);
htmlText.append(th);
htmlText.append(tr);
htmlText.append(htmlEnd);
- 调用邮件发送方法
notifyService.notifyMailWithAttachmentAndHtmlText(emailStr.split(","), fileName, sheetFile, String.valueOf(htmlText), false);
四、最终效果
将list数据以html格式的形式展示到邮件正文
总结
博客主要记录了工作中将list数据以html格式的形式展示到邮件正文的问题,有啥错误或不足地方请指正,如果对你有所帮助,请一键三连。