Dotnet Example
dotnet code examples
Ms Excel and Outlook
using System;
using Outlook = Microsoft.Office.Interop.Outlook;
using Excel = Microsoft.Office.Interop.Excel;
using System.Data;
using System.IO;
namespace ConsoleOutlookExcel
{
class Program
{
static void Main(string[] args)
{
DataTable tableToExport = new DataTable("Zakaz");
tableToExport.Columns.Add("Code", typeof(int));
tableToExport.Columns.Add("Articul", typeof(string));
tableToExport.Columns.Add("Name", typeof(string));
tableToExport.Columns.Add("Count", typeof(int));
tableToExport.Rows.Add(1233, "f9874fh39874", "Nomenklature", 5);
tableToExport.Rows.Add(1234, "f9874fh39874", "Nomenklature", 4);
tableToExport.Rows.Add(1235, "f9874fh39874", "Nomenklature", 3);
tableToExport.Rows.Add(1236, "f9874fh39874", "Nomenklature", 2);
tableToExport.Rows.Add(1237, "f9874fh39874", "Nomenklature", 1);
string fileFullPath = Path.GetTempPath() + "Zakaz" + DateTime.Now.ToString("ddMMyyhhmmss");
CreateExcel(tableToExport, fileFullPath);
CreateEmail(fileFullPath);
}
private static void CreateExcel(DataTable table, string fileFullPath)
{
var excel = new Excel.Application();
excel.Visible = false;
excel.DisplayAlerts = false;
var workbook = excel.Workbooks.Add(Type.Missing);
var worksheet = (Excel.Worksheet)workbook.ActiveSheet;
worksheet.Name = table.TableName;
worksheet.Cells[1, 1] = "Code";
worksheet.Cells[1, 2] = "Articul";
worksheet.Cells[1, 3] = "Name";
worksheet.Cells[1, 4] = "Count";
for (int i = 0; i < table.Rows.Count; i++)
{
worksheet.Cells[i + 2, 1] = table.Rows[i][0].ToString();
worksheet.Cells[i + 2, 2] = table.Rows[i][1].ToString();
worksheet.Cells[i + 2, 3] = table.Rows[i][2].ToString();
worksheet.Cells[i + 2, 4] = table.Rows[i][3].ToString();
}
workbook.SaveAs(fileFullPath);
workbook.Close();
}
private static void CreateEmail(string pathAttachments)
{
var mail = new Outlook.Application();
var mailItem = mail.CreateItem(Outlook.OlItemType.olMailItem);
mailItem.Subject = "Quarterly Sales Report FY06 Q4";
mailItem.To = "someone@example.com";
mailItem.Attachments.Add(pathAttachments + ".xlsx", Outlook.OlAttachmentType.olByValue, Type.Missing, Type.Missing);
mailItem.Display(true);
}
}
}
using System;
using System.Net.Mail;
using Outlook = Microsoft.Office.Interop.Outlook;
using Microsoft.CSharp;
namespace LibForms.Utils
{
/// <summary>
/// Вспомогательный класс для работы с электронной почтой
/// </summary>
public static class EmailUtils
{
/// <summary>
/// Отправка почты
/// </summary>
/// <param name="fromMail">Email от кого отправляем</param>
/// <param name="toMail">Email кому отправляем</param>
/// <param name="subject">Тема письма</param>
/// <param name="msg">Текст письма</param>
public static void SendEmail(string fromMail, string toMail, string subject, string msg)
{
using (var mail = new MailMessage())
using (var client = new SmtpClient())
{
mail.From = new MailAddress(fromMail);
mail.To.Add(new MailAddress(toMail));
mail.Subject = subject;
mail.Body = msg;
client.Host = "exch.elektro.ru";
client.Port = 25;
client.EnableSsl = false;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Send(mail);
}
}
/// <summary>
/// Создает новое сообщение Outlook
/// </summary>
/// <param name="recipient">Email адресата</param>
/// <param name="subject">Тема сообщения</param>
/// <param name="body">Тело сообщения</param>
/// <param name="pathAttachments">Путь к файлу вложения</param>
public static void CreateOutlookNewEmail(string recipient, string subject, string body, string pathAttachments = "")
{
var mail = new Outlook.Application();
Outlook.MailItem mailItem = mail.CreateItem(Outlook.OlItemType.olMailItem);
mailItem.To = recipient;
if (!string.IsNullOrWhiteSpace(subject))
mailItem.Subject= subject;
if (!string.IsNullOrWhiteSpace(body))
mailItem.Body = body;
if (!string.IsNullOrWhiteSpace(pathAttachments))
mailItem.Attachments.Add(pathAttachments, Outlook.OlAttachmentType.olByValue, Type.Missing, Type.Missing);
mailItem.Display(true);
}
}
}
//Работа с Excel
namespace LibForms.Utils
{
/// <summary>
/// Вспомогательный класс для работы с Excel
/// </summary>
public static class ExcelUtils
{
/// <summary>
/// Создает файл Excel из одного листа с данными из DataTable
/// </summary>
/// <param name="table">DataTable с данными</param>
/// <param name="fileFullPath">Путь для сохранения файла, если расширение не указано, добавиться автоматически</param>
public static void CreateExcelWorksheet(DataTable table, string fileFullPath)
{
var excel = new Excel.Application();
excel.Visible = false;
excel.DisplayAlerts = false;
var workbook = excel.Workbooks.Add(Type.Missing);
var worksheet = (Excel.Worksheet)workbook.ActiveSheet;
if (!string.IsNullOrWhiteSpace(table.TableName))
worksheet.Name = table.TableName;
//добавим заголовки в первую строку
//в екселе нумерация ячеек начинается с 1
for(int i = 0; i < table.Columns.Count; i++)
{
worksheet.Cells[1, i + 1] = table.Columns[i].ColumnName.ToString();
//ПолуЖирный шрифт для первой строки c данными
worksheet.get_Range(worksheet.Cells[1, i + 1], worksheet.Cells[1, i + 1]).Font.Bold = true;
}
//Перенесем строки с данными
//Первая строка в екселе занята заголовками, поэтому i + 2
//i - строка, j - колонка
for (int i = 0; i < table.Rows.Count; i++)
{
for(int j = 0; j < table.Columns.Count; j++)
{
worksheet.Cells[i + 2, j + 1] = table.Rows[i][j];//.ToString();
}
}
worksheet.Columns.AutoFit();
//Сохраняем, закрываем
workbook.SaveAs(fileFullPath);
workbook.Close();
excel.Quit();
}
}
}
Object to Type
/// <summary>
/// Если значение obj не NULL, то возвращает значение приведеное к типу T, иначе defValue
/// </summary>
/// <param name="obj">Ссылка на объект</param>
/// <param name="defValue">Значение по-умолчанию</param>
/// <returns>Значение, приведеное к типу T</returns>
public static T IsNull<T>(object obj, T defValue)
{
return IsNull(obj) ? defValue : (T)Convert.ChangeType(Convert.ChangeType(obj, obj.GetType()), typeof(T));
}
Linq
/// <summary>
/// Формирует данные для отправки заказа по Емаил без учета переупаковки
/// из того что есть в dataSetDoc66Elem.ak_selDoc66_VT1
/// </summary>
/// <returns>DataTable с данными</returns>
private DataTable CreateDataToSendEmail()
{
//группируем данные для суммирования одинаковых позиций из заказа
//временно, пока не разобрался с переупаковкой, потом переедет на SQL Server
var grouped = from n in dataSetDoc66Elem.ak_selDoc66_VT1.AsEnumerable()
group n by new
{
IDNomenkl = n.Field<int>("IDNomenkl"),
Artikul = n.Field<string>("Artikul"),
NameNomenkl = n.Field<string>("NameNomenkl"),
NameEdIzm = n.Field<string>("NameEdIzm")
}
into g
select new {
IDNomenkl = g.Key.IDNomenkl,
Artikul = g.Key.Artikul,
NameNomenkl = g.Key.NameNomenkl,
Kol = g.Sum(x => x.Field<decimal>("Kol")),
NameEdIzm = g.Key.NameEdIzm
};
//Формируем таблицу для отправки
DataTable table = new DataTable("Заказ");
table.Columns.Add("Код", typeof(int));
table.Columns.Add("Артикул", typeof(string));
table.Columns.Add("Наименование", typeof(string));
table.Columns.Add("Количество", typeof(decimal));
table.Columns.Add("Ед.изм.", typeof(string));
//копируем нужную информацию в таблицу на отправку
foreach (var r in grouped)
{
table.Rows.Add(
r.IDNomenkl,
r.Artikul,
r.NameNomenkl,
r.Kol,
r.NameEdIzm
);
}
return table;
}