Exemple #1
0
        /// <summary>
        /// Bind nội dung
        /// </summary>
        /// <param name="workbook"></param>
        /// <param name="data"></param>
        /// <param name="rowStart"></param>
        /// <returns></returns>
        protected int BindContent(Workbook workbook, object data, int rowStart)
        {
            var list = data.CastToList();

            // Khởi tạo dic lưu các cell cần thực hiện RowSpan
            var cellRowSpans = ListReportColumnInfo.Where(rc => rc.CellSpan == CellSpan.Row).ToDictionary(rc => rc.Column, rc => new CellValue {
                Value = null
            });

            // Lưu trữ row và column hiện thời đang fill dữ liệu
            int row = 0, column = 0;

            var sheet = workbook.Worksheets[0];

            // Lấy các cột được hiển thị thôi
            var columnVisibles = AllColumns.Where(c => c.Visible).ToList();

            for (var i = 0; i < list.Count; i++)
            {
                var dataItem = list[i];
                row    = rowStart;
                column = CellStart + 1;

                foreach (var cellConfig in columnVisibles)
                {
                    // else value = value.ToString();
                    // Điền dữ liệu lên cell
                    //Khắc phục lỗi khi có số 0 ở đầu mà k muốn bỏ
                    //if (value.ToString().Length > 1 && value.ToString().StartsWith("0"))
                    //{
                    //    sheet.Cells[row, column].PutValue(value.ToString(), false);
                    //}
                    // else sheet.Cells[row, column].PutValue(value.ToString(), true);
                    Style styleCell = ExcelBinderBase.StyleCell;
                    // Căn cột
                    if (cellConfig.AppearanceCell != null)
                    {
                        switch (cellConfig.AppearanceCell.TextOptions.HAlignment)
                        {
                        case HorzAlignment.Center:
                            styleCell = ExcelBinderBase.StyleCellCenter;
                            break;

                        case HorzAlignment.Far:
                            styleCell = ExcelBinderBase.StyleCellRight;
                            break;

                        case HorzAlignment.Near:
                            styleCell = ExcelBinderBase.StyleCellLeft;
                            break;

                        default:
                            styleCell = ExcelBinderBase.StyleCellLeft;
                            break;
                        }
                    }
                    else
                    {
                        styleCell = ExcelBinderBase.StyleCellLeft;
                    }

                    var value = cellConfig.FieldName.Equals("STT") ? (i + 1) : cellConfig.GetValue(dataItem);

                    if (value == null)
                    {
                        value = string.Empty;
                    }
                    if (value is bool)
                    {
                        value     = (bool)value ? "X" : "";
                        styleCell = ExcelBinderBase.StyleCell;
                    }
                    double r = 0;
                    if (value.ToString() != string.Empty && double.TryParse(value.ToString(), out r) && cellConfig.DisplayFormat != null && !cellConfig.DisplayFormat.IsEmpty)
                    {
                        if (r - (double)((long)r) != 0)
                        {
                            styleCell.Custom = string.Format(@"#,##0.##");
                        }
                        else
                        {
                            styleCell.Custom = string.Format(@"#,##0");
                        }
                        value = r;
                    }

                    sheet.Cells[row, column].PutValue(value);
                    sheet.Cells[row, column].SetStyle(styleCell);
                    // Tìm cell rowspan
                    if (cellRowSpans.ContainsKey(cellConfig.FieldName))
                    {
                        var cellValue = cellRowSpans[cellConfig.FieldName];
                        if (cellValue.RowStart == 0)
                        {
                            cellValue.Value    = value;
                            cellValue.RowStart = row;
                        }
                        else
                        {
                            // Nếu thay đổi giá trị thì bắt đầu thiết lập rowspan
                            if (!cellValue.Value.Equals(value))
                            {
                                cellValue.RowStart = row;
                                cellValue.Value    = value;
                            }
                            else
                            {
                                sheet.Cells.Merge(cellValue.RowStart, column, row - cellValue.RowStart + 1, 1);
                            }
                        }
                    }

                    column++;
                }

                rowStart++;
            }

            // Trả về Row cuối cùng
            return(rowStart);
        }
Exemple #2
0
        /// <summary>
        /// Thực hiện Bind dữ liệu vào excel
        /// </summary>
        /// <param name="workbook"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public override int Bind(Workbook workbook, object data)
        {
            // Tìm field mà muốn group
            var rCol = ListReportColumnInfo.FirstOrDefault(rc => rc.CellSpan == CellSpan.Column);

            // Ẩn các cột mà đã được group theo column đi
            AllColumns.Join(ListReportColumnInfo.Where(rc => rc.CellSpan == CellSpan.Column), c => c.FieldName, rc => rc.Column, (c, rc) => c.Visible = false).Count();

            // Tổng số cột
            var totalColumn = AllColumns.Where(c => c.Visible).Count();

            // Nếu không có thì thực hiện bind như grid bình thường
            if (rCol == null)
            {
                return(base.Bind(workbook, data));
            }

            // Thực hiện group các column lại
            var group = data.CastToList().GroupBy(d => Convert.ToString(d.Eval(rCol.Column)));

            // khai báo row bắt đầu thực hiện
            var startRow = RowBegin;

            //
            var sheet        = workbook.Worksheets[0];
            var columnGroups = ListReportColumnInfo.Where(c => c.CellSpan == CellSpan.Column);

            // Thực hiện bind theo từng group
            foreach (var g in group)
            {
                var dataGroup      = g.ToList();
                var firstDataGroup = dataGroup.First();

                foreach (var cg in columnGroups)
                {
                    for (var i = CellStart + 1; i <= totalColumn + CellStart; i++)
                    {
                        sheet.Cells[startRow, i].SetStyle(ExcelBinderBase.StyleHeader);
                    }
                    // sheet.Cells.CreateRange(startRow, CellStart + 1, 1, totalColumn).SetStyle(ExcelBinderBase.StyleHeader);
                    sheet.Cells.Merge(startRow, CellStart + 1, 1, totalColumn);
                    var obj = firstDataGroup.Eval(cg.Column);
                    if (obj is DateTime)
                    {
                        obj = string.Format("{0:dd/MM/yyyy}", obj);
                    }
                    sheet.Cells[startRow, CellStart + 1].PutValue(obj);
                    startRow++;
                }

                startRow--;

                // Bind header
                startRow = BindHeader(workbook, startRow);

                // Bind nội dung
                startRow = BindContent(workbook, dataGroup, startRow);
            }

            //
            return(0);
        }