概要
マップ ドキュメント内のレイヤーまたはスタンドアロン テーブルのデータを使用しているテーブル形式の書式設定済みレポートを、レポート レイアウト ファイル (*.rlf) で提供されるレポート テンプレート情報とともにエクスポートします。
ディスカッション
ExportReport 関数には、マップ ドキュメント (*.mxd) で作成されたレイヤーまたはテーブルを使用するか、レイヤー ファイル (*.lyr) 内のレイヤーを使用して、レポートの生成を自動化するメカニズムがあります。 ArcMap で作成されるレポート レイアウト ファイルは、レポート内のアイテムのコンテンツと配置に関する情報を保存するテンプレートです。 レポート レイアウト ファイルをマップ ドキュメント内のソース データとともに使用することにより、出力レポートが作成されます。 ソース データには、レポート内で使用される、関連付けられている結合および関連テーブル情報も含まれる場合があります。
ExportReport を正しく実行するには、ソース データがマップ ドキュメント (*.mxd) またはレイヤー ファイル (*.lyr) 内にすでに存在し、ソース データのデータセット フィールド名がレポート レイアウト ファイルのフィールド名と一致している必要があります。 異なるデータ ソースでも、同じデータセット フィールド名が存在していれば、そのデータ ソースとともにレポート レイアウト ファイルを使用することができます。 データが同じでもデータ ソースのフィールド名が異なる場合は、field_map パラメーターを使用して、レポート レイアウト ファイルのフィールドをソース データセットの別のフィールド名にリマップすることができます。
ArcMap 内にレポート レイアウト ファイルで作成されているが、ExportReport 関数を介して直接公開されていないエレメントは数多くあります。 異なるレポート シナリオを生成してエクスポートするには、テンプレートのコレクションを個別に作成する必要があります。
ArcMap ユーザー インターフェイスのレポート ツールには、[データセット オプション] という名前のボタンがあります。 作成者はここから、[すべて]、[選択セット]、[表示範囲]、および [定義クエリ] の 4 通りの方法から 1 つを選択することができます。 dataset_option パラメーターはこのボタンと同じ役割を果たすものであり、キーワードが使用されます。 dataset_option を ALL または SELECTED に設定すると、適切なレコードが処理されます。 dataset_option を DEFINITION_QUERY に設定した場合は、report_definition_query パラメーターに有効な文字列を指定する必要があります。 dataset_option を EXTENT に設定した場合は、extent パラメーターに有効な [範囲] オブジェクトを指定する必要があります。
ユーザー インターフェイスの場合と同様に、一度に 1 つの dataset_option キーワードしか使用できません。 たとえば、ユーザー インターフェイスの場合、選択したレコード セットのみ、および表示範囲のレコードのみを処理することはできません。 この規則は ExportReport 関数にも適用され、一度に 1 つのパラメーターしか設定できません。 複数のパラメーターが設定された場合、パラメーターは互いに上書きされます。 ただし、標準の ArcPy 属性と空間検索関数は組み合わせることが可能であり、値が SELECTED の dataset_option パラメーターと併用すると、最終的な目的のレポートを生成することができます。 以下にこの例を示しています。
page_range パラメーターでは、ページのサブセットのみを対象にしたレポートを生成できます。 これには、連続したページ グループ (「5-12」) や、不連続のページ セット (「3,7」) を指定できます。 このような場合、starting_page_number を「1」に設定してレポートを生成すると、出力されるページ番号が入力した値と同じになります (「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"」でもう 1 回実行します。
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 | 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.
(デフォルト値は次のとおりです 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 | 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 |
コードのサンプル
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)
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)
ExportReport の例 3
次のスクリプトは上記の例を拡張したもので、空間選択と属性選択の組み合わせによって目的のレポートを生成する方法を示しています。 一度に 1 つの dataset_option しか使用できないため、これが必要となります。 この結果、単一の選択肢に結合され、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")
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'})
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()