码迷,mamicode.com
首页 > Windows程序 > 详细

C#/Net定时导出Excel并定时发送到邮箱

时间:2017-11-18 23:40:21      阅读:354      评论:0      收藏:0      [点我收藏+]

标签:ges   mail   poi   对象   .com   源代码   margin   数据   eric   

 

 

一、定时导出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:\Users\Administrator\Desktop\新建文件夹 (2)\Yuan\Manager\TestWinPlane\Excel\" + 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.还有条件 跟 设置选项卡,在这里根据需求自己选择。

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

 

C#/Net定时导出Excel并定时发送到邮箱

标签:ges   mail   poi   对象   .com   源代码   margin   数据   eric   

原文地址:http://www.cnblogs.com/gdsblog/p/7858014.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!