一、定时导出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 = ;
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 = ;
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 = * ; //宽度
sheet1.DefaultRowHeightInPoints = ; //高度
//创建一行
IRow row = sheet1.CreateRow();
//创建一列
ICell cell = row.CreateCell();
ICellStyle cellStyle = book.CreateCellStyle();////创建样式对象
IFont font = book.CreateFont(); //创建一个字体样式对象
font.FontName = "方正舒体"; //和excel里面的字体对应
font.FontHeightInPoints = ;//字体大小
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();
row1.CreateCell().SetCellValue("商品编号");
row1.CreateCell().SetCellValue("商品名称");
row1.CreateCell().SetCellValue("销售数量");
row1.CreateCell().SetCellValue("商品售价");
row1.CreateCell().SetCellValue("出售总金额");
//将数据逐步写入sheet1各个行
for (int i = ; i < listSale.Count; i++)
{
NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + );
//创建单元格并设置它的值 ID
rowtemp.CreateCell().SetCellValue(listSale[i].waresCode);
rowtemp.CreateCell().SetCellValue(listSale[i].waresName);
rowtemp.CreateCell().SetCellValue(listSale[i].saleNum);
rowtemp.CreateCell().SetCellValue(listSale[i].waresPrice.ToString());
rowtemp.CreateCell().SetCellValue(listSale[i].saleMoney.ToString());
}
// 写入到客户端
System.IO.MemoryStream ms = new System.IO.MemoryStream();
book.Write(ms);
ms.Seek(, 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, , 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 == ;
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 = * ; //宽度
sheet1.DefaultRowHeightInPoints = ; //高度
//创建一行
IRow row = sheet1.CreateRow();
//创建一列
ICell cell = row.CreateCell();
ICellStyle cellStyle = book.CreateCellStyle();////创建样式对象
IFont font = book.CreateFont(); //创建一个字体样式对象
font.FontName = "方正舒体"; //和excel里面的字体对应
font.FontHeightInPoints = ;//字体大小
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().SetCellValue("商品编号");
row1.CreateCell().SetCellValue("商品名称");
row1.CreateCell().SetCellValue("商品售价");
row1.CreateCell().SetCellValue("商品进价");
row1.CreateCell().SetCellValue("商品单位");
row1.CreateCell().SetCellValue("商品规格");
row1.CreateCell().SetCellValue("货架承载量 ");
row1.CreateCell().SetCellValue("商品预警值");
row1.CreateCell().SetCellValue("当前货架商品数量 ");
// row1.CreateCell(9).SetCellValue("有效标志 ");
//将数据逐步写入sheet1各个行
for (int i = ; i < listCode.Count; i++)
{
NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + );
//创建单元格并设置它的值 ID
rowtemp.CreateCell().SetCellValue(listCode[i].waresCode);
rowtemp.CreateCell().SetCellValue(listCode[i].waresName);
rowtemp.CreateCell().SetCellValue(listCode[i].waresPrice.ToString());
rowtemp.CreateCell().SetCellValue(listCode[i].waresBid.ToString());
rowtemp.CreateCell().SetCellValue(listCode[i].waresUnit);
rowtemp.CreateCell().SetCellValue(listCode[i].waresSpec);
rowtemp.CreateCell().SetCellValue(listCode[i].waresSum.ToString());
rowtemp.CreateCell().SetCellValue(listCode[i].waresWarning.ToString());
rowtemp.CreateCell().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(, SeekOrigin.Begin);
string completePath = pathUnchange + "当前货架商品报表.xls"; using (FileStream fs = new FileStream(completePath, FileMode.Create, FileAccess.Write))
{
byte[] datab = ms.ToArray();
fs.Write(datab, , 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 = ;
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并定时发送到邮箱的更多相关文章

  1. 一、SQL系列之~使用SQL语言导出数据及实现定时导出数据任务

    一般情况下,SQL数据库中带有导入与导出数据的直接按键操作,点击数据表所在的数据库--任务--导出/导入数据,根据导入/导出向导直接将数据导出即可. 但导出的数据格式多为Excel格式,如果需要导出的 ...

  2. MS SQLServer相关自动化程序的问题汇总 (SQLServer每天定时输出EXCEL或xml的格式的问题等 )

    · MS SQLServer相关问题 1. 使用MS SQLServer每天定时输出EXCEL格式的文件,实现每天的Excel报表导出 2. 使用MS SQLServer每天定时输出xml格式的文件, ...

  3. NPOI导出EXCEL报_服务器无法在发送 HTTP 标头之后追加标头

    虽然发表了2篇关于NPOI导出EXCEL的文章,但是最近再次使用的时候,把以前的代码粘贴过来,居然报了一个错误: “服务器无法在发送 HTTP 标头之后追加标头” 后来也查询了很多其他同学的文章,都没 ...

  4. 定时导出用户数据(expdp,impdp)

    一 定时导出数据: #!/bin/bash############################################################################### ...

  5. 通过Linux定时任务实现定时轮询数据库及发送Http请求

    通过Linux定时任务实现定时轮询数据库及发送Http请求 概述 有时需要临时增加一个定时任务(需要根据数据库查询结果然后发送HTTP请求),如果在项目中额外增加(Java+Spring+Quartz ...

  6. ROS 5.x自动定时备份并发送到邮箱(实用)

    博主使用ROS已经有很长一段时间了,但经常会忘记备份配置与数据库,加上ROS本身自带的User-Man数据库并不是非常稳定,1年中总会出现1-2次数据丢失的情况.所以费了一定功夫才找到真正可用自动备份 ...

  7. 使用Apache poi来编写导出excel的工具类

    在JavaWeb开发的需求中,我们会经常看到导出excel的功能需求,然后java并没有提供操作office文档的功能,这个时候我们就需要使用额外的组件来帮助我们完成这项功能了. 很高兴Apache基 ...

  8. PHP导入导出excel表格图片(转)

    写excel的时候,我用过pear的库,也用过pack压包的头,同样那些利用smarty等作的简单替换xml的也用过,csv的就更不用谈了.呵呵.(COM方式不讲了,这种可读的太多了,我也写过利用wp ...

  9. PHP导入导出Excel方法

    看到这篇文章的时候,很是惊讶原作者的耐心,虽然我们在平时用的也 有一些,但没有作者列出来的全,写excel的时候,我用过pear的库,也用过pack压包的头,同样那些利用smarty等作的简单替换xm ...

随机推荐

  1. Prototype原型模式(创建型模式)

    1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...

  2. 【Canal源码分析】配置项

    本文讲解canal中的一些配置含义. 一.配置加载图 二.配置文件canal.properties 2.1 common参数定义 比如可以将instance.properties的公用参数,抽取放置到 ...

  3. Java8-用Lambda表达式给List集合排序

    Lambda用到了JDK8自带的一个函数式接口Comparator<T>. 准备一个Apple类 public class Apple { private int weight; priv ...

  4. 【从0到1学Web前端】CSS伪类和伪元素 分类: HTML+CSS 2015-06-02 22:29 1065人阅读 评论(0) 收藏

    1.CSS中的伪类 CSS 伪类用于向某些选择器添加特殊的效果. 语法: selector : pseudo-class {property: value} CSS 类也可与伪类搭配使用 select ...

  5. Ceph 块设备 - 块设备快速入门

    目录 一.准备工作 二.安装 Ceph 三.使用块存储   一.准备工作 本文描述如何安装 ceph 客户端,使用 Ceph 块设备 创建文件系统并挂载使用. 必须先完成 ceph 存储集群的搭建,并 ...

  6. Yarn和Mesos:资源管理调度平台

    目前得分布式系统中,对于资源管理都采用动态资源划分来取代静态资源划分.它有如下好处: 集群资源利用率高 增加数据共享能力,可以多种计算框架公用一份分布式存储数据. 资源管理抽象模型 概念模型 常见得资 ...

  7. 第一次项目上Linux服务器(二:——安装jdk)

    本人采用的是rpm安装jdk1.8 1.下载jdk 去jdk下载页面找到要下载的jdk 本人下载的是jdk-8u161-linux-x64.rpm,百度云资源链接:链接:https://pan.bai ...

  8. 使用matlibplot.pyplot设置画图的坐标系

    今天看了林轩田老师的感知机算法,心血来潮想要做个可视化过程,以便观察更新的过程. 现将学习成果做个记录,下面是画出来的图,这是初始的状态,后面会通过算法找到一条经过原点的直线将两堆数据分割开来. 直线 ...

  9. dom操作------获取元素的若干方法

    // 1,getElementById:返回元素节点document.getElementById(); // 2,getElementsByClassName:返回HTMLCollection对象( ...

  10. C# Code First 配置

    前言 所谓code first,是代码优先,而不是传统的数据库优先. code first的好处多多,可不用考虑数据库,只考虑面向对象.下面我们介绍一下code first的配置. 下一篇文章地址:C ...