摘要
使用来自地图文档的图层或独立表中的数据以及在报表布局文件 (.rlf) 中提供的报表模板信息导出格式化的表格报表。
讨论
ExportReport 函数提供了自动生成报表的机制,这需要使用在地图文档 (.mxd) 中创建的图层或表,或者使用图层文件 (.lyr) 中的图层。在 ArcMap 中创建的报表布局文件是一个模板,用于存储报表内容和其中项目放置位置的信息。将报表布局文件与地图文档中的源数据结合使用才能创建输出报表。源数据还可以具有报表中使用的关联连接和相关表的信息。
要使 ExportReport 正确执行,地图文档 (.mxd) 或图层文件 (.lyr) 中必须存在源数据,并且数据集字段名称必须与报表布局文件中的字段相匹配。如果不同数据源的数据集字段名称相同,则报表布局文件可以与这些数据源配合使用。如果数据相似但数据源字段名称不同,则可以使用 field_map 参数将报表布局文件字段重新映射到源数据集中不同的字段名。
在 ArcMap 的报表布局文件中编写的多个元素无法直接通过 ExportReport 函数显示。因此可能需要编写一系列特定模板,以针对不同情景生成和导出报表。
ArcMap 用户界面中的报表工具包含名为数据集选项的按钮。此按钮可使作者仅从四种方法中选择一种来处理记录:所有、所选集、可见范围以及定义查询。dataset_option 参数也用于相同的目的并使用关键字。关键字为 dataset_option 或 ALL 的 SELECTED 将处理相应的记录。如果 dataset_option 设置为 DEFINITION_QUERY,则需要为 report_definition_query 参数提供有效的字符串。如果将 dataset_option 设置为 EXTENT,则需要为 extent 参数提供有效的范围对象。
与用户界面相似,一次只能使用一个 dataset_option 关键字。例如,在用户界面中,对于仅被选定的一组记录和仅位于可见范围中的记录,无法同时处理。此规则同样适用于 ExportReport 函数;一次只能设置一个参数。如果设置了多个参数,则它们会彼此覆盖。然而,可以将标准 ArcPy 属性和空间查询函数加以组合并与 SELECTED 参数的 dataset_option 值相结合,从而生成所需的最终报表。以下提供了一个示例。
page_range 参数只用于为页面子集生成报表。它可以是一组连续的页 (5-12),或者是一组不连续的页 (3,7)。在这些情况下,当生成报表且 starting_page_number 设置为 1 时,输出的页码将与您输入的内容相匹配(第 3 页、第 7 页)。此种方式针对的是只需重新输出选定编号的页面并将其插入至现有报表的情景。如果要求输出页码是连续页码(例如第 1 页、第 2 页),则您必须将 starting_page_number 设置成与所需页码相同,并将 page_range 设置为单个页面。这意味着,需要每页执行一次 ExportReport,例如,一次 starting_page_number = 3 且 page_range="3",下次 starting_page_number = 7 且 page_range="7"。
只有在数据集字段名称在 field_map 和用于构建报表布局文件的字段名称之间有所不同时,才需要 source_data 参数。创建 field_map 时,只有在报表中使用的字段才需要添加到字典。如果从字段映射字典中删除字段,这些字段也会被从报表中删除。映射的字段必须具有相同的数据类型,且 field_map 中的字段名称区分大小写。
可以使用 arcpy.mapping 创建报表以便在报表中放置地图。报表中的图片具有名为源影像的属性。除非源影像值正指向磁盘路径,否则 Arcpy.mapping 无权访问此值,arcpy.mapping 可以通过导出操作更新磁盘上的文件,随后,报表引擎将使用当前可用的影像。在数据驱动页面示例中,可以根据当前范围更改图片,例如,在调用下一页面之前使用 arcpy.mapping 更改图片。以下提供了一个示例。
有关 ArcGIS 中报表过程的详细信息,请参阅以下专题介绍:
语法
ExportReport (report_source, report_layout_file, output_file, {dataset_option}, {report_title}, {starting_page_number}, {page_range}, {report_definition_query}, {extent}, {field_map})
参数 | 说明 | 数据类型 |
report_source | Object | |
report_layout_file | 用于表示报表布局文件 (.rlf) 的路径和文件名的字符串。 | String |
output_file | 用于表示输出文件的路径和文件名的字符串。指定的文件扩展名可以控制输出格式。支持以下扩展名/格式:.htm、.html、.pdf、.rtf、.tif、.tiff、.txt 和 .xls。 | String |
dataset_option | 指定哪些数据集行将在输出报表中进行处理的关键字。该值将覆盖存储在报表布局文件中的数据集选项值,该值可在报表属性对话框中找到。如果未设置 dataset_option 参数,将默认使用存储于报表布局文件中的值。如果 dataset_option 设置为 DEFINITION_QUERY,则需要为 report_definition_query 参数提供有效的字符串。如果 dataset_option 设置为 EXTENT,则需要为 extent 参数提供有效的 Extent 对象。由于 dataset_option 关键字控制着使用的附加参数,因此每次仅能对这些参数中的一个进行设置,与在用户界面中的情形相似。
(默认值为 USE_RLF) | String |
report_title | 表示报表标题的字符串,会出现在报表布局文件标题部分。 | String |
starting_page_number | 表示输出报表第一页打印页码的数字。该值可用于对追加到现有文档末尾的报表的页码进行调整。 (默认值为 1) | Long |
page_range | 确定要导出到文件的报表页面的字符串(例如 1, 3, 5–12)。 | String |
report_definition_query | 表示有效定义查询的字符串,此有效定义查询可以控制哪些行将导出到输出报表。仅当将 dataset_option 参数设置为 DEFINITION_QUERY 时,才能对此参数进行设置。该值可覆盖存储于报表布局文件中的任何设置。如果 report_source 图层或表具有现有定义查询,则 report_definition_query 将应用于现有记录子集。 | String |
extent | Extent 对象。仅在 dataset_option 参数设置为 EXTENT 时才能设置此参数。当 extent 对象传入到此参数时,行将以与范围相交的这些要素为基础。 | Extent |
field_map | 此参数允许您使用具有数据类型相似、但字段名称不同的数据源的报表布局文件。映射字段名称的字典用于使用数据源中的新字段重新映射报表布局文件中使用的字段。 下图显示了 field_map 字典结构的示例:
| Dictionary |
代码示例
ExportReport 示例 1
以下脚本将使用地图文档中图层的选定要素将报表导出到 PDF 文件。由于省略了其他可选参数,因此显式输入 extent 参数名称。
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
ExportReport 示例 2
以下脚本类似于上述示例,但使用图层文件中的图层作为参考。
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)
del mxd
ExportReport 示例 3
下面的脚本对上述示例进行了扩展,演示如何将空间选择和属性选择加以组合以生成所需报表。由于一次只能使用一个 dataset_option,因此需要进行组合。所得结果将合并到单一选择中,并且 SELECTED 参数使用值 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
ExportReport 示例 4
下列脚本将现有的报表布局文件与具有不同字段名称的另一数据集结合使用。使用新标题覆盖报表布局文件的标题,并使用 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'})
del mxd
ExportReport 示例 5
以下脚本演示了在报表中插入地图的方法。将生成多页面报表。每页都具有大图片和报表,其中,大图片显示当前数据框范围,而报表提供此范围内要素的信息。更改各数据框范围之后,将数据框导出到 .emf 文件中并使用 ExportReport 创建单个 PDF。将所有页面合并为一个最终 PDF。
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