国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

南寧市網(wǎng)站維護(hù)與推廣公司品牌的宣傳及推廣

南寧市網(wǎng)站維護(hù)與推廣公司,品牌的宣傳及推廣,傳奇手游官網(wǎng),免費(fèi)h5在線制作目錄 1.生成Excel表格 1.依賴設(shè)置 2.代碼: 2.郵件發(fā)送 1.郵件發(fā)送功能實(shí)現(xiàn)-帶附件 2.踩過(guò)的坑 1.附件名中文亂碼問(wèn)題 3.參考文章: 需求描述:項(xiàng)目審批完畢后,需要發(fā)送郵件通知相關(guān)人員,并且要附帶數(shù)據(jù)庫(kù)表生成的…

目錄

1.生成Excel表格

1.依賴設(shè)置

2.代碼:

2.郵件發(fā)送

1.郵件發(fā)送功能實(shí)現(xiàn)-帶附件

?2.踩過(guò)的坑

1.附件名中文亂碼問(wèn)題

3.參考文章:


需求描述:項(xiàng)目審批完畢后,需要發(fā)送郵件通知相關(guān)人員,并且要附帶數(shù)據(jù)庫(kù)表生成的Excel表格,這就要求不光是郵件發(fā)送功能,還要臨時(shí)生成Excel表格做為附件

1.生成Excel表格

使用huTool工具包的Excel表格生成功能

1.依賴設(shè)置

<dependency>
? ? <groupId>cn.hutool</groupId>
? ? <artifactId>hutool-all</artifactId>
? ? <version>5.7.22</version>
</dependency>

<dependency>
? ? <groupId>org.apache.poi</groupId>
? ? <artifactId>poi-ooxml</artifactId>
? ? <version>5.2.2</version>
</dependency>

Hutool-all中包含了Hutool的所有工具類,由于需要生成Excel文件需要依賴poi

