private static void renderHeader(ExcelWorksheet worksheet, ExcelHeader excelHeader, int maxHeaderLevel, int rowHeader1, ref int nCol) { if (excelHeader.Width != null) { worksheet.Column(nCol).Width = excelHeader.Width.Value; } ExcelRange excelRange = null; var colSpanSub = excelHeader.ColSpan(excelHeader); //var rowSpanSub = maxHeaderLevel - excelHeaders.Level; if (colSpanSub == 1) { var toRow = rowHeader1 + maxHeaderLevel - excelHeader.Level - 1; worksheet.Cells[rowHeader1, nCol, toRow, nCol].Value = excelHeader.Name; excelRange = worksheet.Cells[rowHeader1, nCol, toRow, nCol]; excelRange.Merge = true; nCol++; } else { var rowNext = rowHeader1 + 1; var nColNext = nCol + colSpanSub - 1; worksheet.Cells[excelHeader.Level + rowHeader1, nCol, excelHeader.Level + rowHeader1, nColNext].Value = excelHeader.Name; excelRange = worksheet.Cells[excelHeader.Level + rowHeader1, nCol, excelHeader.Level + rowHeader1, nColNext]; excelRange.Merge = true; //nCol = nColNext; foreach (var group in excelHeader.SubExcelHeaders) { renderHeader(worksheet, group, maxHeaderLevel, rowNext, ref nCol); } // nCol++; } formatExcelRange(excelRange); }