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