Java实现通过poi把数据查出来放在模板Excel中并作为附件发送邮件

这篇博客介绍了如何使用Java的POI库将数据库查询到的数据填充到Excel模板中,然后将生成的Excel文件作为附件通过邮件发送。详细步骤包括Java代码实现、POI库的应用、数据查询、模板处理和邮件发送。

Java实现通过poi把数据查出来放在模板中,并作为附件发送邮件。

要点:

1.java代码

2.poi

3.从数据库中查出数据

4.把数据显示到模板(excel)中

5.发送邮件,附件为excel



其中模板存放在项目中,第一次使用poi,话不多说直接上代码。

package com.clbus.matouwang.web.action.ma;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import javax.mail.util.ByteArrayDataSource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.clbus.matouwang.common.utils.PageUtil;
import com.clbus.matouwang.pojo.MaterielInquiryOrderDetailExt;
import com.clbus.matouwang.pojo.base.Criteria;
import com.clbus.matouwang.pojo.base.MaterielVendorInfo;
import com.clbus.matouwang.service.MaterielInquiryOrderDetailService;
import com.clbus.matouwang.service.MaterielVendorInfoService;

/**
 * 供应链询价单 发送邮件给供应商
 * @author Yasha
 *
 */
@Controller
public class SendEmailToVendorController {
    

    /**
     * 询价单服明细务类
     */
    @Autowired
    private MaterielInquiryOrderDetailService materielInquiryOrderDetailService;
    
    /**
     * 供货商基础信息类
     */
    @Autowired
    private MaterielVendorInfoService materielVendorInfoService;
    
