Resumen
Exporta un informe tabular con formato utilizando datos de capas o tablas independientes de un documento de mapa junto con la información de plantilla de informe que se proporciona en un archivo de diseño de informe (.rlf).
Debate
La función ExportReport proporciona un mecanismo para automatizar la generación de los informes usando capas o tablas creadas en un documento de mapa (.mxd) o capas de un archivo de capa (.lyr). Un archivo de diseño de informe creado en ArcMap es una plantilla que almacena información sobre el contenido y la ubicación de los elementos en un informe. El archivo de diseño de informe se usa con los datos de origen de un documento de mapa para crear informes de salida. Los datos de origen también pueden tener uniones asociadas y la información de tabla relacionada que se usa en el informe.
Los datos de origen deben existir en un documento de mapa (.mxd) o en un archivo de capa (.lyr) y los nombres de campos del dataset deben coincidir con los del archivo de diseño de informe con el fin de que ExportReport se ejecute correctamente. Se puede usar un archivo de diseño de informe con diferentes fuentes de datos, siempre que el origen de datos tenga los mismos nombres de campos del dataset. Si los datos son similares pero los nombres de campos de la fuente de datos son distintos, el parámetro field_map se puede usar para volver a asignar los campos del archivo de diseño de informe a diferentes nombres de campos del dataset de origen.
Hay numerosos elementos creados en un archivo de diseño de informe de ArcMap que no se exponen directamente a través de la función ExportReport. Puede ser necesario crear un conjunto de plantillas específicas para generar y exportar distintas situaciones de informes.
Las herramientas de creación de informes de la interfaz de usuario de ArcMap tienen un botón denominado Opciones de dataset. Esto permite al autor elegir una de las cuatro formas de procesar los registros: Todo, Conjunto seleccionado, Extensión visible y Consulta de definición. El parámetro dataset_option tiene el mismo propósito y toma una palabra clave. Una dataset_option de ALL o SELECTED procesará los registros adecuados. Si dataset_option se ha definido como DEFINITION_QUERY, se debe proporcionar una cadena de caracteres válida para el parámetro report_definition_query. Si dataset_option se ha definido como EXTENT, se debe proporcionar un objeto Extensión válido para el parámetro extent.
Como en la interfaz de usuario, solo es posible usar una palabra clave de dataset_option cada vez. Por ejemplo, en la interfaz de usuario, no es posible procesar solo el conjunto seleccionado de registros y solo los de la extensión visible. La misma regla se aplica en el caso de la función ExportReport: los parámetros se deben definir de uno en uno. Si se define más de uno de estos parámetros, se sobrescribirán entre sí. Sin embargo, se pueden combinar los atributos estándar de ArcPy y las funciones de consulta espacial y se pueden asociar con un valor de SELECTED para que el parámetro dataset_option genere el informe final deseado. A continuación se indica un ejemplo.
El parámetro page_range permite generar un informe solo para un subconjunto de páginas. Puede ser un grupo continuo de páginas (5-12) o incluso un grupo discontinuo de páginas (3,7). En estos casos, cuando genere un informe y starting_page_number se haya definido como 1, los números de página impresos coincidirán con los que haya introducido (Página 3, Página 7). Esto se diseñó para situaciones en las que solo se va a imprimir un número seleccionado de páginas para insertarlas en informes ya existentes. Si la situación exige que los números de página de salida sean continuos, por ejemplo (Página 1, Página 2), debe definir el starting_page_number de modo que coincida con el número de página de interés y definir el page_range como una sola página. Esto significa que ExportReport se tendrá que ejecutar una vez por cada página; por ejemplo, una vez con starting_page_number = 3, page_range="3" y de nuevo con starting_page_number = 7, page_range="7".
El parámetro field_map solo es necesario si los nombres de campos del dataset difieren entre source_data y los nombres de campos utilizados para generar el archivo de diseño de informe. Al crear la field_map, solo los campos utilizados en el informe se deben agregar al diccionario. Si los campos se eliminan del diccionario de mapa de campos, se eliminarán también del informe. Los campos asignados deben tener tipos de datos idénticos, y los nombres de campos de field_map distinguen entre mayúsculas y minúsculas.
Es posible usar arcpy.mapping para crear informes con el fin de insertar un mapa en el informe. Las imágenes de un informe tienen una propiedad denominada Imagen de origen. Arcpy.mapping no tiene acceso a este valor, pero si el valor de la imagen de origen apunta a una ruta del disco, arcpy.mapping puede actualizar el archivo en el disco con una operación de exportación, y el motor de informes usará la imagen que esté disponible. En un ejemplo de páginas controladas por datos, puede cambiar la imagen en función de la extensión actual, por ejemplo, con arcpy.mapping antes de llamar a la siguiente página. A continuación se indica un ejemplo.
Para obtener más información sobre la creación de informes en ArcGIS, consulte los siguientes temas de introducción:
Sintaxis
ExportReport (report_source, report_layout_file, output_file, {dataset_option}, {report_title}, {starting_page_number}, {page_range}, {report_definition_query}, {extent}, {field_map})
Parámetro | Explicación | Tipo de datos |
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.
(El valor predeterminado es 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. (El valor predeterminado es 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 | An 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 |
Muestra de código
Ejemplo de ExportReport 1
El siguiente script exportará un informe a un archivo PDF usando las entidades seleccionadas de la capa en el documento de mapa. Como se omiten otros parámetros opcionales, el nombre del parámetro extent se introduce explícitamente.
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)
Ejemplo de ExportReport 2
El siguiente script es similar al anterior, pero usa una capa de un archivo de capa como referencia.
lyr = arcpy.mapping.Layer(r"C:\Project\Layers\Transportation.lyr")
arcpy.mapping.ExportReport(lyr,
r"C:\Project\Project.rlf",
r"C:\Project\Output\ProjectReport.pdf",
"EXTENT",
extent=df.extent)
Ejemplo de ExportReport 3
El siguiente script amplía el ejemplo anterior para demostrar cómo se combinan una selección espacial y una selección de atributos para generar el informe deseado. Esto es necesario porque solo se puede usar una dataset_option cada vez. Los resultados se combinan en una única selección y usan un valor de SELECTED para el parámetro 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")
Ejemplo de ExportReport 4
El siguiente script usa un archivo de diseño de informe existente con un dataset diferente con distintos nombres de campos. Se usa un nuevo título para sobrescribir el título del archivo de diseño de informe y los campos se vuelven a asignar usando el parámetro field_map.
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'})
Ejemplo de ExportReport 5
El siguiente script muestra cómo insertar un mapa en un informe. Se genera un informe de varias páginas. Cada página tiene una imagen grande que muestra la extensión del marco de datos actual y un informe que proporciona información sobre las entidades incluidas en la extensión. Una vez que se cambia cada extensión del marco de datos, este se exporta a un archivo .emf y ExportReport se usa para crear un único PDF. Todas las páginas se combinan en un único PDF final.
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()