2.代碼:

    @Overridepublic void publish(xxxxxxPublishVo publishVo) {..................................................../*** 生成Excel表格*///在內(nèi)存操作,寫到輸出流中ExcelWriter writer = ExcelUtil.getWriter(true);//自定義標(biāo)題別名writer.addHeaderAlias("projectCode", "xx編號(hào)");writer.addHeaderAlias("projectName", "xx名稱");writer.addHeaderAlias("targetType", "xx類型");writer.addHeaderAlias("targetName", "xx名稱");writer.addHeaderAlias("targetForMp", "xxxx目標(biāo)");writer.addHeaderAlias("symbols", "xx限制符");//獲取數(shù)據(jù)QpmxxxxTargetMg query = new QpmxxxxTargetMg();query.setProjectCode(publishVo.getProjectCode());List<xxxxxxListDTO> data =  selectxxxxxxByCondition(query);//整理數(shù)據(jù),以便于生成Excel表格List<Object> dataNew = new ArrayList<>();Set<String> stageCollectSet = new HashSet<>();for (xxxxxxListDTO target: data){List<xxxxxxTargetMgStage> stageList = target.getxxxxxxStageList();Map<String, Object> addProperties = new HashMap<>();for (xxxxxxMgStage stage: stageList){if (!stageCollectSet.contains(stage)){stageCollectSet.add(stage.getStage());//給Excel增加列writer.addHeaderAlias(stage.getStage(), stage.getStage() + "目標(biāo)");}//為對(duì)象動(dòng)態(tài)增加屬性addProperties.put(stage.getStage(), stage.getStageTarget());}//生成新的包含了新增字段的對(duì)象Object targetNew = ReflectUtil.getTarget(target, addProperties);dataNew.add(targetNew);}//只保留別名的數(shù)據(jù)writer.setOnlyAlias(true);writer.write(dataNew,true);ByteArrayOutputStream outputStream = new ByteArrayOutputStream();// excel寫入到輸出流writer.flush(outputStream,true);...........................................................................

上述代碼中,調(diào)用了工具類ReflectUtil給對(duì)象動(dòng)態(tài)增加屬性。由于數(shù)據(jù)中有子類,需要獲取到子類中的某個(gè)字段并生成Excel表格,所以Excel表格構(gòu)造就需要對(duì)數(shù)據(jù)對(duì)象進(jìn)行改造,簡(jiǎn)單來(lái)說(shuō)就是需要給對(duì)象動(dòng)態(tài)增加新的屬性(成員對(duì)象的屬性),如下所示示例:

把studentList里面的關(guān)鍵屬性數(shù)據(jù),新增給Test類

示例不是很合適,湊合著用吧

class Test {

? ? private String class;

? ? .............................................

? ? private List<Student> studentList;

}

工具類ReflectUtil,用于給對(duì)象動(dòng)態(tài)增加新的屬性:

import com.google.common.collect.Maps;
import net.sf.cglib.beans.BeanGenerator;
import net.sf.cglib.beans.BeanMap;
import org.apache.commons.beanutils.PropertyUtilsBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;/*** 為實(shí)體類動(dòng)態(tài)增加屬性,用于生成Excel表格時(shí)的特殊情況,例如表格中的列需要?jiǎng)討B(tài)增加*/
public class ReflectUtil {static Logger logger = LoggerFactory.getLogger(ReflectUtil.class);public static Object getTarget(Object dest, Map<String, Object> addProperties) {// get property mapPropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean();PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(dest);Map<String, Class> propertyMap = Maps.newHashMap();for (PropertyDescriptor d : descriptors) {if (!"class".equalsIgnoreCase(d.getName())) {propertyMap.put(d.getName(), d.getPropertyType());}}// add extra propertiesfor (Map.Entry<String, Object> entry : addProperties.entrySet()) {propertyMap.put(entry.getKey(), entry.getValue().getClass());}
//        addProperties.forEach((k, v) -> propertyMap.put(k, v.getClass()));// new dynamic beanDynamicBean dynamicBean = new DynamicBean(dest.getClass(), propertyMap);// add old valuefor (Map.Entry<String, Class> entry : propertyMap.entrySet()) {try {// filter extra propertiesif (!addProperties.containsKey(entry.getKey())) {dynamicBean.setValue(entry.getKey(), propertyUtilsBean.getNestedProperty(dest, entry.getKey()));}} catch (Exception e) {logger.error(e.getMessage(), e);}};// add extra valuefor (Map.Entry<String, Object> entry : addProperties.entrySet()) {try {dynamicBean.setValue(entry.getKey(), entry.getValue());} catch (Exception e) {logger.error(e.getMessage(), e);}};Object target = dynamicBean.beanMap;return target;}public static class DynamicBean {/*** 目標(biāo)對(duì)象*/private Object target;/*** 屬性集合*/private BeanMap beanMap;public DynamicBean(Class superclass, Map<String, Class> propertyMap) {this.target = generateBean(superclass, propertyMap);this.beanMap = BeanMap.create(this.target);}/*** bean 添加屬性和值** @param property* @param value*/public void setValue(String property, Object value) {beanMap.put(property, value);}/*** 獲取屬性值** @param property* @return*/public Object getValue(String property) {return beanMap.get(property);}/*** 獲取對(duì)象** @return*/public Object getTarget() {return this.target;}/*** 根據(jù)屬性生成對(duì)象** @param superclass* @param propertyMap* @return*/private Object generateBean(Class superclass, Map<String, Class> propertyMap) {BeanGenerator generator = new BeanGenerator();if (null != superclass) {generator.setSuperclass(superclass);}BeanGenerator.addProperties(generator, propertyMap);return generator.create();}}
}

至此,我們就生成了Excel表格,并且把數(shù)據(jù)寫入到了輸出流中。

下面我們需要從輸出流中拿到Excel表格數(shù)據(jù),并做為郵件的附件發(fā)送出去。

2.郵件發(fā)送

1.郵件發(fā)送功能實(shí)現(xiàn)-帶附件

Spring?Email 抽象的核心是 JavaMailSender接口,通過(guò)實(shí)現(xiàn)JavaMailSender接口把 Email 發(fā)送給郵件服務(wù)器,由郵件服務(wù)器實(shí)現(xiàn)郵件發(fā)送的功能。

Spring 自帶了一個(gè) JavaMailSender的實(shí)現(xiàn) JavaMailSenderImpl。SpringBoot 應(yīng)用在發(fā)送 Email 之前,我們需要在配置文件中對(duì)JavaMailSender進(jìn)行屬性配置,這樣就可以利用Springboot的自動(dòng)裝配機(jī)制,將?JavaMailSenderImpl 裝配為 Spring容器的一個(gè) bean。

spring.mail.host: xxxxxxx.com
# 設(shè)置端口
spring.mail.port: 25
# 設(shè)置用戶名
spring.mail.username: xxxxxxxxxx
# 設(shè)置密碼,該處的密碼是QQ郵箱開啟SMTP的授權(quán)碼而非QQ密碼
spring.mail.password: xxxxxxxxx
# 設(shè)置是否需要認(rèn)證,如果為true,那么用戶名和密碼就必須的,
# 如果設(shè)置false,可以不設(shè)置用戶名和密碼,當(dāng)然也得看你的對(duì)接的平臺(tái)是否支持無(wú)密碼進(jìn)行訪問(wèn)的。
spring.mail.properties.mail.smtp.auth: false
# STARTTLS[1] ?是對(duì)純文本通信協(xié)議的擴(kuò)展。它提供一種方式將純文本連接升級(jí)為加密連接(TLS或SSL),而不是另外使用一個(gè)端口作加密通信。
spring.mail.properties.mail.smtp.starttls.enable: true
spring.mail.properties.mail.smtp.starttls.required: fasle
spring.mail.properties.mail.imap.starttls.socketFactory.fallback: false
spring.mail.properties.mail.smtp.starttls.socketFactory.class: com.ey.model.MailCommand

繼上面完整的Excel生成代碼,現(xiàn)在繼續(xù)寫郵件發(fā)送代碼:

    @Autowiredprivate JavaMailSender springMailSender;    @Overridepublic void publish(xxxxxxPublishVo publishVo) {//........這里不再?gòu)?fù)制上面的代碼,只從Excel表格寫入輸出流開始.........// excel寫入輸出流writer.flush(outputStream,true);//郵件附件名稱String fileName = String.format("制定xx目標(biāo)-%s.xlsx",UUID.randomUUID());//這個(gè)地方無(wú)需再配置,springboot自動(dòng)裝配,配置信息在nacos配置中心
//        springMailSender.setDefaultEncoding("UTF-8");
//        springMailSender.setHost("mx.goertek.com");
//        springMailSender.setPort(25);
//        springMailSender.setProtocol(JavaMailSenderImpl.DEFAULT_PROTOCOL);
//        springMailSender.setUsername("tims.sys@goertek.com");
//        springMailSender.setPassword("Khkd0804");
//        Properties p = new Properties();
//        p.setProperty("mail.smtp.timeout", "25000");
//        p.setProperty("mail.smtp.auth", "true");
//        p.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
//        springMailSender.setJavaMailProperties(p);MimeMessage mimeMessage = springMailSender.createMimeMessage();System.getProperties().setProperty("mail.mime.splitlongparameters", "false");MimeMessageHelper messageHelper = null;try {messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");} catch (MessagingException e) {throw new RuntimeException(e);}try {LoginUser userInfo = UserUtil.getCurrentUser();
//            String currentUserEmail = userInfo.getEmaila();
//            messageHelper.setFrom(currentUserEmail);messageHelper.setFrom(mailUserName);//設(shè)置收件人String[] emailArr = publishVo.getEmails().replaceAll("\\s+", "").split(",");messageHelper.setTo(emailArr);//設(shè)置抄送人if (!StringUtils.isBlank(publishVo.getCcEmails())){String[] ccEmailArr = publishVo.getCcEmails().replaceAll("\\s+", "").split(",");messageHelper.setCc(ccEmailArr);}messageHelper.setSubject("項(xiàng)目-" + publishVo.getProjectName().concat(": 制定品質(zhì)目標(biāo)完畢"));messageHelper.setText("項(xiàng)目-" + publishVo.getProjectName().concat(": 制定品質(zhì)目標(biāo)完畢"));try {//messageHelper.addInline("doge.gif", new File("xx/xx/doge.gif"));messageHelper.addAttachment(MimeUtility.encodeWord(fileName,"utf-8","B"), new ByteArrayResource(outputStream.toByteArray()));} catch (UnsupportedEncodingException e) {throw new RuntimeException(e);}springMailSender.send(mimeMessage);} catch (MessagingException e) {throw new RuntimeException(e);}

?2.踩過(guò)的坑

上述郵件發(fā)送功能實(shí)現(xiàn)過(guò)程中踩過(guò)的坑:

1.附件名中文亂碼問(wèn)題

附件的名字是中文,發(fā)送成功后,在郵件中的附件名字中文亂碼,怎樣解決這個(gè)問(wèn)題?

1. 設(shè)置系統(tǒng)值:

System.setProperty("mail.mime.splitlongparameters", "false");

2. 這里,在創(chuàng)建對(duì)象的時(shí)候定義編碼格式(utf-8):

MimeMessageHelper messageHelper = new MimeMessageHelper(mes, true, "utf-8");

3. 其次,在添加附件的時(shí)候,附件名是需要定義編碼:

messageHelper.addAttachment(MimeUtility.encodeWord(附件名,"utf-8","B"), 附件輸入流));

3.參考文章:

使用hutool工具進(jìn)行導(dǎo)入導(dǎo)出excel表格_hutool excel-CSDN博客

springboot:實(shí)現(xiàn)excel生成并且通過(guò)郵件發(fā)送 - 嗶哩嗶哩?

http://aloenet.com.cn/news/33665.html

相關(guān)文章:

  • 營(yíng)銷型網(wǎng)站建設(shè)和規(guī)劃培訓(xùn)班該如何建站
  • 淇縣網(wǎng)站建設(shè)谷歌下載
  • 上海網(wǎng)站開發(fā)公司外包臨沂做網(wǎng)站建設(shè)公司
  • wordpress js 頁(yè)腳seo經(jīng)驗(yàn)是什么
  • 邢臺(tái)網(wǎng)站推廣費(fèi)用seo權(quán)威入門教程
  • 做網(wǎng)站當(dāng)生日禮物網(wǎng)絡(luò)營(yíng)銷五個(gè)特點(diǎn)
  • 承德做網(wǎng)站優(yōu)化百度識(shí)圖鑒你所見
  • 網(wǎng)站開發(fā)怎么做常用的網(wǎng)絡(luò)營(yíng)銷平臺(tái)有哪些
  • 茂名百度搜索網(wǎng)站排名青島網(wǎng)頁(yè)搜索排名提升
  • 收款網(wǎng)站怎么建設(shè)網(wǎng)絡(luò)營(yíng)銷方案設(shè)計(jì)
  • 網(wǎng)頁(yè)制作公司網(wǎng)站網(wǎng)絡(luò)事件營(yíng)銷案例
  • 陜西省建設(shè)網(wǎng)三類人員證書查詢正規(guī)網(wǎng)站優(yōu)化公司
  • 北京市文化局政務(wù)網(wǎng)站建設(shè)項(xiàng)目有沒(méi)有推廣app的平臺(tái)
  • wordpress 新聞采集站百度做廣告怎么做
  • 自己網(wǎng)站可以加標(biāo)志嗎域名搜索引擎
  • 湖南手機(jī)版建站系統(tǒng)哪家好石家莊學(xué)院
  • 校園互動(dòng)網(wǎng)站建設(shè)網(wǎng)絡(luò)營(yíng)銷的宏觀環(huán)境
  • 本溪做網(wǎng)站的快優(yōu)吧seo優(yōu)化
  • 太原企業(yè)做網(wǎng)站營(yíng)銷團(tuán)隊(duì)找產(chǎn)品合作
  • 重慶門戶網(wǎng)站開發(fā)報(bào)價(jià)seo網(wǎng)站結(jié)構(gòu)優(yōu)化的方法
  • 綿陽(yáng)專門做網(wǎng)站的公司有哪些產(chǎn)品如何做線上推廣
  • 博客系統(tǒng)做網(wǎng)站aso搜索優(yōu)化
  • 做視頻網(wǎng)站視頻放在哪里找營(yíng)銷型企業(yè)網(wǎng)站
  • html商品展示頁(yè)面專業(yè)搜索引擎seo技術(shù)公司
  • 淘寶網(wǎng)屬于b2b還是b2c培訓(xùn)機(jī)構(gòu)優(yōu)化
  • 數(shù)據(jù)服務(wù)網(wǎng)站開發(fā)google網(wǎng)站登錄入口
  • 上海城建設(shè)計(jì)院網(wǎng)站微營(yíng)銷是什么
  • 怎樣幫別人做網(wǎng)站軟文大全800字
  • 合肥的網(wǎng)站建設(shè)深圳網(wǎng)絡(luò)營(yíng)銷網(wǎng)站設(shè)計(jì)
  • 企業(yè)網(wǎng)站建設(shè)制作多少錢搜索關(guān)鍵詞排名