根据xlsx模板生成excel数据文件发送邮件代码

package mail;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.mail.internet.MimeUtility;

import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.MultiPartEmail;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * @comments
 * @author  xxx
 * @version 创建时间:2014年6月15日
 * 将该类从单实例,变成了 Spring 管理的类
 */
public class EmailService {

    private final static String EMAIL_APP_TYPE = "email";
//    private static final String INSURANCE_EMAIL_TYPE="insurance_email";
    private final static String HOST_NAME_ITEM_NAME = "server_host";
    private final static String FROM_ADDR_ITEM_NAME = "from_addr";
    private final static String FROM_NAME_ITEM_NAME = "from_name";
    private final static String PASSWORD_ITEM_NAME = "password";
//    private final static String TO_EMAIL_ITEM_NAME = "to_email";  //发送对象。

    private static final String CPIC_TEMPLET_FILE = "C:\\hzCoupon2.xlsx";  //模板文件

    public static String getHostName() {
        return "smtp.***.***.com";
    }

    public static String getPassword() {
        return "pwd**";
    }

    public static String getFromAddr() {
        return "[email protected]****.com";
    }

    public static String getFromName() {
        return "****Service";
    }

    /**
     * 入口
     * @param list
     * @throws Exception
     */
    public static boolean sendPolicyEmail(String toEmail,List<HzCouponModel> list) throws Exception{
        boolean result = false;
//        String currTime = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());//System.currentTimeMillis();
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DAY_OF_MONTH, -1);  //往前一天
        String yesterday = "-test-";  //xxxx年xx月xx日

