public static void Enable3DChartShadow(this ExcelPieChart chart, int serieIndex, int red, int green, int blue, int sizePer, int blurPt, int distancePt, int angleDgr, int transparencyPer)
        {
            var xdoc = chart.ChartXml;
            var nsm  = new XmlNamespaceManager(xdoc.NameTable);

            // "http://schemas.openxmlformats.org/drawingml/2006/chart"
            var schemaChart = xdoc.DocumentElement.NamespaceURI;

            if (nsm.HasNamespace("c") == false)
            {
                nsm.AddNamespace("c", schemaChart);
            }

            var schemaDrawings = "http://schemas.openxmlformats.org/drawingml/2006/main";

            if (nsm.HasNamespace("a") == false)
            {
                nsm.AddNamespace("a", schemaDrawings);
            }

            // https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.charts.plotarea.aspx
            // https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.charts.pie3dchart.aspx
            // https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.charts.piechartseries.aspx
            // https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.charts.index.aspx
            var ser = xdoc.SelectSingleNode("/c:chartSpace/c:chart/c:plotArea/c:pie3DChart/c:ser[c:idx[@val='" + serieIndex + "']]", nsm);

            // https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.charts.chartshapeproperties.aspx
            var spPr = ser.SelectSingleNode("./c:spPr", nsm);

            if (spPr == null)
            {
                spPr = ser.AppendElement(schemaChart, "c:spPr");
            }

            // https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.effectlist.aspx
            var effectLst = spPr.AppendElement(schemaDrawings, "a:effectLst");

            // https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.outershadow.aspx
            var outerShdw = effectLst.AppendElement(schemaDrawings, "a:outerShdw");

            outerShdw.AppendAttribute("sx", (sizePer * SimpleTypes.ST_PERCENTAGE).ToString());             // horizontal scaling factor
            outerShdw.AppendAttribute("sy", (sizePer * SimpleTypes.ST_PERCENTAGE).ToString());             // vertical scaling factor
            outerShdw.AppendAttribute("blurRad", (blurPt * EMUUnits.EMU_PER_POINT).ToString());            // blur
            outerShdw.AppendAttribute("dist", (distancePt * EMUUnits.EMU_PER_POINT).ToString());           // distance
            outerShdw.AppendAttribute("dir", (angleDgr * SimpleTypes.ST_POSITIVE_FIXED_ANGLE).ToString()); // direction

            // https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.rgbcolormodelhex.aspx
            var srgbClr = outerShdw.AppendElement(schemaDrawings, "a:srgbClr");

            srgbClr.AppendAttribute("val", string.Format("{0:X2}{1:X2}{2:X2}", red, green, blue));

            // https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.alpha.aspx
            var alpha = srgbClr.AppendElement(schemaDrawings, "a:alpha");

            alpha.AppendAttribute("val", (100 - transparencyPer) + "%"); // alpha = 100% - transparency
        }
        public static void Enable3DChartFormat(this ExcelPieChart chart, int serieIndex, PresetMaterialTypeValues material, int topBevelWidthPt, int topBevelHeightPt, int bottomBevelWidthPt, int bottomBevelHeightPt)
        {
            var xdoc = chart.ChartXml;
            var nsm  = new XmlNamespaceManager(xdoc.NameTable);

            // "http://schemas.openxmlformats.org/drawingml/2006/chart"
            var schemaChart = xdoc.DocumentElement.NamespaceURI;

            if (nsm.HasNamespace("c") == false)
            {
                nsm.AddNamespace("c", schemaChart);
            }

            var schemaDrawings = "http://schemas.openxmlformats.org/drawingml/2006/main";

            if (nsm.HasNamespace("a") == false)
            {
                nsm.AddNamespace("a", schemaDrawings);
            }

            // https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.charts.plotarea.aspx
            // https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.charts.pie3dchart.aspx
            // https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.charts.piechartseries.aspx
            // https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.charts.index.aspx
            var ser = xdoc.SelectSingleNode("/c:chartSpace/c:chart/c:plotArea/c:pie3DChart/c:ser[c:idx[@val='" + serieIndex + "']]", nsm);

            // https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.charts.chartshapeproperties.aspx
            var spPr = ser.SelectSingleNode("./c:spPr", nsm);

            if (spPr == null)
            {
                spPr = ser.AppendElement(schemaChart, "c:spPr");
            }

            // https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.shape3dtype.aspx
            var sp3d = spPr.AppendElement(schemaDrawings, "a:sp3d");

            sp3d.AppendAttribute("prstMaterial", material.StringValue());

            // https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.beveltop.aspx
            var bevelT = sp3d.AppendElement(schemaDrawings, "a:bevelT");

            bevelT.AppendAttribute("w", (topBevelWidthPt * EMUUnits.EMU_PER_POINT).ToString());
            bevelT.AppendAttribute("h", (topBevelHeightPt * EMUUnits.EMU_PER_POINT).ToString());

            // https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.bevelbottom.aspx
            var bevelB = sp3d.AppendElement(schemaDrawings, "a:bevelB");

            bevelB.AppendAttribute("w", (bottomBevelWidthPt * EMUUnits.EMU_PER_POINT).ToString());
            bevelB.AppendAttribute("h", (bottomBevelHeightPt * EMUUnits.EMU_PER_POINT).ToString());
        }
        public void fnExportTableToExcel(DataTable dt_ThongSo)// Đưa dữ liệu từ các DataTable ra file excel mới
        {
            // Hiện hộp thoại chọn đường dẫn lưu file Excel
            using (SaveFileDialog saveDialog = new SaveFileDialog())
            {
                saveDialog.Filter = "Excel (Phiên bản 2007 trở lên (.xlsx)|*.xlsx";

                if (saveDialog.ShowDialog() != DialogResult.Cancel)
                {
                    string exportFilePath = saveDialog.FileName;
                    var    newFile        = new FileInfo(exportFilePath);

                    SplashScreenManager.ShowForm(typeof(frm_DangXuLy));

                    int         n        = frm_PhanCum.KMEDOIDS_Cluster.NUM_Cluster; // Số lượng Sheet với nội dung chi tiết từng cụm có trong file excel mới = Số lượng cụm người dùng nhập vào
                    DataTable[] dt_Array = new DataTable[n];                         // Mảng 1 chiều DataTable
                    DataRow  [] dr_Array = new DataRow[n];                           // Mảng 1 chiều DataRow

                    for (int i = 0; i < n; i++)                                      // Mỗi lần lặp tạo ra một DataTable mới, giới hạn lặp là số cụm người dùng nhập vào
                    {
                        dt_Array[i] = new DataTable("DataTable" + i);

                        dt_Array[i].Columns.Add(new DataColumn("f_masv"));                // Cột mã sinh viên
                        dt_Array[i].Columns.Add(new DataColumn("f_lop"));                 // Cột lớp
                        dt_Array[i].Columns.Add(new DataColumn("f_ho"));                  // Cột họ
                        dt_Array[i].Columns.Add(new DataColumn("f_ten"));                 // Cột tên
                        dt_Array[i].Columns.Add(new DataColumn("f_dtb", typeof(Double))); // Cột này là Điểm trung bình nên phải là kiểu Double

                        for (int j = 0; j < frm_PhanCum.Subjects.COU_Subjects; j++)       // Mỗi lần lặp tạo ra 1 cột môn học, giới hạn lặp là số môn học người dùng chọn khi check vào checkbox
                        {
                            dt_Array[i].Columns.Add(new DataColumn(frm_PhanCum.Subjects.ARR_Subjects[j], typeof(Double)));
                        }

                        dr_Array[i] = dt_Array[i].NewRow();
                    }

                    for (int i = 0; i < frm_Main.path_src.dt.Rows.Count; i++)// Mỗi lần lặp thêm 1 sinh viên(1 dòng) vào DataTable với số điểm trung bình tương ứng thuộc cụm đó
                    {
                        for (int j = 0; j < n; j++)
                        {
                            if (frm_PhanCum.Students.EXCEL[i, 5] == frm_PhanCum.KMEDOIDS_Center.CENTER[j].ToString()) // EXCEL[i, 5] là nơi lưu tâm cụm của sinh viên từ các môn học đã chọn. CENTER[j] lưu các giá trị tâm cụm
                            {
                                dr_Array[j] = dt_Array[j].NewRow();                                                   // Tạo ra 1 DataRow(1 dòng) mới

                                dr_Array[j]["f_masv"] = frm_PhanCum.Students.EXCEL[i, 0];
                                dr_Array[j]["f_lop"]  = frm_PhanCum.Students.EXCEL[i, 3];
                                dr_Array[j]["f_ho"]   = frm_PhanCum.Students.EXCEL[i, 1];
                                dr_Array[j]["f_ten"]  = frm_PhanCum.Students.EXCEL[i, 2];
                                dr_Array[j]["f_dtb"]  = Math.Round(Convert.ToDouble(frm_PhanCum.Students.EXCEL[i, 4]), 2);

                                for (int k = 0; k < frm_PhanCum.Subjects.COU_Subjects; k++)// Mỗi lần lặp gán vào các ô từ ô thứ 6 trở đi là điểm của từng môn người dùng chọn ứng với sinh viên đó.
                                {
                                    dr_Array[j][frm_PhanCum.Subjects.ARR_Subjects[k]] = frm_PhanCum.Students.EXCEL[i, 6 + k];
                                }

                                dt_Array[j].Rows.Add(dr_Array[j]);
                            }
                        }
                    }

                    using (var package = new ExcelPackage(newFile))
                    {
                        ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Thông số các cụm");// Tạo Sheet chứa thông số các cụm

                        int colIndex = 1;
                        foreach (DataColumn dc in dt_ThongSo.Columns) //Tạo các Header
                        {
                            var cell = worksheet.Cells[1, colIndex];

                            var fill = cell.Style.Fill;               // Tạo định dạng
                            fill.PatternType = ExcelFillStyle.Solid;
                            fill.BackgroundColor.SetColor(Color.Green);

                            for (int j = 1; j < frm_PhanCum.KMEDOIDS_Cluster.NUM_Cluster + 2; j++)
                            {
                                var cell_PC   = worksheet.Cells[j, colIndex];
                                var border_PC = cell_PC.Style.Border;
                                border_PC.Bottom.Style = border_PC.Top.Style = border_PC.Left.Style = border_PC.Right.Style = ExcelBorderStyle.Thin;
                                cell_PC.Value          = dc.ColumnName;
                            }
                            colIndex++;
                        }

                        //--------------------------------------Sheet đầu tiên--------------------------------------//
                        worksheet.Cells["A1"].LoadFromDataTable(dt_ThongSo, true, TableStyles.None);

                        //--------------------Xuat Bieu Do--------------------//
                        // Biểu đồ cột
                        OfficeOpenXml.Drawing.Chart.ExcelChart chart = (OfficeOpenXml.Drawing.Chart.ExcelChart)worksheet.Drawings.AddChart("chart_1", OfficeOpenXml.Drawing.Chart.eChartType.ColumnStacked);
                        chart.SetPosition(10, 300);
                        chart.Title.Text      = "Biểu đồ cột";
                        chart.Title.Font.Bold = true;
                        chart.Title.Font.Size = 12;
                        chart.SetSize(500, 400);

                        var series = (ExcelChartSerie)(chart.Series.Add(worksheet.Cells[2, 3, dt_ThongSo.Rows.Count + 1, 3], worksheet.Cells[2, 1, dt_ThongSo.Rows.Count + 1, 1]));
                        series.Header = "Số PT";
                        chart.Legend.Add();
                        chart.Legend.Border.Width = 0;
                        chart.Legend.Font.Size    = 12;
                        chart.Legend.Font.Bold    = true;
                        chart.Legend.Position     = eLegendPosition.Right;

                        // Biểu đồ tròn
                        OfficeOpenXml.Drawing.Chart.ExcelPieChart chart_pie = (OfficeOpenXml.Drawing.Chart.ExcelPieChart)worksheet.Drawings.AddChart("chart_2", OfficeOpenXml.Drawing.Chart.eChartType.Pie);
                        chart_pie.SetPosition(10, 810);
                        chart_pie.Title.Text      = "Biểu đồ tròn";
                        chart_pie.Title.Font.Bold = true;
                        chart_pie.Title.Font.Size = 12;
                        chart_pie.SetSize(500, 400);

                        var series_pie = (ExcelPieChartSerie)(chart_pie.Series.Add(worksheet.Cells[2, 4, dt_ThongSo.Rows.Count + 1, 4], worksheet.Cells[2, 1, dt_ThongSo.Rows.Count + 1, 1]));
                        var pieSeries  = (ExcelPieChartSerie)series_pie;
                        pieSeries.Explosion = 5;

                        //Format the labels
                        pieSeries.DataLabel.Font.Bold       = true;
                        pieSeries.DataLabel.ShowValue       = true;
                        pieSeries.DataLabel.ShowLeaderLines = true;

                        pieSeries.DataLabel.Position = eLabelPosition.OutEnd;

                        chart_pie.Legend.Add();
                        chart_pie.Legend.Border.Width = 0;
                        chart_pie.Legend.Font.Size    = 12;
                        chart_pie.Legend.Font.Bold    = true;
                        chart_pie.Legend.Position     = eLegendPosition.Right;

                        //-------------------------------------Sheet thứ hai trở đi--------------------------------------//
                        ExcelWorksheet[] Sheet = new ExcelWorksheet[n];

                        for (int i = 0; i < n; i++)
                        {
                            Sheet[i] = package.Workbook.Worksheets.Add("Chi tiết cụm " + (i + 1).ToString());

                            int colIndex1 = 1;

                            foreach (DataColumn dc in dt_Array[i].Columns) //Creating Headings
                            {
                                var cell1 = Sheet[i].Cells[1, colIndex1];

                                var fill = cell1.Style.Fill;
                                fill.PatternType = ExcelFillStyle.Solid;
                                fill.BackgroundColor.SetColor(Color.Green);

                                for (int j = 1; j < frm_PhanCum.KMEDOIDS_Center.COU_Vector[i] + 2; j++)
                                {
                                    var cell_N = Sheet[i].Cells[j, colIndex1];
                                    var border = cell_N.Style.Border;
                                    border.Bottom.Style = border.Top.Style = border.Left.Style = border.Right.Style = ExcelBorderStyle.Thin;
                                    cell_N.Value        = dc.ColumnName;
                                }

                                colIndex1++;
                            }

                            Sheet[i].Cells["A1"].LoadFromDataTable(dt_Array[i], true, TableStyles.None);
                        }

                        package.Save();
                        SplashScreenManager.CloseForm();

                        XtraMessageBox.Show("Tạo file excel thành công !", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);

                        ProcessStartInfo pi = new ProcessStartInfo(exportFilePath);
                        Process.Start(pi);
                    }
                }
            }
        }