您的位置:首页 > 编程语言 > C#

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

2017-11-18 21:31 661 查看


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

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

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

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

接下来我们一个个解决,

1.1发送邮件

现提供一下相关资料:

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

了解SMTP服务器

SMTP具体是指什么?

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

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

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

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

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









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

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

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

这里可以参考相关资料:

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

需要导入命名空间 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.还有条件 跟 设置选项卡,在这里根据需求自己选择。

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: