// 컬럼의 그룹을 생성: recursively call private static int BuildColumnGroups(GridGroup group, Worksheet sheet, int row, int lastRow, int startCol, int lastCol, List <GridDataColumn> columns) { int totwidth = 0; for (var i = startCol; i <= lastCol; i++) { Range cell = GetRange(sheet, row, i); int mergeCount = cell.MergeArea.Cells.Count; if (mergeCount == 1) { // single column group var col = columns[i - START_COL]; group.columns.Add(col); totwidth += col.width; } else { GridGroup child = new GridGroup(); child.setHeader(cell.Value); child.width = BuildColumnGroups(child, sheet, row + 1, lastRow, i, i + mergeCount, columns); totwidth += group.width; group.columns.Add(child); i += mergeCount - 1; } } return(totwidth); }
public static string GenerateCode(Worksheet sheet, out string fieldText, out string columnText) { int srow = -1; int nameRow = -1, typeRow = -1, alignRow = -1, editableRow = -1, numberRow = -1, dateRow = -1, valuesRow = -1, labelsRow = -1, sizeRow = -1; Range allRange = sheet.UsedRange; for (int r = 1; r <= allRange.Rows.Count; r++) { var head = allRange.Item[r, 1].Value; if (head != null && srow == -1) { srow = r; } if (head == HEAD_NAME) { nameRow = r; } else if (head == HEAD_TYPE) { typeRow = r; } else if (head == HEAD_ALIGN) { alignRow = r; } else if (head == HEAD_EDIT) { editableRow = r; } else if (head == HEAD_NUMB) { numberRow = r; } else if (head == HEAD_DATE) { dateRow = r; } else if (head == HEAD_VALS) { valuesRow = r; } else if (head == HEAD_LBLS) { labelsRow = r; } else if (head == HEAD_SIZE) { sizeRow = r; } } fieldText = ""; columnText = ""; if (nameRow < 1) { Utils.ShowMessage(HEAD_NAME + "행을 찾지 못했습니다."); return(null); } if (typeRow < 1) { Utils.ShowMessage(HEAD_TYPE + "행을 찾지 못했습니다."); return(null); } if (sizeRow < 1) { Utils.ShowMessage(HEAD_SIZE + "행을 찾지 못했습니다."); return(null); } List <GridField> fields = new List <GridField>(); List <GridDataColumn> columns = new List <GridDataColumn>(); for (int c = 2; c <= allRange.Columns.Count; c++) { Range nameCell = allRange.Item[nameRow, c]; string fname = nameCell.Value; double w = nameCell.Width / 72 * 96; if (!String.IsNullOrEmpty(fname)) { GridField field = new GridField(); GridDataColumn column = new GridDataColumn(); field.fieldName = column.fieldName = column.name = fname; Range sizeCell = allRange.Item[sizeRow, c]; column.width = sizeCell.Value == null?Utils.WidthToPixel(sizeCell.Width) : (int)sizeCell.Value; column.setHeader(allRange.Item[srow - 1, c].Value); string typeText = allRange.Item[typeRow, c].Value; int typeIndex = Array.IndexOf(TYPE_LABELS, typeText); if (typeIndex == -1) { Utils.ShowMessage("존재하지 않은 형태(" + typeText + ") 입니다."); return(null); } string ftype = TYPE_VALUES[typeIndex]; column.setEditor(ftype); if (ftype == "number" || ftype == "datetime") { field.dataType = ftype; } string alignText = allRange[alignRow, c].Value; int alignIndex = Array.IndexOf(ALIGN_VALUES, alignText); string align = ALIGN_VALUES[alignIndex > -1 ? alignIndex : 0]; if (align != "near") { column.setStyles(align); } if (allRange[editableRow, c].Value == EDIT_LABELS[1]) { column.editable = false; } if (ftype == "date") { string fmt = allRange[dateRow, c].Value; int formatIndex = Array.IndexOf(DFMT_LABELS, fmt); string dateformat = formatIndex == -1 ? String.IsNullOrEmpty(fmt) ? "yyyy/MM/dd" : fmt : DFMT_VALUES[formatIndex]; field.datetimeFormat = dateformat; column.editor.datetimeFormat = dateformat; } if (ftype == "number") { var fmt = allRange[numberRow, c].Value; var formatIndex = Array.IndexOf(NFMT_LABELS, fmt); var numberformat = formatIndex == -1 ? fmt || null : NFMT_VALUES[formatIndex]; column.setStyles(null, numberformat); column.editor.editFormat = numberformat; column.editor.textAlignment = "far"; } if (ftype == "multicheck" || ftype == "dropdown") { column.lookupDisplay = true; column.editor.showButtons = true; string valText = allRange[valuesRow, c].Value; string lblText = allRange[labelsRow, c].Value; column.values = valText; if (!String.IsNullOrEmpty(lblText)) { column.labels = lblText; } if (ftype == "multicheck") { column.valueSeperator = ","; } } fields.Add(field); columns.Add(column); } } JsonSerializerSettings settings = new JsonSerializerSettings(); settings.NullValueHandling = NullValueHandling.Ignore; fieldText = JsonConvert.SerializeObject(fields, Formatting.Indented, settings); if (srow > 1) { GridGroup groups = new GridGroup(); BuildColumnGroups(groups, sheet, 1, srow, 2, columns.Count + 1, columns); columnText = JsonConvert.SerializeObject(groups.columns, Formatting.Indented, settings); //return { fields: fields, columns: groups}; } else { columnText = JsonConvert.SerializeObject(columns, Formatting.Indented, settings); //return { fields: fields, columns: columns}; } string code = "var divId = \"realgrid\";\r\n" + "dataProvider = new RealGridJS.LocalDataProvider();\r\n" + "var fields = " + fieldText + ";\r\n" + "dataProvider.setFields(fields);\r\n" + "\r\n" + "gridView = new RealGridJS.GridView(divId);\r\n" + "var columns = " + columnText + ";\r\n" + "gridView.setDataSource(dataProvider);\r\n" + "gridView.setColumns(columns);"; return(code); }