    /**
     * 
     * 方法名: getAttachment 
     * 描述: 获取邮件的附件  
     * 创建人: Yasha
     * 创建时间: 2017年1月12日 下午3:17:12
     * 版本号: v1.0   
     * 抛出异常:
     * 参数: 
     * 返回类型: void
     */
    @SuppressWarnings("deprecation")
    @RequestMapping("/getAttachment")
    public void getAttachment(HttpServletRequest request, HttpServletResponse response, String inquiryNo, String vendorId, String tempContent){
        
        // 未填写邮箱地址的供货商列表
        List<String> vendorsList = new ArrayList<String>();
        
        // 设置查询条件
        Criteria example = new Criteria();
        if(vendorId != null && vendorId != "" && inquiryNo != null && inquiryNo != ""){
            /***********************遍历供货商,给每一个供货商发送一封邮件,附件内容为当前询单中此供货商提供的所有物料详情**************************/
            String[] vendorIds = vendorId.split(",");
            for(int i=0;i<vendorIds.length;i++){
                // 查询条件
                example.put("vendorId", vendorIds[i]);
                example.put("inquiryNo", inquiryNo);
                // 根据询单id查询询单信息
                List<MaterielInquiryOrderDetailExt> vendorInfoList = materielInquiryOrderDetailService.getMaterielInfoListByInquiryNo(example);

                try {
                    // 获取模板
                    String path = request.getRealPath("WEB-INF/excel/询价单询价信息模板.xls");
                    FileInputStream template = new FileInputStream(path);
                    // 如果是xlsx,2007,用XSSF,如果是xls,2003,用HSSF
                    // 一个Excel文件的层次:Excel文件-> 工作表-> 行-> 单元格 对应到POI中,为:workbook-> sheet-> row-> cell 
                    HSSFWorkbook workBook=new HSSFWorkbook(template);
                    // 获取第一个sheet页
                    HSSFSheet sheet=workBook.getSheetAt(0);
                    
                    /******************************设置表头*****************************/
                    String sheetTitle = "供应链询价单询价信息("+ inquiryNo +")";
                    // 单元格合并      
                    // 四个参数分别是:起始行,起始列,结束行,结束列      
                    sheet.addMergedRegion(new CellRangeAddress(0,0,2,10)); 
                    // 创建表头并赋值
                    HSSFRow rowTitle = sheet.createRow(0); 
                    HSSFCell cellTitle = rowTitle.createCell(0);
                    cellTitle.setCellValue(sheetTitle);  

                    // 创建剧中样式
                    HSSFCellStyle cellStyle = workBook.createCellStyle();
                    // 垂直居中
                    cellStyle.setAlignment(HSSFCellStyle.VERTICAL_CENTER);
                    // 水平居中
                    cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
                    // 创建字体
                    HSSFFont cellFont = workBook.createFont();
                    cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
                    cellFont.setFontHeight((short) 300);
                    cellStyle.setFont(cellFont);
                    cellTitle.setCellStyle(cellStyle);
                    
                    /**********************遍历物料,并将物料列表显示到模板中,作为邮件的附件***********************/
                    // 行号下标,从0开始
                    int rowIndex = 3 ;
                    for(int j=0;j<vendorInfoList.size();j++){
                        rowIndex++;
                        // 创建行
                        HSSFRow row=sheet.createRow(rowIndex);
                        // 根据下标创建单元格
                        // 设置物料序号
                        row.createCell(0).setCellValue(j+1);
                        // 设置IMPA编码
                        if(null != vendorInfoList.get(j).getMaterielCodeImpa()){
                            row.createCell(1).setCellValue(vendorInfoList.get(j).getMaterielCodeImpa());
                        }else {
                            row.createCell(1).setCellValue("");
                        }
                        
                        // 设置物料中文名称
                        if(null != vendorInfoList.get(j).getMaterielName()){
                            row.createCell(2).setCellValue(vendorInfoList.get(j).getMaterielName());
                        }else {
                            row.createCell(2).setCellValue("");
                        }
                        
                        // 设置物料英文名称
                        if(null != vendorInfoList.get(j).getMaterielNameEn()){
                            row.createCell(3).setCellValue(vendorInfoList.get(j).getMaterielNameEn());
                        }else {
                            row.createCell(3).setCellValue("");
                        }
                        
                        // 设置物料规格
                        if(null != vendorInfoList.get(j).getMaterielSpecification()){
                            row.createCell(4).setCellValue(vendorInfoList.get(j).getMaterielSpecification());
                        }else {
                            row.createCell(4).setCellValue("");
                        }
                        
                        // 设置物料数量
                        if(null != vendorInfoList.get(j).getQuantity()){
                            row.createCell(5).setCellValue(vendorInfoList.get(j).getQuantity().toString());
                        }else {
                            row.createCell(5).setCellValue("");
                        }
                        
                        // 设置物料单位
                        if(null != vendorInfoList.get(j).getUnit()){
                            row.createCell(6).setCellValue(vendorInfoList.get(j).getUnit());
                        }else {
                            row.createCell(6).setCellValue("");
                        }
                        
                        // 设置物料供应商
                        if(null != vendorInfoList.get(j).getVendorName()){
                            row.createCell(7).setCellValue(vendorInfoList.get(j).getVendorName());
                        }else {
                            row.createCell(7).setCellValue("");
                        }
                        
                        // 设置物料采购成本
                        if(null != vendorInfoList.get(j).getLowPrice()){
                            row.createCell(8).setCellValue(vendorInfoList.get(j).getLowPrice().toString());
                        }else {
                            row.createCell(8).setCellValue("");
                        }
                        
                        // 设置采购币种
                        if(null != vendorInfoList.get(j).getCurrency()){
                            row.createCell(9).setCellValue(vendorInfoList.get(j).getCurrency());
                        }else {
                            row.createCell(9).setCellValue("");
                        }
                        
                        // 设置采购税项
                        if(null != vendorInfoList.get(j).getTaxation()){
                            row.createCell(10).setCellValue(vendorInfoList.get(j).getTaxation());
                        }else {
                            row.createCell(10).setCellValue("");
                        }
                        
                        // 设置物料详情主键
                        if(null != vendorInfoList.get(j).getPkId()){
                            row.createCell(11).setCellValue(vendorInfoList.get(j).getPkId());
                        }else {
                            row.createCell(11).setCellValue("");
                        }
                    }
                    /***********************准备邮件并发送给供货商**********************/
//                    workBook.write(out);
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    workBook.write(baos);
                    baos.flush();
                    byte[] bt = baos.toByteArray();
                    InputStream is = new ByteArrayInputStream(bt, 0, bt.length);
                    baos.close();
                    
                    // 查询供货商邮箱地址
                    MaterielVendorInfo vendorInfo = materielVendorInfoService.selectByPrimaryKey(vendorIds[i]);
                    // 获取邮件内容
                    // 查询条件
                    example.clear();
                    example.put("tGroup", "email");
                    example.put("tType", "mtw_email_inquiry");
                    // 获取模板内容
//                    String tempContent = materielInquiryOrderDetailService.getMailTemplate(example);
                    String email = vendorInfo.getVendorMail();
                    if(!"".equalsIgnoreCase(email)){
                        sendMail("物料详情", email, tempContent , is);
                    }else {
                        // 供货商姓名
                        vendorsList.add(vendorInfo.getVendorName());
                        // 不发送邮件
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        PageUtil.print(vendorsList.toString(), response);
    }
    
    /**
     * 
     * 方法名: sendMail 
     * 描述: 发送邮件
     * 创建人: Yasha
     * 创建时间: 2017年1月12日 下午7:19:06
     * 版本号: v1.0   
     * 抛出异常:
     * 参数: @param subject
     * 参数: @param toMail
     * 参数: @param content
     * 参数: @param files
     * 参数: @return
     * 返回类型: boolean
     */
    public static boolean sendMail(String subject, String toMail, String content, InputStream is) {  
        boolean isFlag = false;  
        try {  
            String smtpFromMail = "xxxxxx.com";  //账号  
            String pwd = "xxxxxx"; //密码  
            int port = 25; //端口  
            String host = "smtp.exmail.qq.com"; //端口  
  
            Properties props = new Properties();  
            props.put("mail.smtp.host", host);  
            props.put("mail.smtp.auth", "true");  
            Session session = Session.getDefaultInstance(props);  
            session.setDebug(false);  
  
            MimeMessage message = new MimeMessage(session);  
            try {  
                message.setFrom(new InternetAddress(smtpFromMail, "物料询价单"));  
                message.addRecipient(Message.RecipientType.TO, new InternetAddress(toMail));  
                message.setSubject(subject);  
                message.addHeader("charset", "UTF-8");  
                  
                /*添加正文内容*/  
                Multipart multipart = new MimeMultipart();  
                BodyPart contentPart = new MimeBodyPart();  
                contentPart.setText(content);  
  
                contentPart.setHeader("Content-Type", "text/html; charset=UTF-8");  
                multipart.addBodyPart(contentPart);  
                  
                /*添加附件*/  
                MimeBodyPart fileBody = new MimeBodyPart();  
                DataSource source = new ByteArrayDataSource(is, "application/msexcel"); 
                fileBody.setDataHandler(new DataHandler(source));  
                String fileName  = "物料列表.xls";
                // 中文乱码问题
                fileBody.setFileName(MimeUtility.encodeText(fileName));  
                multipart.addBodyPart(fileBody);  
  
                message.setContent(multipart);  
                message.setSentDate(new Date());  
                message.saveChanges();  
                Transport transport = session.getTransport("smtp");  
  
                transport.connect(host, port, smtpFromMail, pwd);  
                transport.sendMessage(message, message.getAllRecipients());  
                transport.close();  
                isFlag = true;  
            } catch (Exception e) {  
                e.printStackTrace();
                isFlag = false;  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return isFlag;  
    }  
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值