private void GenerateExceptionsPage()

in src/lib/Microsoft.Fx.Portability.Reports.Excel/ExcelOpenXmlOutputWriter.cs [450:515]


        private void GenerateExceptionsPage(Worksheet worksheet, IList<ExceptionInfo> throwingMembers, IList<FrameworkName> targets)
        {
            var exceptionsPageHeader = new List<string>() { LocalizedStrings.AssemblyHeader, LocalizedStrings.TargetMemberHeader, LocalizedStrings.ExceptionColumnHeader };

            exceptionsPageHeader.AddRange(_mapper.GetTargetNames(targets, alwaysIncludeVersion: true));

            int exceptionRows = 0;
            worksheet.AddRow(exceptionsPageHeader.ToArray());
            exceptionRows++;

            foreach (var member in throwingMembers.OrderBy(info => info.MemberDocId))
            {
                var exceptionsByType = member.ExceptionsThrown.GroupBy(exc => exc.Exception, (exception, exceptionList) => new { Key = exception, exceptions = exceptionList });
                foreach (var grouping in exceptionsByType)
                {
                    var rowContent = new List<object> { member.DefinedInAssemblyIdentity, member.MemberDocId, grouping.Key };
                    var groupsByTarget = grouping.exceptions.GroupBy(exc => new FrameworkName(exc.Platform, Version.Parse(exc.Version)), (framework, exceptionList) => new { Key = framework, exceptionsByPlatform = exceptionList });
                    foreach (var target in targets)
                    {
                        bool hasExceptions = false;
                        foreach (var exceptionsByTarget in groupsByTarget)
                        {
                            if (exceptionsByTarget.Key.Equals(target))
                            {
                                hasExceptions = true;
                                string resourceIDHolder = string.Empty;
                                foreach (var exception in exceptionsByTarget.exceptionsByPlatform.OrderBy(exc => exc.RID))
                                {
                                    resourceIDHolder = string.Concat(resourceIDHolder, exception.RID + ";");
                                }

                                if (resourceIDHolder.Length > 0)
                                {
                                    rowContent.Add(resourceIDHolder);
                                }
                                else
                                {
                                    rowContent.Add(LocalizedStrings.NoExceptionNoted);
                                }
                            }
                        }

                        if (!hasExceptions)
                        {
                            rowContent.Add(LocalizedStrings.NoExceptionNoted);
                        }
                    }

                    worksheet.AddRow(rowContent.ToArray());
                    exceptionRows++;
                }
            }

            worksheet.AddTable(1, exceptionRows, 1, exceptionsPageHeader.ToArray());

            // Generate the columns
            var columnWidths = new List<double>
            {
                ColumnWidths.DetailsPage.AssemblyName, // Assembly name
                ColumnWidths.DetailsPage.TargetMember, // Target member
                ColumnWidths.DetailsPage.TargetMember // Exception Width
            };
            columnWidths.AddRange(Enumerable.Repeat(ColumnWidths.Targets, targets.Count)); // Targets

            worksheet.AddColumnWidth(columnWidths);
        }