ارسال پاسخ 
 
امتیاز موضوع:
  • 1 رأی - میانگین امتیازات: 5
  • 1
  • 2
  • 3
  • 4
  • 5
نکته های مفید و حرفه ای در سی شارپ C#
01-02-2015, 09:25 PM
ارسال: #13
یک کلاس پر کاربرد برای ایجاد خروجی Excel در سی شارپ Export to Excel C#
با استفاده از این کلاس می توانید خروجی اکسل از دیتای خود ایجاد نمایید. ورودی متد این کلاس بایستی یک دیتا ست باشد که شامل دیتاتیبل است.

کد:
using System;
using System.IO;
using System.Data;
using System.Text;

    class ExcelXMLExportHelper
    {
        // Get a string with excel's XML headers    
        private static string getXMLWorkbookTemplate()
        {
            StringBuilder sb = new StringBuilder(818);

            sb.AppendFormat(@"<?xml version=""1.0""?>{0}", Environment.NewLine);
            sb.AppendFormat(@"<?mso-application progid=""Excel.Sheet""?>{0}", Environment.NewLine);
            sb.AppendFormat(@"<Workbook xmlns=""urn:schemas-microsoft-com:office:spreadsheet""{0}", Environment.NewLine);
            sb.AppendFormat(@" xmlns:o=""urn:schemas-microsoft-com:office:office""{0}", Environment.NewLine);
            sb.AppendFormat(@" xmlns:x=""urn:schemas-microsoft-com:office:excel""{0}", Environment.NewLine);
            sb.AppendFormat(@" xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet""{0}", Environment.NewLine);
            sb.AppendFormat(@" xmlns:html=""http://www.w3.org/TR/REC-html40"">{0}", Environment.NewLine);
            sb.AppendFormat(@" <ss:Styles>{0}", Environment.NewLine);
            sb.AppendFormat(@"  <ss:Style ss:ID=""Default"" ss:Name=""Normal"">{0}", Environment.NewLine);
            sb.AppendFormat(@"   <ss:Alignment ss:Vertical=""Bottom""/>{0}", Environment.NewLine);

            sb.AppendFormat(@"   <ss:Font ss:FontName=""Calibri"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000""/>{0}", Environment.NewLine);
            sb.AppendFormat(@"   <ss:Interior/>{0}", Environment.NewLine);
            sb.AppendFormat(@"   <ss:NumberFormat/>{0}", Environment.NewLine);
            sb.AppendFormat(@"   <ss:Protection/>{0}", Environment.NewLine);
            sb.AppendFormat(@"  </ss:Style>{0}", Environment.NewLine);

            sb.AppendFormat(@"  <ss:Style ss:ID=""s62"">{0}", Environment.NewLine);

            sb.AppendFormat(@"   <ss:Borders>{0}", Environment.NewLine);
            sb.AppendFormat(@"   <ss:Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1"" />{0}", Environment.NewLine);
            sb.AppendFormat(@"   <ss:Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1"" />{0}", Environment.NewLine);
            sb.AppendFormat(@"   <ss:Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1"" />{0}", Environment.NewLine);
            sb.AppendFormat(@"   <ss:Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1"" />{0}", Environment.NewLine);
            sb.AppendFormat(@"   </ss:Borders>{0}", Environment.NewLine);

            sb.AppendFormat(@"   <ss:Font ss:FontName=""Calibri"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000""{0}", Environment.NewLine);
            sb.AppendFormat(@"    ss:Bold=""1""/>{0}", Environment.NewLine);
            sb.AppendFormat(@"  </ss:Style>{0}", Environment.NewLine);
            sb.AppendFormat(@"  <ss:Style ss:ID=""s63"">{0}", Environment.NewLine);
            sb.AppendFormat(@"   <ss:NumberFormat ss:Format=""Short Date""/>{0}", Environment.NewLine);
            sb.AppendFormat(@"  </ss:Style>{0}", Environment.NewLine);


            sb.AppendFormat(@"  <ss:Style ss:ID=""s60"">{0}", Environment.NewLine);
            sb.AppendFormat(@"   <ss:Alignment ss:Vertical=""Bottom""/>{0}", Environment.NewLine);

            sb.AppendFormat(@"   <ss:Borders>{0}", Environment.NewLine);
            sb.AppendFormat(@"   <ss:Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1"" />{0}", Environment.NewLine);
            sb.AppendFormat(@"   <ss:Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1"" />{0}", Environment.NewLine);
            sb.AppendFormat(@"   <ss:Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1"" />{0}", Environment.NewLine);
            sb.AppendFormat(@"   <ss:Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1"" />{0}", Environment.NewLine);
            sb.AppendFormat(@"   </ss:Borders>{0}", Environment.NewLine);

            sb.AppendFormat(@"  </ss:Style>{0}", Environment.NewLine);


            sb.AppendFormat(@" </ss:Styles>{0}", Environment.NewLine);

            sb.Append(@"{0}\r\n</Workbook>");
            return sb.ToString();
        }

        // some special characters replacement (escaping)
        private static string replaceXmlChar(string input)
        {
            input = input.Replace("&", "&amp");
            input = input.Replace("<", "&lt;");
            input = input.Replace(">", "&gt;");
            input = input.Replace("\"", "&quot;");
            input = input.Replace("'", "&apos;");
            return input;
        }

        // get the xml formatted string for an specific data cell,
        // we translate c# types to excel data types and fix the nulls
        // plus the option to give border to the cell
        private static string getCellXml(Type type, object cellData, bool hasBorder)
        {
            object data = (cellData is DBNull) ? "" : cellData;

            string border;
            if (hasBorder)
                border = @" ss:StyleID=""s60""";
            else
                border = "";

            if (type.Name.Contains("Int") || type.Name.Contains("Double") || type.Name.Contains("Decimal") || type.Name.Contains("decimal"))
            {
                return string.Format(String.Format("<Cell{0}><Data ss:Type=\"Number\">{{0}}</Data></Cell>", border), data);
            }


            if (type.Name.Contains("Date") && data.ToString() != string.Empty)
            {
                return string.Format("<Cell ss:StyleID=\"s63\"><Data ss:Type=\"DateTime\">{0}</Data></Cell>", Convert.ToDateTime(data).ToString("yyyy-MM-dd"));
            }

            decimal nad = 0;
            if (decimal.TryParse(cellData.ToString(), out nad))
            {
                return string.Format(String.Format("<Cell{0}><Data ss:Type=\"Number\">{{0}}</Data></Cell>", border), data);
            }

            return string.Format(String.Format("<Cell{0}><Data ss:Type=\"String\">{{0}}</Data></Cell>", border), replaceXmlChar(data.ToString()));
        }

        // Input Dataset, or the tables we want to export to excel
        // the Filename
        public static void ToFormattedExcel(DataSet dsInput, string filename)
        {
            // we get the xml headers first
            string excelTemplate = getXMLWorkbookTemplate();


            string tablas = "<Worksheet ss:Name=\"Result\">";

            tablas += "\r\n<Table>\r\n";

            foreach (DataTable dt in dsInput.Tables)
            {
                tablas += GetExcelTableXml(dt, true);
            }
            tablas += "\r\n</Table>\r\n";
            tablas += "\r\n</Worksheet>";

            string excelXml = string.Format(excelTemplate, tablas);

            // now we write the file
            try
            {
                File.Delete(filename);
                StreamWriter sw = new StreamWriter(filename);

                sw.Write(excelXml);

                sw.Flush();
                sw.Close();

                sw.Dispose();
                sw = null;
            }
            catch { return; }

        }

        // loop the datatable and make the excel xml for the titles
        // and the data cells
        public static string GetExcelTableXml(DataTable dt, bool hasBorder)
        {
            string result = "";

            //write column name row
            result = "\r\n<Row>";

            foreach (DataColumn dc in dt.Columns)
            {
                result += string.Format("<Cell ss:StyleID=\"s62\"><Data ss:Type=\"String\">{0}</Data></Cell>", replaceXmlChar(dc.ColumnName));
            }
            result += "\r\n</Row>";

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                result += "\r\n<Row>";

                foreach (DataColumn dc in dt.Columns)
                {
                    result += getCellXml(dc.DataType, dt.Rows[i][dc.ColumnName], hasBorder);
                }

                result += "</Row>";
            }

            return result;
        }

  }

نحوه استفاده هم به شکل زیر می باشد:
کد:
ExcelXMLExportHelper.ToFormattedExcel(DataSet, "C:\\fileName.xls");


==================================================
طراحی وب سایت
پروژه های برنامه نویسی تجاری
دانلود پروژه های ASP.NET وب سایتهای آماده به همراه توضیحات
دانلود پروژه های سی شارپ و پایگاه داده SQL Server همراه توضیحات و مستندات
دانلود پروژه های UML نمودار Usecase نمودار class نمودرا activity نمودار state chart نمودار DFD و . . .
دانلود پروژه های حرفه ای پایگاه داده SQL Server به همراه مستندات و توضیحات
پروژه های حرفه ای پایگاه داده Microsoft access به همراه مستندات و توضیحات
دانلود پروژه های کارآفرینی
دانلود گزارشهای کارآموزی کارورزی تمامی رشته های دانشگاهی
قالب تمپلیت های آماده وب سایت ASP.NET به همراه Master page و دیتابیس
برنامه های ایجاد گالری عکس آنلاین با ASP.NET و JQuery و اسلایدشو به همراه کد و دیتابیس SQL کاملا Open Source واکنشگرا و ساده به همراه پایگاه داده
==================================================
یافتن تمامی ارسال‌های این کاربر
نقل قول این ارسال در یک پاسخ
ارسال پاسخ 


پیام‌های داخل این موضوع
یک کلاس پر کاربرد برای ایجاد خروجی Excel در سی شارپ Export to Excel C# - ali - 01-02-2015 09:25 PM

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 2 مهمان