private void AddSectionCommitsForEachMonth(ExcelWorksheet sheet) { Header(sheet, "Commits for each sub-folder"); int rowCounter = 3; TableHeader(sheet, rowCounter, 1, "Folder", 40); sheet.Column(1).Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Right; TableHeader(sheet, rowCounter, 2, "File changes", 13); sheet.Column(2).Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Right; TableHeader(sheet, rowCounter, 3, "Percentage", 10); sheet.Column(3).Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Right; sheet.Column(3).Style.Numberformat.Format = "#,##0.00%"; rowCounter++; var totalCommits = FileCommitsList.Sum(fc => fc.CommitCount); foreach (var folder in FolderCommitsList.Take(25)) { sheet.Cells[rowCounter, 1].Value = folder.FolderName; sheet.Cells[rowCounter, 2].Value = FolderCommits[folder.FolderName].FileChanges; var percentage = (double)FolderCommits[folder.FolderName].FileChanges / (double)totalCommits; sheet.Cells[rowCounter, 3].Value = percentage; rowCounter++; } var chart = sheet.Drawings.AddChart("Commits each day", OfficeOpenXml.Drawing.Chart.eChartType.Pie); chart.SetSize(500, 500); chart.SetPosition(0, 450); var series1 = chart.Series.Add($"$B$4:$B${rowCounter}", $"$A$4:$A${rowCounter}"); }
private void AddSectionCommitsForEachFolder(StringBuilder sb) { var totalCommits = FileCommitsList.Sum(fc => fc.CommitCount); sb.AppendLine("<div class=\"row\">"); sb.AppendLine("<div class=\"col-md-6\">"); sb.AppendLine("<h2>Commits for each sub-folder</h2>"); sb.AppendLine("<table class=\"table pull-left\" style=\"width: 500px\">"); sb.AppendLine("<tr><th class=\"text-right\">Folder</th><th class=\"text-right\">File changes</th><th></th></tr>"); int folderCounter = 1; foreach (var folder in FolderCommitsList.Take(25)) { var changeCount = string.Format("{0,5}", FolderCommits[folder.FolderName].FileChanges); var percentage = string.Format("{0,5:#0.0}", ((double)FolderCommits[folder.FolderName].FileChanges / (double)totalCommits) * 100); var expand = folder.Children.Keys.Count > 0 ? $"<span onclick=\"expandFolder({folderCounter})\" id=\"folderSpanExpand{folderCounter}\" class=\"treeViewCaret\">Expand</span>" : ""; sb.AppendLine($"<tr><td class=\"text-right\">{WebUtility.HtmlEncode(folder.FolderName)}</td><td class=\"text-right text-nowrap\">{changeCount} ({percentage}%)</td><td>{expand}</td></tr>"); if (folder.Children.Keys.Count > 0) { sb.AppendLine($"<tr id=\"folderTrExpand{folderCounter}\" class=\"nested\"><td colspan=\"3\" style=\"overflow: scroll\">"); sb.AppendLine($"<ul id=\"folderUlExpand{folderCounter}\" class=\"nested\">"); AddSectionCommitsForEachFolderChildren(sb, folder, 0); sb.AppendLine("</ul>"); sb.AppendLine("</td></tr>"); } folderCounter++; } var total = string.Format("{0,5}", totalCommits); sb.AppendLine($"<tr><td class=\"text-right\">Total number of Commits analyzed</td><td class=\"text-right\">{total} ({string.Format("{0,5:##0.0}", 100)}%)</td></td></tr>"); sb.AppendLine("</table>\n"); sb.AppendLine("</div>"); sb.AppendLine("<div class=\"col-md-6\">"); AddPieChartJavascript(sb); sb.AppendLine("<div id=\"piechart\" style=\"width: 48px; height: 48px;\" class=\"spinner\"></div>"); sb.AppendLine("<script type=\"text/javascript\">"); sb.AppendLine("var toggler = document.getElementsByClassName(\"treeViewCaret\");"); sb.AppendLine("var i;"); sb.AppendLine("for (i = 0; i < toggler.length; i++) {"); sb.AppendLine(" toggler[i].addEventListener(\"click\", function() {"); sb.AppendLine(" var children = this.parentElement.querySelector(\".nested\");"); sb.AppendLine(" if(children) {"); sb.AppendLine(" children.classList.toggle(\"active\");"); sb.AppendLine(" this.classList.toggle(\"caret-down\");"); sb.AppendLine(" }"); sb.AppendLine(" });"); sb.AppendLine("}"); sb.AppendLine("function expandFolder(folderId) {"); sb.AppendLine(" var folderExpander = document.getElementById('folderTrExpand' + folderId);"); sb.AppendLine(" folderExpander.classList.toggle('active');"); sb.AppendLine(" folderExpander = document.getElementById('folderUlExpand' + folderId);"); sb.AppendLine(" folderExpander.classList.toggle('active');"); sb.AppendLine(" folderExpander = document.getElementById('folderSpanExpand' + folderId)"); sb.AppendLine(" folderExpander.classList.toggle('caret-down');"); sb.AppendLine("}"); sb.AppendLine("</script>"); sb.AppendLine("</div></div>"); }
private void AddPieChartJavascript(StringBuilder sb) { sb.AppendLine("<script type=\"text/javascript\">"); sb.AppendLine("google.charts.load('current', { 'packages':['corechart']});"); sb.AppendLine("google.charts.setOnLoadCallback(drawChart);"); sb.AppendLine("function drawChart() {"); sb.AppendLine(" var data = google.visualization.arrayToDataTable([['Folder', 'Commits'], "); foreach (var folder in FolderCommitsList.Take(25)) { sb.AppendLine($" ['{folder.FolderName}', {folder.FileChanges}],"); } sb.AppendLine(" ]);"); sb.AppendLine(" var options = { title: 'Commits for each sub-folder' }; "); sb.AppendLine(" var element = document.getElementById('piechart');"); sb.AppendLine(" element.classList.remove(\"spinner\");"); sb.AppendLine(" element.style = \"width: 900px; height: 500px;\""); sb.AppendLine(" var chart = new google.visualization.PieChart(element);"); sb.AppendLine(" chart.draw(data, options);"); sb.AppendLine("}"); sb.AppendLine("</script>"); }