zoukankan      html  css  js  c++  java
  • C#/Net定时导出Excel并定时发送到邮箱

     

     

    一、定时导出Excel并定时发送到邮箱

     

    首先我们先分析一下该功能有多少个小的任务点:1.Windows计划服务

    2.定时导出Excel定指定路径

    3.定时发送邮件包含附件

     

    接下来我们一个个解决,

     

    1.1发送邮件

     

    1. 现提供一下相关资料:

     

    http://www.cnblogs.com/ForEvErNoME/archive/2012/06/05/2529259.html

     

    1. 了解SMTP服务器

     

    SMTP具体是指什么?

    SMTP的全称是"Simple Mail Transfer Protocol",即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。

    1. 了解常用邮件服务器(例如:QQ邮箱,网易邮箱,新浪邮箱,163邮箱

    这里以QQ邮箱为例讲解如何注册邮件服务器:

    首先需要注册对应服务提供商免费邮箱,因为你要使用邮件服务提供商的SMTP,他们需要对身份进行验证,这样可以避免产生大量的垃圾邮件。

     注册方式:打开QQ上的QQ邮箱,点击设置,选择账号,找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,第一个pop3、SMTP服务,点击后面的 开启,会弹出密保验证,根据要求发短信到号码,发送至后会给你一个密码(一定要记住此密码,这是登陆的凭证)

    相关参数:QQ邮箱STMP服务器地址为stmp.qq.com,端口为25(别的邮箱自行百度)

    到此,注册邮箱服务器就完成了。

     

     

    1. 接下来我们看如何用程序发送邮件

    这里可以参考相关资料:

    再次,附上自己的源代码,仅供参考

       需要导入命名空间 using System.Net.Mail;

    public static void SendEmail()
            {
                //声明一个Mail对象     
                MailMessage mymail = new MailMessage();
                mymail.Attachments.Add(new Attachment("D:\mail.txt"));  //为该电子邮件添加附件   附件的路径     
    //如果是多个附件 继续.Add()
                mymail.Attachments.Add(new Attachment("C:\mail.txt"));
                //发件人地址 
                //如是自己,在此输入自己的邮箱   
                mymail.From = new MailAddress(“发件人邮箱号”)
                //收件人地址
                mymail.To.Add(new MailAddress(“收件人邮箱号”));
                //邮件主题
                mymail.Subject = “邮件主题…”;
                //邮件标题编码
                mymail.SubjectEncoding = System.Text.Encoding.UTF8;
                //发送邮件的内容
                mymail.Body =“邮件内容…”;
                //邮件内容编码
                mymail.BodyEncoding = System.Text.Encoding.UTF8;
                //抄送到其他邮箱
                mymail.CC.Add(new MailAddress(“抄送邮箱号”));
                //是否是HTML邮件
                mymail.IsBodyHtml = true;
                //邮件优先级
                mymail.Priority = MailPriority.High;
                //创建一个邮件服务器类  
                SmtpClient myclient = new SmtpClient();
                myclient.Host = "SMTP.qq.com"; //qq邮箱服务器地址,不同的邮箱不同
                //SMTP服务端口s
                myclient.Port = 25;
                myclient.EnableSsl = true;
                //验证登录  
                myclient.Credentials = new NetworkCredential(EmailKey, PasswordKey);//"@"输入有效的邮箱名, "*"输入有效的密码(此密码就是注册邮箱服务器是发送短信后给的密码)
                myclient.Send(mymail);
                Console.WriteLine("导出Excel成功!");
            }
    然而这种方法有一定的弊端,程序发布后,.cs文件不可编辑,而配置文件可以用记事本的方式打开编辑,所以跟数据库的连接字符串一个性质,我们把相关可变的信息放到连接字符串。
    在配置文件中进行以下操作:
    <appSettings> 节点添加以下内容:key  value 的形式
      <appSettings>
        <add key="FromKey" value="727472902@qq.com" /> <!—发件人  -->
        <!--如果发给多个人  改这里  NPOI 教程   http://www.cnblogs.com/atao/archive/2009/11/15/1603528.html "-->
        <add key="ToAddKey" value="727472902@qq.com" />  <!—收件人  -->
        <!—主题  -->
        <add key="SubjectKey" value="仓鲜智能便利店" />
        <!—内容-->
    <add key="BodyKey" value="今日销售报表相关情况" />
        <!--抄送人-->
    <add key="CCAddKey" value="222222@qq.com" />
    <!—邮箱服务器  -->
    <add key="EmailKey" value="222****222@qq.com" />
    <!—邮箱服务器 密码 -->
        <add key="PasswordKey" value="cau****yudhi" />  
      </appSettings>
    接下来看看后台代码如何使用它:
    public static void SendEmail()
            {
                //声明一个Mail对象     
                MailMessage mymail = new MailMessage();
                mymail.Attachments.Add(new Attachment(ExportExcelSaleDetail()));  //为该电子邮件添加附件       
                mymail.Attachments.Add(new Attachment(ExportExcelStorage()));
                //发件人地址 
                //配置文件的方式读取   在这里读取配置文件中的内容  需要引入
    //using System.Configuration;
                var FromKey = ConfigurationManager.AppSettings["FromKey"].ToString();
    //对应配置文件中的key
                var ToAddKey = ConfigurationManager.AppSettings["ToAddKey"].ToString();
                var SubjectKey = ConfigurationManager.AppSettings["SubjectKey"].ToString();
                var BodyKey = ConfigurationManager.AppSettings["BodyKey"].ToString();
                var CCAddKey = ConfigurationManager.AppSettings["CCAddKey"].ToString();
                var EmailKey = ConfigurationManager.AppSettings["EmailKey"].ToString();
                var PasswordKey = ConfigurationManager.AppSettings["PasswordKey"].ToString();
                //----在这里用configuration 那个类 和读取连接字符串似得 读取刚才的key ---
                mymail.From = new MailAddress(FromKey);
                //收件人地址
                mymail.To.Add(new MailAddress(ToAddKey));
                //邮件主题
                mymail.Subject = SubjectKey;
                //邮件标题编码
                mymail.SubjectEncoding = System.Text.Encoding.UTF8;
                //发送邮件的内容
                mymail.Body = BodyKey;
                //邮件内容编码
                mymail.BodyEncoding = System.Text.Encoding.UTF8;
                //抄送到其他邮箱
                mymail.CC.Add(new MailAddress(CCAddKey));
                //是否是HTML邮件
                mymail.IsBodyHtml = true;
                //邮件优先级
                mymail.Priority = MailPriority.High;
                //创建一个邮件服务器类  
                SmtpClient myclient = new SmtpClient();
                myclient.Host = "SMTP.qq.com";
                //SMTP服务端口s
                myclient.Port = 25;
                myclient.EnableSsl = true;
                //验证登录  
                myclient.Credentials = new NetworkCredential(EmailKey, PasswordKey);//"@"输入有效的邮件名, "*"输入有效的密码
                myclient.Send(mymail);
                Console.WriteLine("导出Excel成功!");
            }
    再次发送邮件的相关内容就完成了…下面我们学习.net MVC + NPOI 导出Excel

    1.2导出Excel到定指路径

    1.去官网下载 NPOI相关dll文件:http://npoi.codeplex.com/downloads/get/1572743

    2.在项目中添加引用

    Net40文件夹下的NPOI.Dll文件复制到自己的项目中的相关文件夹下,添加引用,浏览,找到刚刚的NPOI.Dll文件,确定

    下面直接上代码:
            public FileResult ExportExcel(string wareName, string date1, string date2)
            {             //创建一个工作簿
    NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
                //添加一个sheet     //创建一个页
                NPOI.SS.UserModel.ISheet sheet1 = book.CreateSheet("Sheet1");
                //设置单元格 的宽高
                sheet1.DefaultColumnWidth = 1 * 25;  //宽度
                sheet1.DefaultRowHeightInPoints = 25;  //高度
                //创建一行
                IRow row = sheet1.CreateRow(0);
                //创建一列
                ICell cell = row.CreateCell(0);
                ICellStyle cellStyle = book.CreateCellStyle();////创建样式对象
                IFont font = book.CreateFont(); //创建一个字体样式对象
                font.FontName = "方正舒体"; //和excel里面的字体对应
                font.FontHeightInPoints = 16;//字体大小
                font.Boldweight = short.MaxValue;//字体加粗
                cellStyle.SetFont(font); //将字体样式赋给样式对象
                cellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//垂直对齐
                cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//水平对齐  
                cell.CellStyle = cellStyle; //把样式赋给单元格
                //给sheet1添加第一行的头部标题
                NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(0);
                row1.CreateCell(0).SetCellValue("商品编号");
                row1.CreateCell(1).SetCellValue("商品名称");
                row1.CreateCell(2).SetCellValue("销售数量");
                row1.CreateCell(3).SetCellValue("商品售价");
                row1.CreateCell(4).SetCellValue("出售总金额");
                //将数据逐步写入sheet1各个行
                for (int i = 0; i < listSale.Count; i++)
                {
                    NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 1);
                    //创建单元格并设置它的值 ID
                    rowtemp.CreateCell(0).SetCellValue(listSale[i].waresCode);
                    rowtemp.CreateCell(1).SetCellValue(listSale[i].waresName);
                    rowtemp.CreateCell(2).SetCellValue(listSale[i].saleNum);
                    rowtemp.CreateCell(3).SetCellValue(listSale[i].waresPrice.ToString());
                    rowtemp.CreateCell(4).SetCellValue(listSale[i].saleMoney.ToString());
                }
                // 写入到客户端 
                System.IO.MemoryStream ms = new System.IO.MemoryStream();
                book.Write(ms);
                ms.Seek(0, SeekOrigin.Begin);
                string a = DateTime.Now.ToString("yyyyMMddHHmmssffff");//这个路径 有 :等符号,路径不支持
               //这里是导出到指定的路径
                string PPath = @"C:UsersAdministratorDesktop新建文件夹 (2)YuanManagerTestWinPlaneExcel" + a + "商品销售明细报表.xls";
                using (FileStream fs = new FileStream(PPath, FileMode.Create, FileAccess.Write))
                {
                    byte[] datab = ms.ToArray();
                    fs.Write(datab, 0, datab.Length);
                    fs.Flush();
                }
                ms.Close();
                ms.Dispose();
    return File(ms, "application/vnd.ms-excel", a + "销售明细统计.xls");
    }
    }

    1.3 定时计划任务

    1.新建项目à 创建控制台应用程序

      把定时导出跟定时发送邮件的代码写在这里面:(下面直接上代码)

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Manager.BLL;
    using NPOI.SS.UserModel;
    using System.IO;
    using System.Linq.Expressions;
    using System.Web;
    using System.Web.Mvc;
    using Manager;
    using System.Net;
    using System.Net.Mail;
    using System.Configuration;
    using System.Diagnostics;
    
    namespace TestWinPlane
    {
        public class Program
        {
    
            public static BaseBll<usersorder> bllorder
            {
                get
                {
                    return new UsersOrderBll();
                }
            }
            static Wares2Bll wareBll = new Wares2Bll();
            public static UserBll userbll = new UserBll();
            public static void Main(string[] args)
            {
                //这个里面写你发送邮件的代码  让 win计划去执行他  
                Console.WriteLine("发送邮件!!");
                ExportExcelSaleDetail();
                ExportExcelStorage();
                SendEmail();
                //DeleteIO();
            }
            //当前货架商品统计
            public static Manager.BLL.BaseBll2<wares> bll
            {
                get
                {
                    return new Wares2Bll();
                }
            }
    
            public class ListSalePro
            {
                public string waresCode { get; set; }
                public string waresName { get; set; }
                public decimal waresPrice { get; set; }    //单价
                public decimal saleMoney { get; set; }   // 出售总金额
                public int saleNum { get; set; }   //出售数量
                public decimal buyonePrice;
                public decimal buyMoney;
                public decimal ProfitMoney;
            }
            public class ListWare
            {
                public string waresCode { get; set; }
                public string waresName { get; set; }
                public long  saleNum { get; set; }
    
            }
            static string a = DateTime.Now.ToString("yyyyMMddHHmm");//这个路径 有 :等符号,路径不支持
    
            static string pathUnchange = @"C:Excel" + a; //导出的Excel 要存放的路径
    
            static string ExportExcelSaleDetailPath = "";//商品销售明细报表路径
    
            static string ExportExcelStoragePath = "";//货架上商品统计报表路径
    
            static OrderDetailsBll orderDetailBll = new OrderDetailsBll();
            /// <summary>
            /// 当前货架商品统计报表
            /// </summary>
            /// <returns></returns>
            public static string ExportExcelStorage()
            {
                // 1.先筛选出   有效的商品   == 1 ? "有效" : "已下架"
                Expression<Func<wares, bool>> condition1 = x => x.validstatus == 1;
                var listCode = bll.Search2(condition1).Select(x => new { x.waresCode, x.waresName, x.waresActual, x.waresBid, x.waresPrice, x.waresSum, x.waresSpec, x.waresUnit, x.validstatus , x.waresWarning }).ToList();
                //创建一个工作簿
                NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
                //添加一个sheet     //创建一个页
                NPOI.SS.UserModel.ISheet sheet1 = book.CreateSheet("Sheet1");
                //设置单元格 的宽高
                sheet1.DefaultColumnWidth = 1 * 25;  //宽度
                sheet1.DefaultRowHeightInPoints = 25;  //高度
                //创建一行
                IRow row = sheet1.CreateRow(0);
                //创建一列
                ICell cell = row.CreateCell(0);
                ICellStyle cellStyle = book.CreateCellStyle();////创建样式对象
                IFont font = book.CreateFont(); //创建一个字体样式对象
                font.FontName = "方正舒体"; //和excel里面的字体对应
                font.FontHeightInPoints = 16;//字体大小
                font.Boldweight = short.MaxValue;//字体加粗
                cellStyle.SetFont(font); //将字体样式赋给样式对象
                //设置单元格的样式:水平对齐居中
                cellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//垂直对齐
                cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//水平对齐  这两个在这里不起作用
                cell.CellStyle = cellStyle; //把样式赋给单元格   
                //给sheet1添加第一行的头部标题               NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(0);
                row1.CreateCell(0).SetCellValue("商品编号");
                row1.CreateCell(1).SetCellValue("商品名称");
                row1.CreateCell(2).SetCellValue("商品售价");
                row1.CreateCell(3).SetCellValue("商品进价");
                row1.CreateCell(4).SetCellValue("商品单位");
                row1.CreateCell(5).SetCellValue("商品规格");
                row1.CreateCell(6).SetCellValue("货架承载量 ");
                row1.CreateCell(7).SetCellValue("商品预警值");
                row1.CreateCell(8).SetCellValue("当前货架商品数量 ");
             //   row1.CreateCell(9).SetCellValue("有效标志 ");
                //将数据逐步写入sheet1各个行
                for (int i = 0; i < listCode.Count; i++)
                {
                    NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 1);
                    //创建单元格并设置它的值 ID
                    rowtemp.CreateCell(0).SetCellValue(listCode[i].waresCode);
                    rowtemp.CreateCell(1).SetCellValue(listCode[i].waresName);
                    rowtemp.CreateCell(2).SetCellValue(listCode[i].waresPrice.ToString());
                    rowtemp.CreateCell(3).SetCellValue(listCode[i].waresBid.ToString());
                    rowtemp.CreateCell(4).SetCellValue(listCode[i].waresUnit);
                    rowtemp.CreateCell(5).SetCellValue(listCode[i].waresSpec);
                    rowtemp.CreateCell(6).SetCellValue(listCode[i].waresSum.ToString());
                    rowtemp.CreateCell(7).SetCellValue(listCode[i].waresWarning.ToString());
                    rowtemp.CreateCell(8).SetCellValue(listCode[i].waresActual.ToString());
                  //  rowtemp.CreateCell(9).SetCellValue(listCode[i].validstatus==1?"有效":"已下架");
                }
                // 写入到客户端 
                System.IO.MemoryStream ms = new System.IO.MemoryStream();
                book.Write(ms);
                ms.Seek(0, SeekOrigin.Begin);
                string completePath = pathUnchange + "当前货架商品报表.xls";
    
                using (FileStream fs = new FileStream(completePath, FileMode.Create, FileAccess.Write))
                {
                    byte[] datab = ms.ToArray();
                    fs.Write(datab, 0, datab.Length);
                    fs.Flush();
                    fs.Dispose();
                }
                ms.Close();
                ms.Dispose();
                ExportExcelStoragePath = completePath;
                return ExportExcelStoragePath;
            }
      
            /// <summary>
            ///发送邮件  导入命名空间 using System.Net.Mail;  
            /// </summary>
            public static void SendEmail()
            {
                //声明一个Mail对象     
                MailMessage mymail = new MailMessage();
                mymail.Attachments.Add(new Attachment(ExportExcelSaleDetailPath));  //为该电子邮件添加附件       
                mymail.Attachments.Add(new Attachment(ExportExcelStoragePath));
                //发件人地址 
                //如是自己,在此输入自己的邮箱   
                //配置文件的方式读取
                var FromKey = ConfigurationManager.AppSettings["FromKey"].ToString();
                var ToAddKey = ConfigurationManager.AppSettings["ToAddKey"].ToString();
                var SubjectKey = ConfigurationManager.AppSettings["SubjectKey"].ToString();
                var BodyKey = ConfigurationManager.AppSettings["BodyKey"].ToString();
                var CCAddKey = ConfigurationManager.AppSettings["CCAddKey"].ToString();
                var EmailKey = ConfigurationManager.AppSettings["EmailKey"].ToString();
                var PasswordKey = ConfigurationManager.AppSettings["PasswordKey"].ToString();
                //----在这里用configuration 那个类 和读取连接字符串似得 读取刚才的key ---
                mymail.From = new MailAddress(FromKey);
                //收件人地址
                mymail.To.Add(new MailAddress(ToAddKey));
                //邮件主题
                mymail.Subject = SubjectKey;
                //邮件标题编码
                mymail.SubjectEncoding = System.Text.Encoding.UTF8;
                //发送邮件的内容
                mymail.Body = BodyKey;
                //邮件内容编码
                mymail.BodyEncoding = System.Text.Encoding.UTF8;
                //添加附件
                //Attachment myfiles = new Attachment(tb_Attachment.PostedFile.FileName);
                //mymail.Attachments.Add(myfiles);   
                //抄送到其他邮箱
                mymail.CC.Add(new MailAddress(CCAddKey));
                //是否是HTML邮件
                mymail.IsBodyHtml = true;
                //邮件优先级
                mymail.Priority = MailPriority.High;
                //创建一个邮件服务器类  
                SmtpClient myclient = new SmtpClient();
                myclient.Host = "SMTP.qq.com";
                //SMTP服务端口s
                myclient.Port = 25;
                myclient.EnableSsl = true;
                //验证登录  
                myclient.Credentials = new NetworkCredential(EmailKey, PasswordKey);//"@"输入有效的邮件名, "*"输入有效的密码
                myclient.Send(mymail);
                Console.WriteLine("导出Excel成功!");
            }
        }
    }

     

    2.代码完成之后,运行看看能不能正常运行,正常之后 就该开始部署Windows计划任务了,

    1.打开电脑的控制面板-->选择小图标-->管理工具-->任务计划程序-->新文件夹-->创建任务

     

    2.选择触发器选项卡,点击新建,根据自己的需求选择执行的时间

    3.选择操作选项卡,点击下方的新建,点击浏览,选择自己项目下的bin文件夹àDebugà选择自己项项目的.exe文件,下面添加参数 可以忽略,点击确定

    4.还有条件 跟 设置选项卡,在这里根据需求自己选择。

    到此,定时导出跟发送邮件的相关信息就完成了。

     

  • 相关阅读:
    【原创】python中文编码问题:控制窗口能输出中文,到文本文件里乱码
    【转载】在notepad++中直接运行python代码
    报错The reference to entity "characterEncoding" must end with the ';' delimiter
    原码, 反码, 补码 详解
    GC 过程图解
    Java NIO:浅析I/O模型
    Java类加载器的工作原理
    修改classloader的加载路径
    ThreadLocal 源码分析
    冒泡排序、快速排序、堆排序
  • 原文地址:https://www.cnblogs.com/gdsblog/p/7858014.html
Copyright © 2011-2022 走看看