ExportReport
Резюме
Эта функция позволяет экспортировать отформатированный табличный отчет с данными из слоев и отдельных таблиц в документ карты наряду со сведениями о шаблоне отчета, которые содержатся в выходном файле отчета (.rlf).
Обсуждение
Функция ExportReport предоставляет механизм автоматизации создания отчетов, изначально создаваемых в документе карты (.mxd) с помощью инструментов отчетов в ArcMap. Файл компоновки отчета, создаваемый в ArcMap, представляет собой шаблон, в котором хранятся сведения о содержимом отчета и расположении его элементов. Файл компоновки отчета создается вместе с исходными данными в документе карты, формируя выходной отчет. С исходными данными также могут быть связаны соединения и относящаяся к ним табличная информация, содержащаяся в отчете.
Функция ExportReport зависит от наличия на компьютере ArcMap. Следовательно, функция ExportReport может выполняться только на компьютерах, на которых установлено ArcMap. ExportReport не запускается с помощью автономных установок ArcGIS Engine или ArcGIS for Server. Кроме того ExportReport не будет работать как служба геообработки.
Исходные данные должны быть в документе карты (.mxd) или в файле слоя (.lyr), а имена полей в наборе данных должны совпадать с аналогичными именами в файле компоновки отчета, чтобы избежать ошибок при выполнении ExportReport. Файл компоновки отчета можно использовать с разными источниками, при условии, что в источнике данных будут те же имена полей в наборе данных. Если данные похожи, но имена полей в наборе данных отличаются, для повторного сопоставления полей в файле компоновки отчета с другими именами полей в наборе данных источника можно использовать параметр field_map.
ArcMap создает в файле компоновки отчета многочисленные элементы, которые не отображаются при экспорте с помощью функции ExportReport. Вам может потребоваться создать коллекцию специальных шаблонов для создания и экспорта отчетов разных типов.
В группе инструментов отчетов в ArcMap есть кнопка Опции набора данных (Dataset options). С помощью этой кнопки пользователь может выбрать один из четырех способов обработки записей: Все (All), Выборка (Selected Set), Отображаемый экстент (Visible Extent) и Запрос определений (Definition Query). Параметр dataset_option работает аналогичным образом по ключевым словам. Параметр dataset_option со значениями ALL или SELECTED позволит обработать соответствующие записи. Если для параметра dataset_option задано значение DEFINITION_QUERY, необходимо задать действительную строку для параметра report_definition_query. Если для параметра dataset_option задано значение EXTENT, необходимо передать объект экстента (Extent) в параметр extent.
Как и в интерфейсе пользователя, для параметра dataset_option нельзя задавать несколько ключевых слов одновременно. Например, в пользовательском интерфейсе невозможно обработать только выборку записей или только отображаемый экстент. Это же справедливо и для функции ExportReport – нельзя задать несколько параметров одновременно. Если будет задано несколько параметров, один из них переопределит другой. Однако допускается комбинирование стандартных атрибутов 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 будет выполняться один раз для каждой страницы. Например, один раз с параметрами starting_page_number = 3, page_range="3" и еще раз с параметрами starting_page_number = 7, page_range="7".
Параметр field_map используется только в тех случаях, когда имена полей в наборе данных в источнике данных source_data отличаются от имен полей, использованных при построении файла компоновки отчета. При создании field_map в словарь необходимо добавлять только поля, непосредственно используемые в отчете. Поля, которых нет в словаре, не будут включены в отчет. Сопоставленные поля должны иметь один тип данных, в именах полей в field_map учитывается регистр.
Для построения отчетов можно использовать arcpy.mapping, поэтому в отчет можно включить карту. У изображений в отчете есть свойство Исходное изображение (Source Image). Функция arcpy.mapping не обращается к этому свойству, однако если в качестве значения задан путь, arcpy.mapping может обновить файл, расположенный в указанном местоположении, с помощью операции экспорта, при этом алгоритм построения отчета использует любое доступное изображение. На примере многостраничной компоновки перед вызовом очередной страницы можно изменить изображение, используя текущий экстент, например с помощью функции arcpy.mapping. Пример приведен ниже.
Дополнительные сведения об отчетах в ArcGIS см. в следующих вводных разделах справки:
Синтаксис
Параметр | Объяснение | Тип данных |
report_source | Object | |
report_layout_file |
Строка, содержащая путь и имя файла компоновки отчета (.rlf). | String |
output_file |
Строка, содержащая путь и имя выходного файла. Указанное расширение определяет выходной формат. Поддерживаются следующие расширения/форматы: .htm, .html, .pdf, .rtf, .tif, .tiff, .txt и .xls. | String |
dataset_option |
Ключевое слово, определяющее, какие строки набора данных будут обрабатываться в итоговом отчете. Этот значение заменит значение в Опциях набора данных (Dataset Options), сохраненное в файле компоновки отчета в диалоговом окне Свойства отчета (Report Properties). Если параметр 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 |
Пример кода
Следующий скрипт выполняет экспорт в 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
Этот скрипт является расширенным вариантом предыдущего и показывает, как пространственная выборка работает в сочетании с атрибутивной выборкой при создании требуемого отчета. Это является обязательным требованием, так как нельзя использовать несколько опций 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
Это скрипт обрабатывает существующий файл компоновки отчета и несоответствующий ему набор данных с отличающимися именами полей. Алгоритм заменяет название файла компоновки отчета новым и выполняет сопоставление полей, используя параметр 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
Этот скрипт демонстрирует вставку карты в отчет. Создается многостраничный отчет. На каждой странице есть большое изображение текущего фрагмента экстента данных и отчет с информацией о пространственных объектах в экстенте. После изменения всех фрагментов данных экстентов фрагмент данных экспортируется в файл .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