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;
}