        String cpicFileName = "hzCoupon" + yesterday + ".xls";
        try {
            String fileNames = createHzCouponXLS(list, cpicFileName);
            if(fileNames != null && !"".equals(fileNames)){
                sendEmailWithAttch(toEmail,fileNames);
                result = true;
            }
        } catch (Exception e) {
            result = false;
            e.printStackTrace();
            throw e;
        }
        return result;
    }

    private static void sendEmailWithAttch(String toEmail, String cpicNamePath) throws Exception{
        String yesterday = "-test-";
        EmailAttachment insurAttach = getAttachment("***保数据"+yesterday+".xlsx", cpicNamePath, "***保数据(**提供)");
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DAY_OF_MONTH, -1);  //往前一天
//        String yesterday = CommonConstants.DATE_YEAR_MONTH_DAY_CN_FORMAT(c.getTime());  //xxxx年xx月xx日

        String res1 = sendAttchEmail(toEmail, "***保数据"+yesterday+"明细", "你好,附件是"+yesterday+"***保数据表格,请查收。", insurAttach);
        System.out.println("发送“***资格数据” email res:{}"+ res1);

    }

    private static EmailAttachment getAttachment(String attachName, String fileNamePath, String desc) throws Exception{
        EmailAttachment attachment = new EmailAttachment();
        attachment.setPath(fileNamePath);
        attachment.setDisposition(EmailAttachment.ATTACHMENT);
        attachment.setName(MimeUtility.encodeText(attachName));
        attachment.setDescription(desc);
        return attachment;
    }

    private static String sendAttchEmail(String to, String subject, String content, EmailAttachment attachment) throws Exception{
        MultiPartEmail  email = new MultiPartEmail();
        email.setHostName(getHostName());
        email.setAuthentication(getFromAddr(), getPassword());
        email.setFrom(getFromAddr(), getFromName());
        email.addTo(to);
        email.setSubject(subject);
        email.setMsg(content);
        email.attach(attachment);
        email.addHeader("Disposition-Notification-To", getFromAddr());//邮件回执
        return email.send();
    }

    /**
     * 获取模板文件流
     * @return
     */
    private static InputStream getCpicTemplet(){
//        return CpicCouponEmailService.class.getResourceAsStream(CPIC_TEMPLET_FILE);

        //文件流
        InputStream in = null;
        File f = new File(CPIC_TEMPLET_FILE);
        try {
            in = new FileInputStream(f);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return in;
    }

    @SuppressWarnings("unchecked")
    private static String createHzCouponXLS(Object data, String cpicFileName) throws Exception{
        InputStream assIn = null;
        FileOutputStream assOut = null;
        try {
            //------------------------------------------------------------------------------------------------------------
            assIn = getCpicTemplet();//InsuranceUtils.class.getResourceAsStream("/conf/resource/Roadside-Assistance.xlsx");

            XSSFWorkbook assWb = new XSSFWorkbook(assIn);//XSSFWorkbook assWb = (XSSFWorkbook) WorkbookFactory.create(assIn);
            XSSFSheet assSheet = assWb.getSheetAt(0);

//            String currDate = new SimpleDateFormat("yyyy/MM/dd").format(new Date());

            if(data instanceof List){
                List<HzCouponModel> list = (List<HzCouponModel>) data;
                for (int i = 0; i < list.size() ; i++) {
                    HzCouponModel model = list.get(i);
                    setData(i, model, assWb, assSheet);
                }
            }else if(data instanceof Map){
                HzCouponModel model =  (HzCouponModel) data;
                setData(0, model, assWb, assSheet);
            }else{
                return null;
            }

//            String insurPolicyNamePath = File.createTempFile(cpicFileName,".xlsx").getPath(); //临时文件
            String insurPolicyNamePath = "C:/save/"+cpicFileName;
            assOut = new FileOutputStream(insurPolicyNamePath);
            assWb.write(assOut);//写入Excel文件,这才是关键。
            System.out.println("创建“***保数据”Excel文件:{}" + insurPolicyNamePath);
            return insurPolicyNamePath;

        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }finally{
            if(assOut != null){
                assOut.close();
            }
            if(assIn != null){
                assIn.close();
            }
        }
    }

    /**
     * 数据填充
     * @param idx
     * @param currDate
     * @param map
     * @param insruWb
     * @param insurSheet
     * @param assWb
     * @param assSheet
     * @throws Exception
     */
    private static void setData(int idx, HzCouponModel model, XSSFWorkbook assWb, XSSFSheet assSheet) throws Exception{
        XSSFRow assRow = createRowAndCel(assWb, assSheet, idx+1, 12);//assSheet.getRow(i+1);//可能为null
        assRow.getCell(0).setCellValue(model.getCreateTime());//
        assRow.getCell(1).setCellValue(model.getPartner());//
        assRow.getCell(2).setCellValue(model.getStartPolicyDate());//
        assRow.getCell(3).setCellValue(model.getFiliale());//
        assRow.getCell(4).setCellValue(model.getBranch());//
        assRow.getCell(5).setCellValue(model.getPolicyMobile());//
        assRow.getCell(6).setCellValue(model.getInsuredMobile());//
        assRow.getCell(7).setCellValue(model.getBrandType());//
        assRow.getCell(8).setCellValue(model.getPlateNum());//
        assRow.getCell(9).setCellValue(model.getFrameNo());//
        assRow.getCell(10).setCellValue(model.getCouponType());//
        assRow.getCell(11).setCellValue(model.getInsuredNumber());//
    }

    /**
     * 创建Excel的行(row)和列(cel)
     * @param sheet
     * @param rowIdx
     * @param cellNum
     */
    private static XSSFRow createRowAndCel(XSSFWorkbook wb, XSSFSheet sheet, int rowIdx, int cellNum){
        XSSFCellStyle cellStyle = wb.createCellStyle();//创建cell样式
        cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//设置右边框
        cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);//设置下边框
        sheet.createRow(rowIdx);
        XSSFRow row = sheet.getRow(rowIdx);
        for (int i = 0; i < cellNum; i++) {
            XSSFCell cell = row.createCell(i);
            cell.setCellStyle(cellStyle);
        }
        return row;
    }

    //错误: 找不到或无法加载主类 testJava2.email.CpicCouponEmailService
    public static void main(String[] args) throws Exception{
        List<HzCouponModel> list = new ArrayList<HzCouponModel>();
        HzCouponModel model = new HzCouponModel("2017-06-04", "*保", "2017-06-06", "sz分公司", "电子商务部门", "137****1198", "137****1199", "奥迪A8", "沪A***78", "WFSFJFKSJFa7844", "经济型套餐", "3100245456");
        list.add(model);
        model = new HzCouponModel("2017-06-04", "*安", "2017-06-08", "sz分公司", "电子商务部门", "137****2298", "137****2299", "奥迪A8", "沪A**78", "WFSFJFKSJFa7844", "豪华型套餐", "3100245456");
        list.add(model);
        sendPolicyEmail("[email protected]", list);
    }
}
 

1.异常处理

Exception in thread "main" org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException: The supplied data appears to be in the OLE2 Format. You are calling the part of POI that deals with OOXML (Office Open XML) Documents. You need to call a different part of POI to process this data (eg HSSF instead of XSSF)

原因是:
HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls 
XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx

2.NoClassDefFoundError: org/openxmlformats/schemas/drawingml/x2006/main/ThemeDocument

解决方法:添加poi-ooxml-schemas-3.12-20150511.jar

3. javax.mail.NoSuchProviderException: smtp 报错

下了最新的mailapi  1.4.7  版本,  把原来的那两个jar(activation-1.1.1.jar  和 mailapi-1.4.3 jar)从classpath中去掉, 把1.4.7 中lib全部加到classpath, 然后就发送成功了。

