ExportReport

サマリ

マップ ドキュメントのレイヤまたはスタンドアロン テーブルからのデータを使用した書式設定済みでテーブル形式のレポートを、レポート レイアウト ファイル(*.rlf)で提供されるレポート テンプレート情報とともにエクスポートします。

説明

ExportReport 関数は、本来は ArcMap のレポート ツールを使ってマップ ドキュメント(*.mxd)で作成されるレポートの生成を、自動化するメカニズムを提供します。ArcMap で作成されるレポート レイアウト ファイルは、レポート内のアイテムのコンテンツと配置に関する情報を保存するテンプレートです。レポート レイアウト ファイルをマップ ドキュメント内のソース データとともに使用することにより、出力レポートが作成されます。ソース データには、レポート内で使用される、関連付けられている結合および関連テーブル情報も含まれる場合があります。

注意注意:

ExportReport 関数は、ArcMap のインストールに依存します。そのため、ExportReport は、ArcMap がインストールされているコンピュータ上のみで実行できます。ArcGIS Engine または ArcGIS for Server のスタンドアロン インストールを使用して、ExportReport を実行することはできません。また、ExportReport は、ジオプロセシング サービスとしては機能しません。

ExportReport を正しく実行するには、ソース データがマップ ドキュメント(*.mxd)またはレイヤ ファイル(*.lyr)に存在し、ソース データのデータセット フィールド名がレポート レイアウト ファイルのフィールド名と一致している必要があります。異なるデータ ソースでも、同じデータセット フィールド名が存在していれば、そのデータソースとともにレポート レイアウト ファイルを使用することができます。データが同一でもデータ ソースのフィールド名が異なる場合は、field_map パラメータを使用して、レポート レイアウト ファイルのフィールドをソース データセットの別のフィールド名に再分類することができます。

ArcMap 内でレポート レイアウト ファイルに作成されているものの、ExportReport 関数を介して直接公開されていないエレメントは数多くあります。異なるレポート シナリオを生成してエクスポートするには、テンプレートのコレクションを個別に作成する必要があります。

ArcMap ユーザ インタフェースのレポート ツールには、[データセット オプション] という名前のボタンがあります。作成者はここから、[すべて][選択セット][表示範囲]、および [フィルタ設定] の 4 通りの方法から 1 つを選択することができます。dataset_option パラメータはこのボタンと同じ役割を果たすものであり、キーワードが使用されます。dataset_optionALL または SELECTED に設定すると、適切なレコードが単純に処理されます。dataset_optionDEFINITION_QUERY に設定した場合、report_definition_query パラメータに有効な文字列を指定する必要があります。dataset_optionEXTENT に設定した場合は、extent パラメータに有効な Extent オブジェクトを指定する必要があります。

ユーザ インタフェースの場合同様に、一度に使用できる dataset_option キーワードは 1 つだけです。たとえば、ユーザ インタフェースの場合、選択したレコード セットのみ、および表示範囲のレコードのみを処理することはできません。この規則は ExportReport 関数にも適用され、一度に設定できるのは 1 つのパラメータだけです。複数のパラメータが設定された場合、パラメータは互いに上書きされます。ただし、標準の ArcPy 属性や空間検索関数は組み合わせることが可能であり、dataset_option パラメータの値 SELECTED とともに使用して、最終的な目的のレポートを生成することができます。以下にこの例を示しています。

page_range パラメータでは、ページのサブセットのみを対象にしたレポートを生成できます。これには、連続したページ グループ(5-12)や、不連続のページ セット(3,7)を指定できます。このような場合、starting_page_number1 に設定してレポートを生成すると、印刷されるページ番号は入力したもの(Page 3, Page 7)と同一になります。これは、選択したページ番号だけを再度印刷し、既存のレポートに挿入するシナリオを想定して設計されています。出力ページ番号を連続させる必要がある場合(Page 1, Page 2 など)、starting_page_number には対象のページ番号を指定し、page_range には単一のページを設定する必要があります。つまり、ExportReport をページごとに 1 回実行する必要があるということです。たとえば、starting_page_number = 3, page_range="3" の設定で 1 回実行し、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

A reference to a Layer or TableView object.

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.

  • ALLOverride the report layout file dataset option and process all data source records.
  • DEFINITION_QUERYOverride the report layout file dataset option and provide a new or updated definition query.
  • EXTENTOverride the report layout file dataset option and provide a new or updated extent.
  • SELECTEDOverride the report layout file dataset option and process only the selected records.
  • USE_RLFUse the settings saved in the report layout file.

(デフォルト値は次のとおりです 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.

(デフォルト値は次のとおりです 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:

field_map={'rlf_field1':'data_source_field1', 'rlf_field2':'data_source_field2'}

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

次のスクリプトは上記の例を拡張したもので、空間選択と属性選択の組み合わせによって目的のレポートを生成する方法を示しています。一度に使用できる dataset_option は 1 つだけであるため、これが必要となります。この結果、単一の選択肢に結合され、dataset_option パラメータの値として SELECTED が使用されます。

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 の例 3

次のスクリプトでは、異なるフィールド名を持つ異なるデータセットに対し、既存のレポート レイアウト ファイルを使用します。レポートのレイアウト ファイルのタイトルが新しいタイトルで上書きされ、フィールドは 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 の例 4

次のスクリプトは、マップをレポートに挿入する方法を示しています。複数ページのレポートが生成されます。各ページには、現在のデータ フレーム範囲を表示する大きなピクチャと、範囲内のフィーチャに関する情報を提供するレポートが含まれています。各データフレーム範囲を変更した後、データ フレームは *.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
5/10/2014