in src/lib/Microsoft.Fx.Portability.Reports.Excel/ExcelOpenXmlOutputWriter.cs [263:353]
private void GenerateDetailsPage(Worksheet detailsPage, ReportingResult analysisResult)
{
var showAssemblyColumn = analysisResult.GetAssemblyUsageInfo().Any();
var detailsPageHeader = new List<string>() { LocalizedStrings.TargetTypeHeader, LocalizedStrings.TargetMemberHeader };
if (showAssemblyColumn)
{
detailsPageHeader.Add(LocalizedStrings.AssemblyHeader);
}
detailsPageHeader.AddRange(_mapper.GetTargetNames(analysisResult.Targets, alwaysIncludeVersion: true));
detailsPageHeader.Add(LocalizedStrings.RecommendedChanges);
int detailsRows = 0;
detailsPage.AddRow(detailsPageHeader.ToArray());
detailsRows++;
// Dump out all the types that were identified as missing from the target
foreach (var item in analysisResult.GetMissingTypes().OrderByDescending(n => n.IsMissing))
{
if (item.IsMissing)
{
if (!showAssemblyColumn)
{
// for a missing type we are going to dump the type name for both the target type and target member columns
var rowContent = new List<object> { AddLink(item.TypeName), AddLink(item.TypeName) };
rowContent.AddRange(item.TargetStatus);
rowContent.Add(item.RecommendedChanges);
detailsPage.AddRow(rowContent.ToArray());
detailsRows++;
}
else
{
foreach (var assemblies in item.UsedIn)
{
string assemblyName = analysisResult.GetNameForAssemblyInfo(assemblies);
// for a missing type we are going to dump the type name for both the target type and target member columns
var rowContent = new List<object> { AddLink(item.TypeName), AddLink(item.TypeName), assemblyName };
rowContent.AddRange(item.TargetStatus);
rowContent.Add(item.RecommendedChanges);
detailsPage.AddRow(rowContent.ToArray());
detailsRows++;
}
}
}
foreach (var member in item.MissingMembers.OrderBy(type => type.MemberName))
{
if (showAssemblyColumn)
{
foreach (var assem in member.UsedIn.OrderBy(asm => asm.AssemblyIdentity))
{
string assemblyName = analysisResult.GetNameForAssemblyInfo(assem);
var rowContent = new List<object> { AddLink(item.TypeName), AddLink(member.MemberName), assemblyName };
rowContent.AddRange(member.TargetStatus);
rowContent.Add(member.RecommendedChanges);
detailsPage.AddRow(rowContent.ToArray());
detailsRows++;
}
}
else
{
var rowContent = new List<object> { AddLink(item.TypeName), AddLink(member.MemberName) };
rowContent.AddRange(member.TargetStatus);
rowContent.Add(member.RecommendedChanges);
detailsPage.AddRow(rowContent.ToArray());
detailsRows++;
}
}
}
// Generate the pretty tables
detailsPage.AddTable(1, detailsRows, 1, detailsPageHeader.ToArray());
// Generate the columns
var columnWidths = new List<double>
{
ColumnWidths.DetailsPage.TargetType, // Target type
ColumnWidths.DetailsPage.TargetMember, // Target member
ColumnWidths.DetailsPage.AssemblyName // Assembly name
};
columnWidths.AddRange(Enumerable.Repeat(ColumnWidths.Targets, analysisResult.Targets.Count)); // Targets
columnWidths.Add(ColumnWidths.DetailsPage.RecommendedChanges); // Recommended changes
detailsPage.AddColumnWidth(columnWidths);
}