示例#1
0
        public static void ToMergeDgv <Title, Model>(this MergeDataGridView mdgv, List <Model> objs)
        {
            if (mdgv.MergeColumnNames == null)
            {
                mdgv.MergeColumnNames = new List <string>();
            }

            if (mdgv.ColumnCount == 0)
            {
                var ps = typeof(Model).GetProperties();

                foreach (var p in ps)
                {
                    var pDcrp  = p.GetDcrp();
                    var column = new DataGridViewTextBoxColumn
                    {
                        Name             = p.Name,
                        Tag              = p.GetReference(),
                        DataPropertyName = p.Name,
                        HeaderText       = pDcrp,
                        FillWeight       = GetColumnWeight(pDcrp)
                    };

                    mdgv.Columns.Add(column);
                    mdgv.MergeColumnNames.Add(p.Name);
                }
            }

            mdgv.DataSource = objs;
            mdgv.SetMdgvStyle();
            MergeHeaders <Title>(mdgv);
            mdgv.SetCellInfos();
        }
示例#2
0
        public static void SetMdgvStyle(this MergeDataGridView mdgv)
        {
            mdgv.SetDgvStyle();

            mdgv.DefaultCellStyle.SelectionBackColor = mdgv.DefaultCellStyle.BackColor;

            mdgv.DefaultCellStyle.SelectionForeColor = mdgv.DefaultCellStyle.ForeColor;
        }
示例#3
0
        /// <summary>
        /// 合并列标题
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="mdgv"></param>
        public static void MergeHeaders <T>(this MergeDataGridView mdgv)
        {
            var lastSum = 0;

            for (var i = 0; i < typeof(T).GetProperties().Length; i++)
            {
                var p       = typeof(T).GetProperties()[i];
                var spanNum = GetSpan(p);

                mdgv.AddSpanHeader(GetDcrp(p), lastSum, spanNum);
                lastSum += spanNum;
            }
        }
示例#4
0
        /// <summary>
        /// 导入到表格控件中
        /// </summary>
        /// <typeparam name="Title"></typeparam>
        /// <typeparam name="Model"></typeparam>
        /// <param name="mdgv"></param>
        /// <param name="objs"></param>
        /// <param name="mergeCell"></param>
        public static void ImportDgv <Title, Model>(this MergeDataGridView mdgv, List <Model> objs, bool mergeCell = true)
        {
            if (mdgv.ColumnCount == 0)
            {
                for (var i = 0; i < typeof(Model).GetProperties().Length; i++)
                {
                    var p     = typeof(Model).GetProperties()[i];
                    var pDcrp = GetDcrp(p);

                    var column = new DataGridViewTextBoxColumn
                    {
                        Name             = p.Name,
                        Tag              = GetReference(p),
                        DataPropertyName = p.Name,
                        HeaderText       = string.IsNullOrEmpty(pDcrp) ? string.Empty : pDcrp,
                        FillWeight       = pDcrp == null || pDcrp.Length > 10 ? 7
                            : pDcrp.Length > 6 ? 4
                            : pDcrp.Length < 4 ? 3
                            : pDcrp.Length
                    };

                    mdgv.Columns.Add(column);
                    mdgv.MergeColumnNames.Add(p.Name);
                }
            }

            // 数据源
            mdgv.DataSource = objs;

            // 设置表格样式
            mdgv.SetDgvStyle();

            // 设置跨列合并单元格
            MergeHeaders <Title>(mdgv);

            // 设置合并内容单元格
            MergeCell(mdgv);
        }
