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 ...
随机推荐
- Selenium自动化测试Python二:WebDriver基础
WebDriver基础 欢迎阅读WebDriver基础讲义.本篇讲义将会重点介绍Selenium WebDriver的环境搭建和基本使用方法. WebDriver环境搭建 Selenium WebDr ...
- 【JAVA】异常笔记
自定义异常需要注意: 所有异常都必须是 Throwable 的子类. 如果希望写一个检查性异常类,则需要继承 Exception 类. 如果你想写一个运行时异常类,那么需要继承 RuntimeExce ...
- 牛X的规则引擎urule2
牛X的规则引擎urule2 教程:http://wiki.bsdn.org/pages/viewpage.action?pageId=75071499
- WPF中的TextBlock隐藏边框
TextBlock默认是有边框的,显示效果如下:有一个淡蓝色的边框围绕着 如果需要隐藏这个边框,则只需要在代码中加上以下代码即可: BorderBrush="{x:Null}" B ...
- Python3 中使用sys.argv详解
#/usr/bin/env python #coding:utf-8 import sys # print(sys.argv[1]) def readFile(filename): "&qu ...
- JavaScript 内存泄露以及如何处理
一.前言 一直有打算总结一下JS内存泄露的方面的知识的想法,但是总是懒得提笔. 富兰克林曾经说过:懒惰,像生鏽一样,比操劳更能消耗身体,经常用的钥匙总是亮闪闪的.安利一下,先起个头. 二.内存声明周期 ...
- 搜索过滤Tip : title,site(搜标题和搜网站)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~拿老东家作例子了.........
- 基于GoogLeNet的不同花分类微调训练案例
import tensorflow as tf from tensorflow.contrib.slim import nets slim = tf.contrib.slim import numpy ...
- the first blog in 2017——《论作为程序员的我考研》
怎么说,人总是有了压力才有动力.想来如今已经是2017年2月13日,2017年已经使用了43天,距离成绩出来还有3天.这个过年是最不充实的一个年,也是时间长达一个月久的“寒假”,因为“考研”.至于考到 ...
- (微信小程序)一 : 初识微信小程序
首先看过angularjs的同学们在看微信小程序的创始文件应该不算很陌生吧. 需要看的 先是文件目录 看完这个目录..得知 ( 一 ) pages 他存放于多个页面 如 index ,log ...