//Open a report project item in a new view.//A report project item may exist but it may not be open in a view. //Reference a report project item by nameReportProjectItemreportPrjItem=Project.Current.GetItems<ReportProjectItem>().FirstOrDefault(item =>item.Name.Equals("MyReport"));//Get the report associated with the layout project itemReportreportToOpen=awaitQueuedTask.Run(()=>reportPrjItem.GetReport());//Create the new paneIReportPaneiNewReporttPane=awaitProApp.Panes.CreateReportPaneAsync(reportToOpen);//GUI thread
Activate an already open report view
Reportreport=Project.Current.GetItems<ReportProjectItem>().FirstOrDefault().GetReport();varreportPane=FrameworkApplication.Panes.FindReportPanes(report).Last();if(reportPane==null)return;//Activate the pane(reportPaneasArcGIS.Desktop.Framework.Contracts.Pane).Activate();//Get the "ReportView" associated with the Report Pane.ReportViewreportView=reportPane.ReportView;
Reference the active layout view
//Confirm if the current, active view is a report view. If it is, do something.ReportViewactiveReportView=ReportView.Active;if(activeReportView!=null){// do something}
vardetailsSection=report.Elements.Where(elm =>elmisReportDetails).FirstOrDefault()asReportDetails;varbounds=detailsSection.GetBounds();//Process on worker threadQueuedTask.Run(()=>reportView.ZoomTo(bounds));
Zoom to page width
//Process on worker threadQueuedTask.Run(()=>reportView.ZoomToPageWidth());
Create Report
Create report
//Note: Call within QueuedTask.Run()//The fields in the datasource used for the report//This uses a US Cities datasetvarlistFields=newList<CIMReportField>{//Grouping should be the first fieldnewCIMReportField{Name="STATE_NAME",FieldOrder=0,Group=true,SortInfo=FieldSortInfo.Desc},//Group cities using STATESnewCIMReportField{Name="CITY_NAME",FieldOrder=1},newCIMReportField{Name="POP1990",FieldOrder=2,},};//Definition query to use for the data sourcevardefQuery="STATE_NAME LIKE 'C%'";//Define the Datasource//pass true to use the selection setvarreportDataSource=newReportDataSource(featureLayer,defQuery,false,listFields);//The CIMPage defintion - page size, units, etcvarcimReportPage=newCIMPage{Height=11,StretchElements=false,Width=6.5,ShowRulers=true,ShowGuides=true,Margin=newCIMMargin{Bottom=1,Left=1,Right=1,Top=1},Units=LinearUnit.Inches};//Report templatevarreportTemplates=awaitReportTemplateManager.GetTemplatesAsync();varreportTemplate=reportTemplates.Where(r =>r.Name=="Attribute List with Grouping").First();//Report StylingvarreportStyles=awaitReportStylingManager.GetStylingsAsync();varreportStyle=reportStyles.Where(s =>s=="Cool Tones").First();//Field StatisticsvarfieldStatisticsList=newList<ReportFieldStatistic>{newReportFieldStatistic{Field="POP1990",Statistic=FieldStatisticsFlag.Sum}//Note: NoStatistics option for FieldStatisticsFlag is not supported.};varreport=ReportFactory.Instance.CreateReport("USAReport",reportDataSource,cimReportPage,fieldStatisticsList,reportTemplate,reportStyle);
Export report to pdf
//Note: Call within QueuedTask.Run()//Define Export OptionsvarexportOptions=newReportExportOptions{ExportPageOption=ExportPageOptions.ExportAllPages,TotalPageNumberOverride=0};//Create PDF format with appropriate settingsPDFFormatpdfFormat=newPDFFormat();pdfFormat.Resolution=300;pdfFormat.OutputFileName=path;report.ExportToPDF($"{report.Name}",pdfFormat,exportOptions,useSelection);
Import a report file
//Note: Call within QueuedTask.Run()ItemreportToImport=ItemFactory.Instance.Create(reportFile);Project.Current.AddItem(reportToImportasIProjectItem);
Delete a report
//Note: Call within QueuedTask.Run()//Reference a reportitem in a project by nameReportProjectItemreportItem=Project.Current.GetItems<ReportProjectItem>().FirstOrDefault(item =>item.Name.Equals(reportName));//Check for report itemif(reportItem==null)returnTask.FromResult<bool>(false);//Delete the report from the projectreturnTask.FromResult<bool>(Project.Current.RemoveItem(reportItem));
Modify Reports
Rename Report
//Note: Call within QueuedTask.Run()ReportProjectItemreportProjItem=Project.Current.GetItems<ReportProjectItem>().FirstOrDefault(item =>item.Name.Equals(reportName));reportProjItem.GetReport().SetName("RenamedReport");
Modify the Report datasource
//Note: Call within QueuedTask.Run()//Remove Groups// The fields in the datasource used for the reportvarlistFields=newList<string>{"STATE_NAME"};report.RemoveGroups(listFields);//Add Groupreport.AddGroup("STATE_NAME",true,true,"");//Modify the Definition QueryvardefQuery="STATE_NAME LIKE 'C%'";report.SetDefinitionQuery(defQuery);
Modify the report Page
//Note: Call within QueuedTask.Run()varcimReportPage=newCIMPage{Height=12,StretchElements=false,Width=6.5,ShowRulers=true,ShowGuides=true,Margin=newCIMMargin{Bottom=1,Left=1,Right=1,Top=1},Units=LinearUnit.Inches};report.SetPage(cimReportPage);//Change only the report's page heightreport.SetPageHeight(12);
Report Design
Get a report template
//Report Template Styles://Attribute List//Attribute List with Grouping//Basic Summary//Basic Summary with Grouping//Page Per FeaturevarreportTemplates=awaitReportTemplateManager.GetTemplatesAsync();varreportTemplate=reportTemplates.Where(r =>r.Name==reportTemplateName).First();
Get a report styling
//Report Styling://Black and White//Cool Tones//Warm TonesvarreportStyles=awaitReportStylingManager.GetStylingsAsync();varreportStyle=reportStyles.Where(s =>s==reportStyleName).First();
Report Elements
Get various Report sections
//Get the "ReportSectionElement"//ReportSectionElement contains the ReportHeader, ReportPageHeader, ReportDetails. ReportPageFooter, ReportFooter sections.varmainReportSection=report.Elements.OfType<ReportSectionElement>().FirstOrDefault();//Get the ReportHeadervarreportHeader=mainReportSection?.Elements.OfType<ReportHeader>().FirstOrDefault();//Get the ReportHeadervarreportPageHeader=mainReportSection?.Elements.OfType<ReportPageHeader>().FirstOrDefault();//Get the "ReportDetails" within the ReportSectionElement. ReportDetails is where "fields" are.varreportDetailsSection=mainReportSection?.Elements.OfType<ReportDetails>().FirstOrDefault();//Get the ReportPageFootervarreportPageFooter=mainReportSection?.Elements.OfType<ReportPageFooter>().FirstOrDefault();//Get the ReportFootervarreportFooter=mainReportSection?.Elements.OfType<ReportFooter>().FirstOrDefault();
Select the fields in a report
//ReportDetailsSection contains the "Fields"varelements=reportDetailsSection.GetElementsAsFlattenedList();reportDetailsSection.SelectElements(elements);
//This is the gap between two fields.doublefieldIncrement=0.9388875113593206276389;//On the QueuedTask//New field to add.varnewReportField=newCIMReportField{Name="POP1990",FieldOrder=2,};//Get the "ReportSectionElement" varmainReportSection=report.Elements.OfType<ReportSectionElement>().FirstOrDefault();if(mainReportSection==null)return;//Get the "ReportDetails" within the ReportSectionElement. ReportDetails is where "fields" are.varreportDetailsSection=mainReportSection?.Elements.OfType<ReportDetails>().FirstOrDefault();if(reportDetailsSection==null)return;//Within ReportDetails find the envelope that encloses a field.//We get the first CIMParagraphTextGraphic in the collection so that we can add the new field next to it. varlastFieldGraphic=reportDetailsSection.Elements.FirstOrDefault((r)=>{vargr=rasGraphicElement;if(gr==null)returnfalse;return(gr.GetGraphic()isCIMParagraphTextGraphic?true:false);});//Get the Envelope of the last fieldvargraphicBounds=lastFieldGraphic.GetBounds();//Min and Max values of the envelopevarxMinOfFieldEnvelope=graphicBounds.XMin;varyMinOfFieldEnvelope=graphicBounds.YMin;varxMaxOfFieldEnvelope=graphicBounds.XMax;varYMaxOfFieldEnvelope=graphicBounds.YMax;//create the new Envelope to be offset from the existing fieldMapPointnewMinPoint=MapPointBuilder.CreateMapPoint(xMinOfFieldEnvelope+fieldIncrement,yMinOfFieldEnvelope);MapPointnewMaxPoint=MapPointBuilder.CreateMapPoint(xMaxOfFieldEnvelope+fieldIncrement,YMaxOfFieldEnvelope);EnvelopenewFieldEnvelope=EnvelopeBuilder.CreateEnvelope(newMinPoint,newMaxPoint);//Create fieldGraphicElementfieldGraphic=ReportElementFactory.Instance.CreateFieldValueTextElement(reportDetailsSection,newFieldEnvelope,newReportField);