示例#5
0
        public static ExcelPackage ToExcel <Title>(this MergeDataGridView mdgv, ExcelParam param, bool createHeader = true)
        {
            if (!param.FilePath.Exists)
            {
                File.Copy(param.TemplatePath.FullName, param.FilePath.FullName);
            }

            var excel = param.GetExcelPackage(out var sheet);

            var columns = mdgv.Columns.Cast <DataGridViewColumn>().Where(w => w.Visible).ToList();

            if (createHeader)
            {
                var lastSum = param.ColumnIndex;

                var ps = typeof(Title).GetProperties();

                // Merges first title and sets first title value.
                foreach (var p in ps)
                {
                    var spanNum = p.GetSpan();

                    var columnDcrp = p.GetDcrp();

                    var range = sheet.Cells[param.RowIndex, lastSum, param.RowIndex, lastSum + spanNum - 1];

                    range.Value = columnDcrp;

                    if (string.IsNullOrEmpty(sheet.Cells[param.RowIndex, param.ColumnIndex].Value?.ToString()))
                    {
                        sheet.Column(lastSum).Width = GetSheetWidth(columnDcrp);
                    }

                    // If the span num equal 1, don't set merge.
                    if (spanNum != 1 && !range.Merge)
                    {
                        range.Merge = true;
                    }

                    lastSum += spanNum;
                }

                // Merges Second title.
                for (var i = 0; i < columns.Count; i++)
                {
                    sheet.Cells[param.RowIndex + 1, i + param.ColumnIndex].Value = columns[i].HeaderText;
                }

                // Merges title .
                for (var i = 0; i < columns.Count; i++)
                {
                    var cell = sheet.Cells[param.RowIndex, i + param.ColumnIndex];

                    // If merged, continue.
                    if (cell.Merge)
                    {
                        continue;
                    }

                    // Value not equal, continue.
                    if (cell.Value?.ToString() != sheet.Cells[param.RowIndex + 1, i + param.ColumnIndex].Value?.ToString())
                    {
                        continue;
                    }

                    // Sets merge.
                    sheet.Cells[param.RowIndex, i + param.ColumnIndex, param.RowIndex + 1, i + param.ColumnIndex].Merge = true;
                }
            }

            // Sets content cell value.
            for (var i = 0; i < mdgv.RowCount; i++)
            {
                for (var j = 0; j < columns.Count; j++)
                {
                    sheet.Cells[i + param.RowIndex + 2, j + param.ColumnIndex].Value = mdgv.Rows[i].Cells[columns[j].Name].Value;
                }
            }

            if (createHeader)
            {
                // Merges content cell.
                for (var i = 0; i < mdgv.ColumnCount; i++)
                {
                    for (var j = 0; j < mdgv.RowCount; j++)
                    {
                        var upRowNum = mdgv.GetUpRowNum(j, i) - 1;

                        var downRowNum = mdgv.GetDownRowNum(j, i) - 1;

                        var cell = sheet.Cells[j + param.RowIndex, i + param.ColumnIndex];

                        var tag = mdgv.Columns[i].Tag?.ToString();

                        if (!string.IsNullOrEmpty(tag))
                        {
                            var tempIndex = mdgv.Columns[tag]?.Index;

                            upRowNum = mdgv.GetUpRowNum(j, tempIndex ?? 0) - 1;

                            downRowNum = mdgv.GetDownRowNum(j, tempIndex ?? 0) - 1;
                        }

                        if (cell.Merge)
                        {
                            continue;
                        }

                        var range = sheet.Cells[j + param.RowIndex - upRowNum, i + param.ColumnIndex, j + param.RowIndex + downRowNum, i + param.ColumnIndex];

                        if (!range.Merge)
                        {
                            range.Merge = true;
                        }
                    }
                }
            }

            sheet.SetExcelStyle();

            excel.Save();

            return(excel);
        }
示例#6
0
        public static void ToMergeDgv <Title, Model>(this MergeDataGridView mdgv, ExcelParam param)
        {
            var data = param.AsList <Model>();

            mdgv.ToMergeDgv <Title, Model>(data);
        }
