ExportReport (arcpy.mapping)
Zusammenfassung
Exportiert einen formatierten, tabellarischen Bericht, der Daten aus Layern oder Standalone-Tabellen in einem Kartendokument zusammen mit den Berichtsvorlageninformationen verwendet, die in einer Berichtslayoutdatei (.rlf) bereitgestellt werden.
Diskussion
Die ExportReport-Funktion stellt einen Mechanismus zur automatisierten Erstellung von Berichten bereit, die ursprünglich in einem Kartendokument (.mxd) mithilfe der in ArcMap verfügbaren Berichtswerkzeuge erstellt wurden. Eine in ArcMap erstellte Berichts-Layoutdatei ist eine Vorlage, die Informationen zum Inhalt und zur Platzierung der Elemente in einem Bericht speichert. Die Berichts-Layoutdatei wird mit den Quelldaten in einem Kartendokument zum Erstellen von Ausgabeberichten verwendet. Den Quelldaten können auch Verbindungen und verwandte Tabelleninformationen zugeordnet sein, die im Bericht verwendet werden.
Die Funktion ExportReport steht in Abhängigkeit zur ArcMap-Installation. Daher kann ExportReport nur auf Computern ausgeführt werden, auf denen ArcMap installiert ist. ExportReport kann nicht auf eigenständigen Installationen von ArcGIS Engine oder ArcGIS for Server ausgeführt werden. Außerdem funktioniert ExportReport nicht als Geoverarbeitungs-Service.
Die Quelldaten müssen in einem Kartendokument (.mxd) oder einer Layer-Datei (.lyr) vorhanden sein, und die Dataset-Feldnamen müssen mit denen der Berichts-Layoutdatei übereinstimmen, damit ExportReport ordnungsgemäß ausgeführt wird. Eine Berichts-Layoutdatei kann mit verschiedenen Datenquellen verwendet werden, vorausgesetzt, die Datenquelle weist die gleichen Dataset-Feldnamen auf. Wenn die Daten ähnlich sind, die Feldnamen der Datenquellen sich jedoch unterscheiden, kann der Parameter field_map verwendet werden, um die Felder der Berichts-Layoutdatei unterschiedlichen Feldnamen im Quellen-Dataset erneut zuzuordnen.
Es gibt zahlreiche Elemente, die in einer Berichts-Layoutdatei in ArcMap erstellt werden und nicht direkt über die Funktion ExportReport bereitgestellt werden. In einigen Fällen ist die Erstellung einer Sammlung spezifischer Vorlagen erforderlich, um verschiedene Berichtsszenarien zu generieren und zu exportieren.
Die Berichtswerkzeuge in der ArcMap-Benutzeroberfläche verfügen über eine Schaltfläche mit dem Namen Dataset-Optionen. Über diese Schaltfläche kann der Autor nur eine von vier Methoden zum Verarbeiten von Datensätzen auswählen: Alle, Ausgewählter Satz, Sichtbare Ausdehnung und Definitionsabfrage. Der Parameter dataset_option erfüllt den gleichen Zweck und verwendet ein Schlüsselwort. Mit der dataset_option ALL oder SELECTED werden die entsprechenden Datensätze einfach verarbeitet. Wenn dataset_option auf DEFINITION_QUERY festgelegt wird, muss eine gültige Zeichenfolge für den Parameter report_definition_query bereitgestellt werden. Wenn dataset_option auf EXTENTfestgelegt wird, muss ein gültiges Ausdehnungs-Objekt für den Parameter Ausdehnung angegeben werden.
Ähnlich wie bei der Benutzeroberfläche kann jeweils immer nur ein dataset_option-Schlüsselwort verwendet werden. In der Benutzeroberfläche ist es z. B. nicht möglich, nur die ausgewählte Gruppe von Datensätzen und nur jene in der sichtbaren Ausdehnung zu verarbeiten. Die gleiche Regel gilt für die Funktion ExportReport; es kann jeweils nur ein Parameter festgelegt werden. Wenn mehrere Parameter festgelegt werden, überschreiben sie sich gegenseitig. Standard-ArcPy-Attribut- und/oder räumliche Abfragefunktionen können jedoch kombiniert und mit dem Wert SELECTED für den Parameter dataset_option verbunden werden, um den endgültigen, gewünschten Bericht zu erstellen. Ein Beispiel finden Sie unten.
Mit dem Parameter page_range kann ein Bericht nur für eine Teilmenge von Seiten erstellt werden. Dies kann eine kontinuierliche Gruppe von Seiten (5-12) oder auch eine diskontinuierliche Gruppe von Seiten (3,7) sein. In diesen Fällen stimmen die Seitenzahlen mit Ihrer Eingabe (Seite 3, Seite 7) überein, wenn Sie einen Bericht erstellen und starting_page_number auf 1festgelegt ist. Dies ist für Szenarien vorgesehen, bei denen nur eine ausgewählte Anzahl von Seiten erneut gedruckt und in bereits vorhandene Berichte eingefügt wird. Wenn das Szenario erfordert, dass die Ausgabeseitenzahlen kontinuierlich sind, z. B. (Seite 1, Seite 2), müssen Sie den Parameter starting_page_number auf die gewünschte Seitenzahl und den Parameter page_range auf eine einzelne Seite festlegen. Das bedeutet, dass ExportReport für jede Seite einmal ausgeführt werden muss. Beispielsweise einmal mit starting_page_number = 3, page_range="3" und noch einmal mit starting_page_number = 7, page_range="7".
Der Parameter field_map ist nur dann erforderlich, wenn sich die Dataset-Feldnamen der source_data und die zum Erstellen der Berichts-Layoutdatei verwendeten Feldnamen unterscheiden. Beim Erstellen der field_map müssen nur die im Bericht verwendeten Felder dem Wörterbuch hinzugefügt werden. Wenn Felder aus dem Feldzuordnungswörterbuch gelöscht werden, werden diese Felder auch aus dem Bericht gelöscht. Die zugeordneten Felder müssen identische Datentypen aufweisen und bei den Feldnamen in der field_map wird zwischen Groß- und Kleinschreibung unterschieden.
Es ist möglich, arcpy.mapping zum Erstellen von Berichten zu verwenden, sodass Sie eine Karte in den Bericht aufnehmen können. Bilder in einem Bericht weisen eine Eigenschaft namens Source Image auf. Arcpy.mapping hat keinen Zugriff auf diesen Wert, aber wenn der Wert für die Bildquelle auf einen Pfad auf der Festplatte verweist, kann arcpy.mapping die Datei auf der Festplatte mit einem Exportvorgang aktualisieren, und die Berichts-Engine verwendet das jeweils verfügbare Bild. Beispielsweise könnten Sie für eine Kartenserie das Bild je nach aktueller Ausdehnung mit arcpy.mapping ändern, bevor Sie die nächste Seite aufrufen. Ein Beispiel finden Sie unten.
Weitere Informationen zum Erstellen von Berichten in ArcGIS finden Sie in den folgenden Einführungsthemen:
Syntax
Parameter | Erläuterung | Datentyp |
report_source | Object | |
report_layout_file |
A string that represents the path and file name of the report layout file (.rlf). | String |
output_file |
A string that represents the path and file name of the output file. The specified file extension controls the output format. The following extensions/formats are supported: .htm, .html, .pdf, .rtf, .tif, .tiff, .txt, and .xls. | String |
dataset_option |
A keyword that specifies which dataset rows will be processed in the output report. This value will override the Dataset Options value stored in the report layout file which is found in the Report Properties dialog box. If the dataset_option parameter is not set, it will default to the value stored in the report layout file. If the dataset_option is set to DEFINITION_QUERY, then a valid string needs to be provided for the report_definition_query parameter. If the dataset_option is set to EXTENT, then a valid Extent object needs to be provided for the extent parameter. Because the dataset_option keyword controls which additional parameter to use, only one of these parameters can be set at a time, just like in the user interface.
(Der Standardwert ist USE_RLF) | String |
report_title |
A string that represents the report's title which appears in the report layout file header section. | String |
starting_page_number |
A number that represents the printed page number for the first page of the output report. This value is useful for offsetting page numbers for reports that get appended to the end of existing documents. (Der Standardwert ist 1) | Long |
page_range |
A string that identifies the report pages to be exported to file (for example, 1, 3, 5–12). | String |
report_definition_query |
A string that represents a valid definition query that controls which rows will be exported to the output report. This parameter can only be set if the dataset_option parameter is set to DEFINITION_QUERY.This value will overwrite any settings stored in the report layout file. If the report_source layer or table has an existing definition query, then the report_definition_query will be applied to the existing subset of records. | String |
extent |
A geoprocessing Extent object. This parameter can only be set if the dataset_option parameter is set to EXTENT. When an extent object is passed into this parameter, the rows will be based on those features that intersect the extent. | Extent |
field_map |
This parameter allows you to use a report layout file with a data source that has similar data types but different field names. A dictionary of mapped field names is used to remap the fields used in the report layout file with the new fields in the data source. The following shows an example of the field_map dictionary structure:
| Dictionary |
Codebeispiel
Das folgende Skript exportiert einen Bericht in eine PDF-Datei, indem ausgewählte Features des Layers im Kartendokument verwendet werden. Da andere optionale Parameter übersprungen werden, wird der extent-Parametername explizit eingegeben.
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project.mxd")
df = arcpy.mapping.ListDataFrames(mxd, "Transportation")[0]
lyr = arcpy.mapping.ListLayers(mxd, "Accidents", df)[0]
arcpy.mapping.ExportReport(lyr,
r"C:\Project\Project.rlf",
r"C:\Project\Output\ProjectReport.pdf",
"EXTENT",
extent=df.extent)
del mxd
Das folgende Skript erweitert das Beispiel oben, um zu veranschaulichen, wie eine räumliche Auswahl und eine Attributauswahl kombiniert werden, um den gewünschten Bericht zu generieren. Dies ist erforderlich, da jeweils nur eine dataset_option verwendet werden kann. Die Ergebnisse werden zu einer Auswahl kombiniert und verwenden den Wert SELECTED für den Parameter dataset_option.
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project.mxd")
df = arcpy.mapping.ListDataFrames(mxd, "Transportation")[0]
lyr = arcpy.mapping.ListLayers(mxd, "Accidents", df)[0]
#The DataFrame extent object is converted into a polygon feature so it can be used with the SelectLayerByLocation function.
dfAsFeature = arcpy.Polygon(arcpy.Array([df.extent.lowerLeft, df.extent.lowerRight, df.extent.upperRight, df.extent.upperLeft]),
df.spatialReference)
arcpy.SelectLayerByLocation_management(lyr, "INTERSECT", dfAsFeature, "", "NEW_SELECTION")
arcpy.SelectLayerByAttribute_management(lyr, "SUBSET_SELECTION", "\"Accidents\" > 3")
arcpy.mapping.ExportReport(lyr,
r"C:\Project\Project.rlf",
r"C:\Project\Output\ProjectReport.pdf",
"SELECTED")
del mxd
Das folgende Skript verwendet eine vorhandene Berichts-Layoutdatei für ein anderes Dataset mit anderen Feldnamen. Es wird ein neuer Titel verwendet, um den Titel der Berichts-Layoutdatei zu überschreiben, und die Felder werden mit dem field_map-Parameter neu zugeordnet.
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project.mxd")
df = arcpy.mapping.ListDataFrames(mxd, "Transportation")[0]
lyr = arcpy.mapping.ListLayers(mxd, "Traffic Lights", df)[0]
arcpy.mapping.ExportReport(lyr,
r"C:\Project\Project.rlf",
r"C:\Project\Output\ProjectReport.pdf",
report_title="Traffic Light Coordinates",
field_map={'Accidents':'LightID','X':'Longitude','Y':'Latitude'})
del mxd
Das folgende Skript veranschaulicht, wie eine Karte in einen Bericht eingefügt wird. Es wird ein mehrseitiger Bericht erstellt. Jede Seite enthält ein großes Bild, das die aktuelle Ausdehnung des Datenrahmens anzeigt, sowie einen Bericht, der Informationen zu den Features innerhalb der Ausdehnung angibt. Nachdem jede Datenrahmenausdehnung geändert wurde, wird der Datenrahmen in eine .emf-Datei exportiert und mithilfe von ExportReport eine einzelne PDF-Datei erstellt. Alle Seiten werden zu einer einzelnen endgültigen PDF-Datei zusammengefasst.
import arcpy, os
path = os.getcwd() #a relative path allowing for easy packaging
#Create PDF and remove if it already exists
pdfPath = path + r"\States_SubRegions.pdf"
if os.path.exists(pdfPath):
os.remove(pdfPath)
pdfDoc = arcpy.mapping.PDFDocumentCreate(pdfPath)
subRegionList = ["East North Central", "East South Central", "Middle Atlantic",
"Mountain", "New England", "Pacific", "South Atlantic",
"West North Central", "West South Central"]
mxd = arcpy.mapping.MapDocument(path + r"\States_SubRegions.mxd")
df = arcpy.mapping.ListDataFrames(mxd)[0]
lyr = arcpy.mapping.ListLayers(mxd, "States")[0]
pageCount = 1
for region in subRegionList:
#Generate image for each sub region
whereClause = "\"SUB_REGION\" = '" + region + "'"
lyr.definitionQuery = whereClause
arcpy.SelectLayerByAttribute_management(lyr, "NEW_SELECTION", whereClause)
df.extent = lyr.getSelectedExtent()
arcpy.SelectLayerByAttribute_management(lyr, "CLEAR_SELECTION")
arcpy.mapping.ExportToEMF(mxd, path + "\RegionalPicture.emf", df) #single file
#Generate report
arcpy.mapping.ExportReport(report_source=lyr,
report_layout_file=path + r"\States_SubRegions.rlf",
output_file=path + r"\temp" + str(pageCount) + ".pdf",
starting_page_number=pageCount)
#Append pages into final output
pdfDoc.appendPages(path + r"\temp" + str(pageCount) + ".pdf")
os.remove(path + r"\temp.pdf")
pageCount = pageCount + 1
pdfDoc.saveAndClose()
del mxd