C#/Net定时导出Excel并定时发送到邮箱
一、定时导出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 = ;
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 导出Excel1.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并定时发送到邮箱的更多相关文章
- 一、SQL系列之~使用SQL语言导出数据及实现定时导出数据任务
一般情况下,SQL数据库中带有导入与导出数据的直接按键操作,点击数据表所在的数据库--任务--导出/导入数据,根据导入/导出向导直接将数据导出即可. 但导出的数据格式多为Excel格式,如果需要导出的 ...
- MS SQLServer相关自动化程序的问题汇总 (SQLServer每天定时输出EXCEL或xml的格式的问题等 )
· MS SQLServer相关问题 1. 使用MS SQLServer每天定时输出EXCEL格式的文件,实现每天的Excel报表导出 2. 使用MS SQLServer每天定时输出xml格式的文件, ...
- NPOI导出EXCEL报_服务器无法在发送 HTTP 标头之后追加标头
虽然发表了2篇关于NPOI导出EXCEL的文章,但是最近再次使用的时候,把以前的代码粘贴过来,居然报了一个错误: “服务器无法在发送 HTTP 标头之后追加标头” 后来也查询了很多其他同学的文章,都没 ...
- 定时导出用户数据(expdp,impdp)
一 定时导出数据: #!/bin/bash############################################################################### ...
- 通过Linux定时任务实现定时轮询数据库及发送Http请求
通过Linux定时任务实现定时轮询数据库及发送Http请求 概述 有时需要临时增加一个定时任务(需要根据数据库查询结果然后发送HTTP请求),如果在项目中额外增加(Java+Spring+Quartz ...
- ROS 5.x自动定时备份并发送到邮箱(实用)
博主使用ROS已经有很长一段时间了,但经常会忘记备份配置与数据库,加上ROS本身自带的User-Man数据库并不是非常稳定,1年中总会出现1-2次数据丢失的情况.所以费了一定功夫才找到真正可用自动备份 ...
- 使用Apache poi来编写导出excel的工具类
在JavaWeb开发的需求中,我们会经常看到导出excel的功能需求,然后java并没有提供操作office文档的功能,这个时候我们就需要使用额外的组件来帮助我们完成这项功能了. 很高兴Apache基 ...
- PHP导入导出excel表格图片(转)
写excel的时候,我用过pear的库,也用过pack压包的头,同样那些利用smarty等作的简单替换xml的也用过,csv的就更不用谈了.呵呵.(COM方式不讲了,这种可读的太多了,我也写过利用wp ...
- PHP导入导出Excel方法
看到这篇文章的时候,很是惊讶原作者的耐心,虽然我们在平时用的也 有一些,但没有作者列出来的全,写excel的时候,我用过pear的库,也用过pack压包的头,同样那些利用smarty等作的简单替换xm ...
随机推荐
- java和js获取当前天之后或之前7天(任意)日期
一.获取过去第几天的日期(- 操作) 或者 未来 第几天的日期( + 操作) /** * 获取过去第几天的日期(- 操作) 或者 未来 第几天的日期( + 操作) * * @param past * ...
- Mac下安装Eclipse和Tomcat等
Mac下做Java开发还是很方便的,不用像.NET开发一样在Parallel Desktop里面安装Windows虚拟机,Mac下面默认已经安装了JDK. 当然,你如果要安装JDK7,请先阅读:htt ...
- 读书笔记(01) - JSON - JavaScript高级程序设计
JSON与JavaScript对象 JSON是一种表示结构化数据的存储格式,语法格式上与JavasScript对象有些类似. TIPS: 与JavaScript对象的格式区别 不支持变量.函数或对象实 ...
- 全网最详细的Windows系统里Oracle 11g R2 Database服务器端(64bit)的下载与安装(图文详解)
不多说,直接上干货! 环境: windows10系统(64位) 最好先安装jre或jdk(此软件用来打开oracle自带的可视化操作界面,不装也没关系:可以安装plsql,或者直接用命令行操作) Or ...
- 使用Codis-Admin命令配置环境
前提条件:由于22.35.60服务器各自配置了Codis-Service主机,所以22.35.60对应的ip和端口要求能通信和互信访问,为下面通过60的dashboard配置22.35.60实现分组. ...
- Spring Actuator源码分析(转)
转自:http://blog.csdn.net/wsscy2004/article/details/50166333 Actuator Endpoint Actuator模块通过Endpoint暴露一 ...
- JSP 基础(二)
五 注释 5.1 JSP注释 <%--注释内容--%> 5.2 HTML注释 <!--注释内容--> 5.3 Java注释 六 JSP指令 在JSP中有三种类型 ...
- 技术笔记5 MINA 和事务
Java NIO框架MINA用netty性能和链接数.并发等压力测试参数好于mina. 特点:1.NIO弥补了原来的I/O的不足,它再标准java代码中提供了高速和面向块的I/O原力的I/O库与NIO ...
- 使用WireShark分析使用RedisTemplate取不到值的问题
现象:使用Java Redis客户端将数据存放到Redis后,使用redisTemplate却不出来原因:Java Redis客户端在将数据存放在Redis时,会对Key,Value,Field进行编 ...
- MFC函数—CWinApp::LoadStdProfileSettings
从 InitInstance 成员函数内调用该函数,启用和加载最近使用的(MRU)文件和最后浏览状态的列表.void LoadStdProfileSettings( UINT nMaxMRU = ...