示例#7
0
        /// <summary>
        /// 导出到文件
        /// </summary>
        /// <param name="mdgv"></param>
        /// <param name="filePath"></param>
        /// <param name="sheetName"></param>
        public static ExcelPackage ExportFile <Title, Model>(this MergeDataGridView mdgv, string filePath, string sheetName = "Sheet1")
        {
            var fileInfo = new FileInfo(filePath);
            var excel    = new ExcelPackage(fileInfo);

            if (excel.Workbook.Worksheets.FirstOrDefault(f => f.Name == sheetName) != null)
            {
                excel.Workbook.Worksheets.Delete(sheetName);
            }

            var worksheet = excel.Workbook.Worksheets.Add(sheetName);
            var index     = 0;
            var lastSum   = 1;

            worksheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            worksheet.Cells.Style.VerticalAlignment   = ExcelVerticalAlignment.Center;

            // 一级标题
            foreach (var p in typeof(Title).GetProperties())
            {
                var spanNum    = GetSpan(p);
                var columnDcrp = GetDcrp(p);

                // 合并格子和索引简单的数学关系可知道需要减1,坐标轴图示即可
                worksheet.Cells[1, lastSum, 1, lastSum + spanNum - 1].Value = columnDcrp;

                worksheet.Column(lastSum).Width = columnDcrp.Length > 10 ? 15
                    : columnDcrp.Length > 6 ? 20
                    : columnDcrp.Length < 4 ? 8 : 10;

                // 只有一个格子不要修改融合属性
                if (lastSum != lastSum + spanNum - 1)
                {
                    worksheet.Cells[1, lastSum, 1, lastSum + spanNum - 1].Merge = true;
                }

                lastSum += spanNum;
            }

            // 二级标题
            foreach (var column in mdgv.Columns.Cast <DataGridViewColumn>().Where(w => w.Visible).ToList())
            {
                worksheet.Cells[2, index + 1].Value = column.HeaderText;
                index++;
            }

            // 标题融合
            for (var i = 0; i < typeof(Model).GetProperties().Length; i++)
            {
                // 融合过的,跳过
                if (worksheet.Cells[1, i + 1].Merge)
                {
                    continue;
                }

                // 值不等,跳过
                if (worksheet.Cells[1, i + 1].Value?.ToString() != worksheet.Cells[2, i + 1].Value?.ToString())
                {
                    continue;
                }

                // 融合
                worksheet.Cells[1, i + 1, 2, i + 1].Merge = true;

                // 垂直居中
                worksheet.Cells[1, i + 1, 2, i + 1].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            }

            // 单元格赋值
            for (var i = 0; i < mdgv.RowCount; i++)
            {
                index = 0;

                foreach (var column in mdgv.Columns.Cast <DataGridViewColumn>().Where(w => w.Visible).ToList())
                {
                    worksheet.Cells[i + 3, index + 1].Value = mdgv.Rows[i].Cells[column.Name].Value;
                    index++;
                }
            }

            // 单元格合并
            // 遍历列
            for (var i = 1; i <= worksheet.Dimension.Columns; i++)
            {
                // 遍历行
                for (var j = 3; j <= worksheet.Dimension.Rows; j++)
                {
                    var upRowsNum  = mdgv.GetUpRowNum(j - 3, i - 1) - 1;
                    var downRowNum = mdgv.GetDownRowNum(j - 3, i - 1) - 1;
                    var curCell    = worksheet.Cells[j, i];

                    // 控件列索引从0开始
                    var tag = mdgv.Columns[i - 1].Tag.ToString();

                    if (tag != string.Empty)
                    {
                        var columnIndex = mdgv.Columns[tag]?.Index;

                        upRowsNum  = mdgv.GetUpRowNum(j - 3, columnIndex ?? 0) - 1;
                        downRowNum = mdgv.GetDownRowNum(j - 3, columnIndex ?? 0) - 1;
                    }

                    if (curCell.Merge)
                    {
                        continue;
                    }

                    if (worksheet.Cells[j - upRowsNum, i].Merge)
                    {
                        continue;
                    }

                    // 融合
                    worksheet.Cells[j - upRowsNum, i, j + downRowNum, i].Merge = true;
                }
            }

            excel.Save();

            return(excel);
        }
示例#8
0
 /// <summary>
 /// 合并内容单元格
 /// </summary>
 public static void MergeCell(this MergeDataGridView mdgv)
 {
     mdgv.SetCellInfos();
 }