时间: 2024-10-21 16:25:09

根据xlsx模板生成excel数据文件发送邮件代码的相关文章

【PHP】PHP使用PHPExcel生成Excel表格文件(附带随机生成英文名函数)

[PHP]PHP使用PHPExcel生成Excel表格文件(附带随机生成英文名函数) 前言 由于业务需要,我们需要从业务中汇总数据,并生成Excel文件. 思路是这样的 PHP要导出Excel表格文件->找一个好用的第三方库吧->在Composer的Packages里找一个吧->PHPExcel这么多收藏,就它了! PHPExcel 概述 PHPExcel is a library written in pure PHP and providing a set of classes th

Jmeter—生成excel结果文件

相信很多用jmeter进行接口测试的童鞋都会有这样的苦恼:同时执行上百条测试案例,如何能轻松加愉快地检查案例输出结果?仅仅靠jmeter的断言.debug sampler.察看结果树等是无法满足我们要求的!下面跟大家分享一个小技巧,利用beanshell和外部jar包来生成excel结果文件. Jmeter接口自动化脚本编写流程 1.下载开源jar包 下载jxl.jar, fastjson.jar(本文以json接口为例),并放到jmeter的lib目录下. 2.开发外部jar包 (1)创建CW

t4模板生成 _references.js 文件

t4模板功能: 指定目录,自动生成 _references.js 文件 相关文件说明: _references.js 实现js智能提示. 注意事项: hostspecific="true" <#@ template debug="false" hostspecific="true" language="C#" #> projectDir=Host.ResolveAssemblyReference("$(P

jsp(servlet)使用poi导出excel数据文件

网站通过Excel导出数据已经成为各种网站的一个基本功能,下面就详细介绍下如何使用poi.jar方式来导出excel文件.具体步骤如下: 1.创建一个网站,下面我创建一个叫test的网站,然后将poi的jar包放入lib文件夹.我这里是下载链接poi-2.5.1.jar. 结构目录如下: 2.然后我们可以创建一个用来访问的jsp界面(主要是提交到servlet,可有可无) 代码如下: <%@ page language="java" import="java.util.

Spring 中 AbstractExcelView 支持根据模板生成Excel文件. 通过设置 view 的 URL 属性指定模板的路径

 注意:1. 模板需放在 WEB-INF 目录下2. 指定模板路径时不需要添加扩展名, Spring将自动添加 .xls 到URL 属性中.3. 在指定URL前需先设置 view 的 ApplicationContext 1. 控制器配置 control-context.xml 1 <bean id="beanNameViewResolver" 2 class="org.springframework.web.servlet.view.BeanNameViewResol

jxls使用模板生成excel文件

http://www.aiduw.com/37/37897/6881409.html http://www.aiduw.com/37/37897/6881410.html http://www.aiduw.com/37/37897/6881411.html http://www.aiduw.com/37/37897/6881412.html http://www.aiduw.com/37/37897/6881413.html http://www.aiduw.com/37/37897/68814

NPOI mvc easyui 根据Excel模板 生成Excel

1.首先下载 NPOI  https://npoi.codeplex.com/releases  只要dll 就好 示例代码库太难懂了. NPOI 是一个开源  免费的 东西.而且不依赖 office.服务端 不安装 office 才行. 其实 这个跟 easyui 关系 不大. @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } <link href="~/

MVC 使用FileResult导出Excel数据文件

FileResult 是一个抽象类,继承自 ActionResult.我们可以使用它的子类向客户端发送文件. 最近项目中需要对某个表格导出位Excel为表格,正好使用了到它,将列表数据构造为html的Table即可. chrom下没问题,其他浏览器兼容性还未测试,先记录下来.在controler中定义如下: public FileResult HtmlTOExcel(List<Survery> surveryList) { var sbHtml = new StringBuilder(); H

求教:c#根据模板生成excel模板,模板可编辑,且可以根据模板上的索引添加相应的值

大家好!我大概是这样,用c#写了一个界面,主要是仪器通信和打印报表,我负责打印报表的那块,我在网上找了一些资料,大概有几种生成方式,比如nopi epplus〈这都很简单〉也有一些参考程序,我的需求:1.找到一种生成报表的方式,能够根据Excel模板,读取模板后在其中对应的地方导入相应的程序,我现在能够实现行列坐标对应〈如图所示的一种方式〉2.实现报表的可编辑功能,1中的方式需要一个固定的映射关系,行列坐标对应,报表可编辑是指用户可以在自定义的Excel模板中插入一个标志,同时与c#建立链接,比