Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
Формат Excel для файловых мест назначения в настоящее время находится в стадии предварительного просмотра.
При работе с назначением, основанным на файлах, в Dataflow Gen2 у вас есть возможность сохранить данные в различных форматах, включая Excel. Файлы Excel можно создавать с помощью простых табличных данных, но можно также создавать сложные книги с несколькими листами, диаграммами и настраиваемым форматированием с помощью таблиц навигации. Эти таблицы навигации определяют структуру и содержимое документа Excel программным способом и обеспечивают эффективный способ создания динамических файлов Excel.
В этой статье объясняется, как создавать эти таблицы навигации для программного создания документов Excel из потока данных.
Необходимые условия
Прежде чем использовать расширенное назначение Excel, необходимо настроить поток данных 2-го поколения с правильной конфигурацией:
Создайте запрос таблицы навигации . В потоке данных 2-го поколения создайте запрос, который выводит таблицу навигации, как описано в этой статье. Запрос должен возвращать таблицу с необходимыми столбцами (
PartType,Data, а также при необходимостиSheet,Name, иProperties).Добавление назначения данных . Выберите запрос таблицы навигации и добавьте назначение данных, выбрав "Добавить назначение данных " в контекстном меню запроса или на ленте.
Выберите назначение на основе файлов. Выберите место назначения на основе файлов, например:
- SharePoint
- Lakehouse Files
- Azure Data Lake Storage Gen2
- Azure Blob-хранилище
Установите формат файла в Excel. В целевой конфигурации установите Формат файла на Excel.
Выберите расширенный формат . В раскрывающемся списке "Формат " выберите "Дополнительно". Этот параметр указывает соединителю интерпретировать выходные данные запроса как таблицу навигации, которая определяет структуру документов Excel.
После настройки при запуске потока данных система считывает таблицу навигации и создает соответствующий файл Excel со определенной структурой.
Обзор
Документы Excel в Power Query представлены в виде таблиц навигации — стандартных таблиц M с определенными столбцами, описывающими структуру документов. Каждая строка в таблице навигации представляет часть документа Excel, например лист, содержащий данные или диаграмму, визуализируя эти данные.
При настройке назначения выходных данных Excel в потоке данных система считывает эту таблицу навигации и создает соответствующий файл Excel. Такой подход обеспечивает гибкость в создании сложных рабочих книг с несколькими листами, диаграммами и связями данных.
Краткий справочник
В этом разделе представлено консолидированное представление типов частей и их ключевые свойства для быстрого поиска. Готовые шаблоны кода см. в разделе "Общие шаблоны". Сведения об устранении ошибок см. в разделе "Устранение неполадок".
Типы частей на первый взгляд
| Тип части | Purpose | Обязательные данные | Позиционирование | Несколько экземпляров на лист |
|---|---|---|---|---|
Workbook |
Параметры уровня документа | Нет (null) |
N/A | Нет (только первая строка) |
SheetData |
Простой экспорт данных | Да (встроенная таблица) | Всегда A1 | Нет |
Table |
Таблица Excel с форматированием | Да (встроенная таблица) |
StartCell или авто |
Да (если нет перекрытия) |
Range |
Необработанные данные без стилизации таблиц | Да (встроенная таблица) |
StartCell или авто |
Да (если нет пересечения) |
Chart |
Визуализация диаграммы | Да (встроенный или справочный) | Свойство Bounds |
Да |
Ключевые свойства по типу части
| Недвижимость | Рабочая тетрадь | Sheetdata | таблица | Диапазон | Диаграмма |
|---|---|---|---|---|---|
StartCell |
- | - | ✓ | ✓ | - |
TableStyle |
- | - | ✓ | - | ✓* |
SkipHeader |
- | - | - | ✓ | - |
ShowGridlines |
- | ✓ | ✓ | ✓ | ✓ |
ChartType |
- | - | - | - | ✓ |
ChartTitle |
- | - | - | - | ✓ |
DataSeries |
- | - | - | - | ✓ |
Bounds |
- | - | - | - | ✓ |
ChartInferenceFunction |
✓ | - | - | - | - |
StrictNameHandling |
✓ | - | - | - | - |
UseSharedStrings |
✓ | - | - | - | - |
AutoPositionColumnOffset |
- | - | ✓ | ✓ | ✓* |
AutoPositionRowOffset |
- | - | ✓ | ✓ | ✓* |
* Для диаграмм с встроенными данными эти свойства управляют резервной таблицей данных.
Минимальный пример
Самый простой способ создания документа Excel — предоставить таблицу навигации только для экспортируемых данных. Все столбцы, кроме Data и PartType являются необязательными, соединитель может выводить отсутствующие свойства и создавать функциональный документ.
В следующем примере определяется SalesData таблица, используемая в этой статье:
let
// Define your data with columns used throughout this article
SalesData = #table(
type table [
Region = text,
Category = text,
Product = text,
Quarter = text,
Revenue = number,
Units = number
],
{
{"North", "Electronics", "Laptop", "Q1", 45000, 150},
{"North", "Electronics", "Phone", "Q1", 32000, 400},
{"North", "Furniture", "Desk", "Q1", 18000, 60},
{"South", "Electronics", "Laptop", "Q1", 38000, 120},
{"South", "Electronics", "Phone", "Q1", 28000, 350},
{"South", "Furniture", "Chair", "Q1", 12000, 200},
{"East", "Electronics", "Tablet", "Q2", 22000, 180},
{"East", "Furniture", "Desk", "Q2", 15000, 50},
{"West", "Electronics", "Phone", "Q2", 41000, 520},
{"West", "Furniture", "Chair", "Q2", 9000, 150}
}
),
// Create the navigation table with minimal structure
// Only Data and PartType are required
excelDocument = #table(
type table [PartType = nullable text, Data = any],
{
{"SheetData", SalesData}
}
)
in
excelDocument
Если имена листов или имен частей не указаны, система автоматически создает соответствующие значения по умолчанию.
Ссылка на другие запросы
В потоке данных можно ссылаться на другие существующие запросы в таблице навигации. Столбец Data принимает любое табличное значение, включая ссылки на запросы, определенные в другом месте потока данных:
let
// Reference existing queries named "MonthlySales" and "CurrentInventory"
excelDocument = #table(
type table [PartType = nullable text, Data = any],
{
{"SheetData", MonthlySales},
{"SheetData", CurrentInventory}
}
)
in
excelDocument
Структура таблицы навигации
Таблица навигации соответствует определенной схеме со следующими столбцами:
| колонна | Тип | Обязательный | Описание |
|---|---|---|---|
| Таблица | Текст, допускающий значение NULL | Нет | Имя родительского листа для части. Если это не указано, создается имя по умолчанию. |
| Имя | Текст, допускающий значение NULL | Нет | Уникальный идентификатор компонента. Требуется только в том случае, если другие части должны ссылаться на данные этой части. |
| PartType | Текст, допускающий значение NULL | Нет | Тип создаваемой части: Workbook, SheetData, Table, Rangeили Chart. |
| Свойства | Запись, допускающая значение NULL | Нет | Параметры конфигурации, относящиеся к типу части. |
| Данные | any | Да | Фактическое содержимое данных. Может быть таблицей или ссылкой на другую часть. |
Поддерживаемые типы частей
- Книга: Конфигурация на уровне документа. Если используется, должна быть первой строкой. Не содержит данных.
- SheetData: лист, содержащий табличные данные. Эта часть привязана к данным. Части SheetData должны содержать встроенные данные и не могут использовать ссылки на таблицы. Создает один диапазон данных, начиная с ячейки A1.
-
Таблица: таблица Excel (отформатированная со стилями таблицы). Эта часть привязана к данным. Поддерживает явное позиционирование через
StartCellи автоматическое позиционирование. Несколько частей таблицы могут существовать на одном листе, если они не перекрываются. -
Диапазон: диапазон данных без форматирования таблицы Excel. Эта часть привязана к данным. Поддерживает явное размещение с помощью
StartCellи автоматическое позиционирование. Несколько частей диапазона могут существовать на одном листе, если они не перекрываются. - Диаграмма: визуализация диаграммы. Можно разместить на отдельном листе или объединить на одном листе с данными. Эта часть привязана к данным , если она содержит встроенные данные или может ссылаться на данные из другой части.
Замечание
Привязанные к данным части — это части , содержащие или ссылающиеся табличные данные.
SheetData, Table, Range и Chart (с встроенными данными) являются частями, связанными с данными. Каждая часть, привязанная к данным, регистрирует свой источник данных с помощью части Name, поэтому все связанные с данными части должны иметь уникальные имена.
Это важно
Вы не можете смешивать SheetData с Table или Range частями на одном листе. Используйте либо SheetData отдельно, либо Table/Range вместе. Если требуется несколько областей данных на одном листе, используйте Table или Range части с размещением.
Выбор подходящего типа части
Используйте это руководство по принятию решений, чтобы выбрать подходящий тип части для вашего сценария:
Используйте SheetData когда:
- Вам нужна простая, единая область данных на каждом листе
- Данные должны начинаться с ячейки A1
- Вам не нужны функции таблицы Excel (фильтры, структурированные ссылки)
- Вы экспортируете простые табличные данные
Используйте Table когда:
- Требуется форматирование таблицы Excel с раскрывающимся списком фильтров
- Для формул требуются структурированные ссылки
- Вы размещаете несколько регионов данных на одном листе
- Вам нужен точный контроль над позиционированием с помощью
StartCell - Вы хотите применить стили таблиц (
TableStyleMedium1и т. д.)
Используйте Range когда:
- Вам нужны необработанные данные без форматирования таблицы Excel
- Вы хотите опустить заголовки (
SkipHeader = true) - Вы размещаете несколько регионов данных на одном листе
- Данные будут использоваться другими системами, ожидающими обычные диапазоны
Используйте Chart когда:
- Вам нужна визуализация данных
- С встроенными данными: диаграмма и данные отображаются вместе на одном листе
- Ссылки: диаграмма и данные могут находиться на отдельных листах, а несколько диаграмм могут совместно использовать один источник данных.
Пример с полной структурой
let
// Helper function to create a reference to another part
buildReference = (name as text) => #table({}, {}) meta [Name = name],
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
{"Workbook", "Workbook", "Workbook", [ChartInferenceFunction = Office.InferChartPropertiesGenerator()], null},
{"DataSheet", "SalesTable", "SheetData", [], SalesData},
{"ChartSheet", "SalesChart", "Chart", [ChartType = "Column"], buildReference("SalesTable")}
}
)
in
excelDocument
Диаграммы и размещение данных
При создании части диаграммы можно управлять отображением диаграммы и ее данных в книге.
Диаграмма с отдельным листом данных
Если диаграмма ссылается на данные из другой части с помощью синтаксиса meta [Name = "..."] , данные и диаграммы помещаются на отдельные листы.
Это важно
При использовании ссылок столбец Name является обязательным. Ссылка разрешается путем сопоставления значения в meta [Name = "..."] со столбцом Name в другой строке таблицы навигации.
let
// Helper function to create a reference to another part
buildReference = (name as text) => #table({}, {}) meta [Name = name],
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
{"Workbook", "Workbook", "Workbook", [ChartInferenceFunction = Office.InferChartPropertiesGenerator()], null},
// Data on its own sheet
{"DataSheet", "SalesTable", "SheetData", [], SalesData},
// Chart on a different sheet, referencing the data
{"ChartSheet", "SalesChart", "Chart", [ChartType = "Line"], buildReference("SalesTable")}
}
)
in
excelDocument
Диаграмма с встроенными данными
Если часть диаграммы содержит данные напрямую (без ссылки на другую часть), данные и диаграмма создаются на одном листе:
let
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
{"Workbook", "Workbook", "Workbook", [ChartInferenceFunction = Office.InferChartPropertiesGenerator()], null},
// Data and chart appear together on the same sheet
{"SalesSheet", "SalesChart", "Chart", [ChartType = "Column"], SalesData}
}
)
in
excelDocument
Этот подход удобнее, если вы хотите, чтобы пользователи видели данные вместе с ее визуализацией.
Несколько диаграмм с встроенными данными на одном листе
Если несколько частей диаграмм имеют встроенные данные (а не ссылки), каждая диаграмма создает собственную таблицу резервных данных на одном листе. Система автоматически располагает эти вспомогательные таблицы, чтобы избежать перекрытия с помощью автоматического позиционирования. Внешний вид резервной таблицы можно контролировать, указав TableStyle, AutoPositionColumnOffset и AutoPositionRowOffset в настройках части диаграммы.
let
ProductData = #table(
type table [Product = text, Sales = number],
{{"Widget", 100}, {"Gadget", 200}, {"Gizmo", 150}}
),
RegionData = #table(
type table [Region = text, Revenue = number],
{{"North", 5000}, {"South", 3000}, {"East", 4000}}
),
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
// First chart with inline data - backing table auto-positioned
{"Dashboard", "ProductChart", "Chart",
[
Bounds = "B2:H15",
ChartType = "Column",
ChartTitle = "Product Sales",
DataSeries = [AxisColumns = {"Product"}, ValueColumns = {"Sales"}]
],
ProductData
},
// Second chart with inline data - backing table auto-positioned after first
{"Dashboard", "RegionChart", "Chart",
[
Bounds = "J2:P15",
ChartType = "Pie",
ChartTitle = "Revenue by Region",
TableStyle = "TableStyleLight1", // Style for the backing table
AutoPositionRowOffset = 2, // Add extra row gap from previous table
DataSeries = [AxisColumns = {"Region"}, ValueColumns = {"Revenue"}]
],
RegionData
}
}
)
in
excelDocument
Части таблицы и диапазона
Table и Range части обеспечивают больше контроля над размещением данных, чем SheetData. Используйте их, если требуется несколько областей данных на одном листе или требуется определенное расположение.
Часть таблицы
Часть Table создает таблицу Excel с форматированием, раскрывающимся списком фильтров и структурированными ссылками. Используйте его при желании функций таблицы Excel.
| Недвижимость | Тип | По умолчанию | Описание |
|---|---|---|---|
| StartCell | текст | "auto" |
Левая верхняя ячейка таблицы (например, "B3"). Используйте "auto" для автоматического размещения. |
| СтильТаблицы | текст | "TableStyleMedium2" |
Стиль таблицы Excel. Допустимые значения: TableStyleLight1-21, , . TableStyleMedium1-28TableStyleDark1-11 |
| АвтопозиционированиеСмещениеколонки | число/номер | 1 |
Смещение столбца от A при автоматическом расположении (1 = столбец B). |
| AutoPositionRowOffset | число/номер | 1 |
Разрыв строк от предыдущего содержимого при автоматическом расположении. |
let
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
// Table with explicit position and custom style
{"Sales", "SalesTable", "Table",
[StartCell = "B3", TableStyle = "TableStyleMedium9"],
SalesData
}
}
)
in
excelDocument
Часть диапазона
Часть Range создает диапазон данных без форматирования таблицы Excel. Используйте его, если вам нужны необработанные данные без функций таблицы.
| Недвижимость | Тип | По умолчанию | Описание |
|---|---|---|---|
| StartCell | текст | "auto" |
Левая верхняя ячейка для диапазона (например, "C5"). Используйте "auto" для автоматического размещения. |
| ПропуститьЗаголовок | logical | false |
Если true, исключается строка заголовка. |
| АвтоПозицияКолонкаСмещение | число/номер | 1 |
Смещение столбца от A при автоматическом расположении. |
| AutoPositionRowOffset | число/номер | 1 |
Разрыв строк от предыдущего содержимого при автоматическом расположении. |
Замечание
Если SkipHeader равен true, диапазон нельзя использовать в качестве ссылки на источник данных для диаграмм. Для определения имен рядов данных диаграммы требуются строки заголовков.
let
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
// Range at a specific position
{"Data", "DataRange", "Range",
[StartCell = "D5"],
SalesData
}
}
)
in
excelDocument
Несколько таблиц на одном листе
Вы можете разместить несколько частей Table или Range на одном листе, при условии что они не перекрываются.
let
SummaryData = #table(type table [Metric = text, Value = number], {{"Total", 50000}, {"Average", 5000}}),
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
// Two tables side by side
{"Report", "DetailTable", "Table",
[StartCell = "A1", TableStyle = "TableStyleMedium9"],
SalesData
},
{"Report", "SummaryTable", "Table",
[StartCell = "I1", TableStyle = "TableStyleLight15"],
SummaryData
}
}
)
in
excelDocument
Автоматическое позиционирование
Если вы не указываете StartCell (или не задаете его "auto"), система автоматически помещает части по вертикали, по одному ниже другого, в том порядке, в который они отображаются в таблице навигации. Это полезно при наличии нескольких регионов данных и не требует точного управления.
| Недвижимость | По умолчанию | Описание |
|---|---|---|
| АвтопозиционированиеСмещениеколонки | 1 |
Смещение начального столбца относительно A. Значение 0 начинается со столбца A, а 1 соответствует столбцу B. |
| AutoPositionRowOffset | 1 |
Количество пустых строк между частями. Значение 0 размещает части непосредственно рядом. |
let
DataA = #table(type table [X = number], {{1}, {2}, {3}}),
DataB = #table(type table [Y = number], {{10}, {20}}),
DataC = #table(type table [Z = number], {{100}}),
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
// First table: starts at B2 (column offset 1, row offset 1)
{"AutoSheet", "Table1", "Table", [], DataA},
// Second table: starts at B + (3 data rows + 1 header + 1 gap) = B7
{"AutoSheet", "Table2", "Table", [], DataB},
// Third table: continues below Table2
{"AutoSheet", "Table3", "Table", [], DataC}
}
)
in
excelDocument
Чтобы изменить поведение позиционирования:
let
DataA = #table(type table [X = number], {{1}, {2}, {3}}),
DataB = #table(type table [Y = number], {{10}, {20}}),
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
// Start at column C (offset 2), row 4 (offset 3)
{"CustomOffset", "Table1", "Table",
[AutoPositionColumnOffset = 2, AutoPositionRowOffset = 3],
DataA
},
// Start at column A (offset 0), with 2 row gap
{"CustomOffset", "Table2", "Table",
[AutoPositionColumnOffset = 0, AutoPositionRowOffset = 2],
DataB
}
}
)
in
excelDocument
Это важно
Вы не можете смешивать автоматическое позиционирование с явными StartCell значениями на одном листе. Все части на листе должны использовать либо автоматическое позиционирование (без StartCell или StartCell = "auto"), либо явные ссылки на ячейки.
Перекрытия
Система обнаруживает и сообщает перекрывающиеся диапазоны. Если два компонента пытаются записать в одни и те же ячейки, возникает ошибка.
Чтобы избежать перекрытия:
- Использование автоматического позиционирования и разрешение системе упорядочивать части по вертикали
- При использовании явных
StartCellзначений убедитесь, что части не используют общие ячейки - Учитывайте строку заголовка при вычислении позиций (таблицы всегда включают строку заголовка, в диапазонах это не обязательно).
Ширина столбца
Ширина столбцов вычисляется автоматически на основе содержимого и типов данных. Если несколько диапазонов используют одни и те же столбцы, самый верхний диапазон (по начальной строке) определяет ширину этих общих столбцов.
Свойство ShowGridlines
Свойство ShowGridlines определяет, отображаются ли линии сетки Excel для листа. Это свойство может быть задано на частях SheetData, Table, Range или Chart и влияет на весь лист. Когда true (по умолчанию) линии сетки видны. Когда falseлинии сетки скрыты.
Если какая-либо часть листа явно устанавливает ShowGridlines в false, то весь лист скрывает линии сетки.
let
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
// Hide gridlines for this sheet
{"CleanReport", "DataTable", "Table",
[ShowGridlines = false, StartCell = "B2"],
SalesData
}
}
)
in
excelDocument
Свойства рабочей книги
Тип Workbook части позволяет настроить параметры уровня документа. При использовании она должна быть первой строкой в таблице навигации.
| Недвижимость | Тип | Описание |
|---|---|---|
| ChartInferenceFunction | function | Функция, которая автоматически определяет свойства диаграммы, если они не указаны явно. Используется Office.InferChartPropertiesGenerator() для встроенного механизма вывода. |
| StrictNameHandling | logical | Если true обнаруживает, что имена листов или частей содержат недопустимые символы, генерируется ошибка. При false (по умолчанию) имена автоматически очищаются. |
| UseSharedStrings | logical | Если true (по умолчанию) использует общую таблицу строк Excel для текстовых ячеек, что приводит к более мелким файлам. |
Пример со свойствами рабочей тетради
let
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
// Workbook configuration (must be first)
{"Workbook", "Workbook", "Workbook",
[
ChartInferenceFunction = Office.InferChartPropertiesGenerator([
Allow3DCharts = false,
PreferMultilevelChartInference = true
]),
StrictNameHandling = false
],
null
},
// Data and charts follow
{"Sales", "SalesTable", "SheetData", [], SalesData}
}
)
in
excelDocument
Несколько диаграмм с общими данными
Диаграммы могут ссылаться на один источник данных, позволяя создавать несколько визуализаций одного набора данных без дублирования данных в книге.
Используйте синтаксис meta [Name = "..."] для создания ссылок. Столбец Name должен быть указан для части данных, чтобы диаграммы могли правильно интерпретировать ссылку.
Это важно
При использовании эталонных данных диаграмм необходимо предоставить конфигурацию DataSeries и AxisColumnsValueColumns.
ChartInferenceFunction Без настройки в свойствах книги, пропуск этих обязательных параметров приводит к ошибке.
let
// Helper function to create a reference
buildReference = (name as text) => #table({}, {}) meta [Name = name],
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
// Single data source - Name is required for reference resolution
{"Data", "SalesTable", "SheetData", [], SalesData},
// Multiple charts referencing the same data
// Each chart must specify DataSeries with AxisColumns and ValueColumns
{"LineChart", "TrendChart", "Chart",
[
ChartType = "Line",
ChartTitle = "Sales Trend",
DataSeries = [AxisColumns = {"Quarter"}, ValueColumns = {"Revenue"}]
],
buildReference("SalesTable")
},
{"PieChart", "DistributionChart", "Chart",
[
ChartType = "Pie",
ChartTitle = "Sales Distribution",
DataSeries = [AxisColumns = {"Region"}, ValueColumns = {"Revenue"}]
],
buildReference("SalesTable")
},
{"BarChart", "ComparisonChart", "Chart",
[
ChartType = "Bar",
ChartTitle = "Product Comparison",
DataSeries = [AxisColumns = {"Product"}, ValueColumns = {"Revenue", "Units"}]
],
buildReference("SalesTable")
}
}
)
in
excelDocument
Ссылки работают как в направлениях вперед, так и в обратном направлении— диаграмма может ссылаться на данные, определенные позже в таблице, и несколько диаграмм могут ссылаться на один и тот же источник данных.
Типовые фасеты и форматирование ячеек
Типы данных Power Query и их аспекты напрямую влияют на форматирование ячеек в созданном файле Excel. Система типов предоставляет широкие возможности форматирования, которые преобразуются в соответствующие числовые форматы Excel.
Базовые сопоставления типов
| Тип Power Query | Формат Excel |
|---|---|
Text.Type |
Текст (@) |
Int32.Type, Int64.Type |
Общие сведения |
Decimal.Type, Number.Type |
Число с двумя десятичными знаками |
Currency.Type |
Число с разделителем тысяч и двумя десятичными знаками |
Percentage.Type |
Процент с двумя десятичными знаками |
Date.Type |
Формат даты |
Time.Type |
Формат времени с am/PM |
DateTime.Type |
Формат даты и времени |
DateTimeZone.Type |
Формат даты и времени |
Duration.Type |
Формат длительности (d.hh:mm:ss) |
Logical.Type |
Общие (ИСТИНА/ЛОЖЬ) |
Использование аспектов типов для точного форматирования
Аспекты типов позволяют указать точность и масштаб для числовых значений:
let
// Define types with specific facets
currencyType = Type.ReplaceFacets(Currency.Type,
[NumericPrecisionBase = 10, NumericPrecision = 19, NumericScale = 4]),
percentageType = Type.ReplaceFacets(Percentage.Type,
[NumericPrecisionBase = 10, NumericPrecision = 5, NumericScale = 2]),
decimalType = Type.ReplaceFacets(Decimal.Type,
[NumericPrecisionBase = 10, NumericPrecision = 10, NumericScale = 4]),
// Create table with typed columns
tableType = type table [
Product = Text.Type,
Price = currencyType, // Displays as currency with 4 decimal places
Discount = percentageType, // Displays as percentage with 2 decimal places
TaxRate = decimalType // Displays as number with 4 decimal places
],
pricingData = #table(tableType, {
{"Widget", 29.9999, 0.15, 0.0825},
{"Gadget", 49.9500, 0.20, 0.0825}
}),
// Create navigation table with the typed data
excelDocument = #table(
type table [PartType = nullable text, Data = any],
{
{"SheetData", pricingData}
}
)
in
excelDocument
Точность DateTime
Вы можете управлять точностью компонентов времени с помощью DateTimePrecision аспекта.
let
// Time with millisecond precision
timeWithMs = Type.ReplaceFacets(Time.Type, [DateTimePrecision = 3]),
// DateTime with microsecond precision (Excel maximum is 3 digits)
dateTimeWithPrecision = Type.ReplaceFacets(DateTime.Type, [DateTimePrecision = 7]),
tableType = type table [
EventName = Text.Type,
EventTime = timeWithMs,
Timestamp = dateTimeWithPrecision
],
eventsData = #table(tableType, {
{"Start", #time(9, 30, 15.123), #datetime(2025, 1, 15, 9, 30, 15.1234567)},
{"End", #time(17, 45, 30.456), #datetime(2025, 1, 15, 17, 45, 30.9876543)}
}),
// Create navigation table with the typed data
excelDocument = #table(
type table [PartType = nullable text, Data = any],
{
{"SheetData", eventsData}
}
)
in
excelDocument
Замечание
Excel поддерживает точность до трех знаков после запятой в долях секунды. Значения более высокой точности усечены.
Конфигурация диаграммы
Диаграммы настраиваются с помощью Properties записи. Вы можете явно указать параметры диаграммы или полагаться на подсистему вывода для определения соответствующих значений.
Свойства диаграммы
| Недвижимость | Тип | Описание |
|---|---|---|
| ТипДиаграммы | текст | Тип создаваемой диаграммы. |
| Название диаграммы | текст | Заголовок, отображаемый на диаграмме. |
| DataSeries | запись | Конфигурация для рядов данных, осей и значений. |
| Граница | запись или текст | Положение и размер диаграммы. См. положение диаграммы. |
Расположение диаграммы
Свойство Bounds управляет размещением диаграммы и его размером. Можно указать границы в качестве текстового значения с помощью синтаксиса диапазона Excel или записи с подробными параметрами размещения.
Размещение по умолчанию
Если Bounds не указано, диаграммы размещаются в расположении по умолчанию, начиная с ячейки H8 с размером по умолчанию размером 8 столбцов в ширину и 16 строк. Несколько диаграмм на одном листе без явного Bounds будут перекрываться в этой позиции по умолчанию.
Текстовый формат (синтаксис диапазона Excel)
Используйте ссылку на одну ячейку для левого верхнего угла (размер по умолчанию 8 столбцов x 16 строк) или диапазон для явных измерений:
// Single cell: chart starts at B2 with default size
[Bounds = "B2"]
// Range: chart fills the area from G6 to N21
[Bounds = "G6:N21"]
Формат записи с шириной и высотой
Укажите левый верхний угол и измерения:
| Недвижимость | Тип | Описание |
|---|---|---|
| Из_столбца | число или текст | Индекс столбца (на основе 0) или имя столбца Excel (например, "A", "G"). Значение по умолчанию: 7 (столбец H). |
| FromRow | число/номер | Индекс строки (на основе 0). Значение по умолчанию: 7 (строка 8). |
| Ширина | число/номер | Ширина диаграммы в количестве столбцов. По умолчанию: 8. |
| Высота | число/номер | Высота диаграммы в количестве строк. По умолчанию: 16. |
[Bounds = [
FromColumn = "B", // or 1 for column B
FromRow = 1, // Row 2 (0-based)
Width = 8, // 8 columns wide
Height = 16 // 16 rows tall
]]
Формат записи с явными углами
Кроме того, укажите оба угла области диаграммы:
| Недвижимость | Тип | Описание |
|---|---|---|
| ИзКолонки | число или текст | Начальный столбец (0-й индекс или имя Excel). Значение по умолчанию: 7 (столбец H). |
| FromRow | число/номер | Начальная строка (с отсчетом от 0). Значение по умолчанию: 7 (строка 8). |
| ТуКолум | число или текст | Конечный столбец (индекс, начинающийся с 0, или буквенное обозначение в Excel). |
| ToRow | число/номер | Конечная строка (на основе 0). |
[Bounds = [
FromColumn = "A",
FromRow = 0,
ToColumn = "H",
ToRow = 16
]]
Вспомогательные функции макета сетки
При размещении нескольких диаграмм на листе можно использовать вспомогательную функцию для вычисления позиций сетки:
let
// Helper function to calculate chart bounds in a grid layout
GetGridBounds = (
chartNumber as number, // 1-based chart number
gridColumns as number, // Number of columns in the grid
optional width as number, // Chart width (default: 8)
optional height as number, // Chart height (default: 16)
optional hPadding as number, // Horizontal padding (default: 1)
optional vPadding as number // Vertical padding (default: 1)
) as record =>
let
w = width ?? 8,
h = height ?? 16,
hp = hPadding ?? 1,
vp = vPadding ?? 1,
cols = if gridColumns < 1 then 1 else gridColumns,
x = Number.Mod(chartNumber - 1, cols) * (w + hp),
y = Number.IntegerDivide(chartNumber - 1, cols) * (h + vp)
in
[FromColumn = x, FromRow = y, ToColumn = x + w, ToRow = y + h],
buildReference = (name as text) => #table({}, {}) meta [Name = name],
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
{"Data", "SalesTable", "SheetData", [], SalesData},
// 2x2 grid of charts
{"Dashboard", "Chart1", "Chart",
[ChartType = "Column", Bounds = GetGridBounds(1, 2),
DataSeries = [AxisColumns = {"Region"}, ValueColumns = {"Revenue"}]],
buildReference("SalesTable")},
{"Dashboard", "Chart2", "Chart",
[ChartType = "Line", Bounds = GetGridBounds(2, 2),
DataSeries = [AxisColumns = {"Region"}, ValueColumns = {"Revenue"}]],
buildReference("SalesTable")},
{"Dashboard", "Chart3", "Chart",
[ChartType = "Pie", Bounds = GetGridBounds(3, 2),
DataSeries = [AxisColumns = {"Region"}, ValueColumns = {"Revenue"}]],
buildReference("SalesTable")},
{"Dashboard", "Chart4", "Chart",
[ChartType = "Bar", Bounds = GetGridBounds(4, 2),
DataSeries = [AxisColumns = {"Region"}, ValueColumns = {"Revenue"}]],
buildReference("SalesTable")}
}
)
in
excelDocument
Усовершенствованное позиционирование с смещениями EMU
Для точного расположения в ячейках используйте свойства смещения. Смещения находятся в ЭМУ (английских метрических единицах), где 914400 EMUs равно 1 дюйму.
| Недвижимость | Тип | Описание |
|---|---|---|
| ИзСмещенияСтолбца | число/номер | Смещение от левого края начальной ячейки (в EMUS). |
| FromRowOffset | число/номер | Смещение от верхнего края начальной ячейки (в EMUS). |
| ToColumnOffset | число/номер | Смещение от левого края конечной ячейки (в EMUS). |
| ToRowOffset | число/номер | Смещение от верхнего края конечной ячейки (в ЭМУ). |
[Bounds = [
FromColumn = "C",
FromColumnOffset = 352425,
FromRow = 6,
FromRowOffset = 142874,
ToColumn = "R",
ToColumnOffset = 142875,
ToRow = 22,
ToRowOffset = 171449
]]
Поддерживаемые типы диаграмм
| Тип диаграммы | Описание |
|---|---|
Area |
Диаграмма с областями |
Area3D |
Трехмерная диаграмма области |
Bar |
Горизонтальная линейчатая диаграмма |
Bar3D |
Трехмерная горизонтальная линейчатая диаграмма |
Column |
Вертикальная диаграмма столбцов |
Column3D |
Трехмерная вертикальная столбчатая диаграмма |
Doughnut |
Кольцевая диаграмма (кольцевая фигура) |
Line |
График |
Line3D |
Трехмерная линейчатая диаграмма |
Pie |
Круговая диаграмма |
Pie3D |
Трехмерная круговая диаграмма |
Radar |
Радиолокационная диаграмма |
StackedBar |
Горизонтальная накопленная столбчатая диаграмма |
StackedBar100 |
100% горизонтальной линейчатой диаграммы |
StackedColumn |
Диаграмма с вертикальными накопленными столбцами |
StackedColumn100 |
столбчатая диаграмма с накоплением, ориентированная вертикально на 100% |
Настройка DataSeries
Запись DataSeries определяет, как данные отображаются на элементах диаграммы.
| Недвижимость | Тип | Обязательный | Описание |
|---|---|---|---|
| AxisColumns | список или текст | Да* | Одно или несколько имен столбцов для использования в качестве оси диаграммы (категорий). |
| ValueColumns | список или текст | Да* | Одно или несколько имен столбцов для использования в качестве значений диаграммы (ряд). |
| PrimaryAxisColumn | текст | Нет | При использовании нескольких столбцов осей указывает, какой из них служит в качестве метки основной оси. |
* Параметр обязателен, если ChartInferenceFunction не настроен в свойствах рабочей книги. Без вывода, опущение AxisColumns вызывает ошибку "Нет предоставленных столбцов осей", а опущение ValueColumns вызывает ошибку "Нет предоставленных столбцов значений".
Пример с явной конфигурацией диаграммы
let
// Quarterly data by region
quarterlyData = #table(
type table [Quarter = text, North = number, South = number, East = number, West = number],
{
{"Q1", 95000, 78000, 37000, 50000},
{"Q2", 102000, 85000, 42000, 58000}
}
),
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
{"SalesChart", "QuarterlySales", "Chart",
[
ChartType = "StackedColumn",
ChartTitle = "Quarterly Revenue by Region",
DataSeries = [
AxisColumns = {"Quarter"},
ValueColumns = {"North", "South", "East", "West"}
]
],
quarterlyData
}
}
)
in
excelDocument
Многоуровневые диаграммы осей
Для данных иерархической категории можно указать несколько столбцов осей:
let
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
{"ProductChart", "Sales", "Chart",
[
ChartType = "Column",
ChartTitle = "Product Sales by Category",
DataSeries = [
AxisColumns = {"Category", "Product"},
ValueColumns = {"Revenue"},
PrimaryAxisColumn = "Product" // Use Product as the label
]
],
SalesData
}
}
)
in
excelDocument
Использование функции Office.InferChartPropertiesGenerator
Функция Office.InferChartPropertiesGenerator создает подсистему вывода, которая автоматически определяет свойства диаграммы на основе данных. Эта возможность полезна, если требуется разумное значение по умолчанию, не указывая все сведения о конфигурации диаграммы.
Это важно
Без функции вывода диаграммы необходимо явно предоставить DataSeries, а также AxisColumns и ValueColumns для каждой диаграммы. Пропуск этих обязательных параметров приводит к ошибке.
Основное использование
let
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
{"Workbook", "Workbook", "Workbook",
[ChartInferenceFunction = Office.InferChartPropertiesGenerator()],
null
},
// Charts without explicit ChartType will use inference
{"Chart1", "AutoChart", "Chart", [], SalesData}
}
)
in
excelDocument
Параметры вывода заключений
Office.InferChartPropertiesGenerator принимает необязательную запись со следующими параметрами:
| Опция | Тип | По умолчанию | Описание |
|---|---|---|---|
| Allow3DCharts | logical | false | Когда true интерпретирующая система может выбрать трехмерные типы диаграмм для соответствующих данных. |
| PreferMultilevelChartInference | logical | false | При использовании true все ведущие нечисловые столбцы применяются в качестве осевых столбцов для многоуровневых диаграмм. |
Пример с параметрами вывода
let
chartInference = Office.InferChartPropertiesGenerator([
Allow3DCharts = true,
PreferMultilevelChartInference = true
]),
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
{"Workbook", "Workbook", "Workbook",
[ChartInferenceFunction = chartInference],
null
},
{"Sales", "SalesChart", "Chart",
[DataSeries = [AxisColumns = {"Region"}, ValueColumns = {"Revenue"}]],
SalesData
}
}
)
in
excelDocument
Принцип работы вывода
Подсистема вывода возвращает запись с тремя функциями:
ChartType: анализирует схему данных и определяет оптимальный тип диаграммы на основе:
- Число рядов данных
- Количество категорий
- Независимо от того, являются ли столбцы осей datetime, числовыми или категориальными
- Число строк
ChartTitle: создает описательное название на основе типов диаграмм и имен столбцов.
DataSeries: выводит ось и столбцы значений на основе схемы таблицы.
- Столбцы Datetime предпочтительнее в качестве столбцов оси
- Категориальные (текстовые) столбцы рассматриваются для осевых столбцов.
- Числовые столбцы становятся столбцами значений
Логика выбора типа диаграммы
Подсистема вывода выбирает типы диаграмм на основе характеристик данных:
| Характеристики данных | Тип выводимой диаграммы |
|---|---|
| Одна серия, ≤6 категорий, категориальная ось | Пирог |
| Одна серия, 7-15 категорий, категориальная ось | Пончик |
| Ось DateTime | Линия или область |
| серия ≥3, категории ≤15, категориальные | Радар |
| Несколько серий, 3-25 категорий | Сложенная столбчатая диаграмма |
| Одна серия, несколько категорий | колонна |
| Многие категории | Бар |
Настраиваемая функция вывода
Вы можете предоставить собственную функцию вывода, следующую за тем же интерфейсом:
let
customInference = () as record => [
ChartType = (partName, columns, dataSeries, rowCount) =>
if rowCount < 10 then "Pie" else "Column",
ChartTitle = (partName, chartType, dataSeries) =>
partName & " Chart",
DataSeries = (partName, columns) => [
AxisColumns = {"Category"},
ValueColumns = {"Revenue"}
]
],
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
{"Workbook", "Workbook", "Workbook",
[ChartInferenceFunction = customInference],
null
},
{"Data", "CustomChart", "Chart", [], SalesData}
}
)
in
excelDocument
Расширенные сценарии
В этом разделе рассматриваются программные подходы к созданию таблиц навигации динамически.
Секционирование данных на несколько листов
Список и функции таблиц Power Query можно использовать для динамического создания листов на основе значений данных.
Использование Table.Group
Группировать данные по столбцу и создавать лист для каждой группы:
let
groupedData = Table.Group(
SalesData,
{"Region"},
{{"RegionData", each _, type table}}
),
excelDocument = Table.FromRecords(
List.Transform(
Table.ToRecords(groupedData),
(row) => [
Sheet = row[Region],
PartType = "SheetData",
Data = row[RegionData]
]
)
)
in
excelDocument
Использование Table.Partition
Секционирование таблицы на группы на основе пользовательской хэш-функции. В этом примере данные продаж секционируется в сегменты доходов:
let
Low_Revenue_Group_Index = 0,
Medium_Revenue_Group_Index = 1,
High_Revenue_Group_Index = 2,
NumberOfPartitions = 3,
RevenueRangeHash = (revenue as number) as number =>
if revenue >= 40000 then High_Revenue_Group_Index
else if revenue >= 25000 then Medium_Revenue_Group_Index
else Low_Revenue_Group_Index,
PartitionedList = Table.Partition(
SalesData,
"Revenue",
NumberOfPartitions,
RevenueRangeHash
),
BucketNames = {
"Low Revenue (< $25K)",
"Medium Revenue ($25K - $40K)",
"High Revenue (> $40K)"
},
NamedPartitions = Table.FromColumns(
{BucketNames, PartitionedList},
type table [Sheet = text, Data = table]
),
excelDocument = Table.AddColumn(NamedPartitions, "PartType", each "SheetData", type text)
in
excelDocument
Пользовательская функция секционирования
Для получения дополнительных элементов управления используйте пользовательскую функцию секционирования:
let
partitionByColumn = (table as table, columnName as text, maxPartitions as number) as table =>
let
distinctValues = List.Distinct(Table.Column(table, columnName)),
limitedValues = List.FirstN(distinctValues, maxPartitions),
partitionedTable = Table.FromRecords(
List.Transform(
limitedValues,
(value) => [
Sheet = columnName & " - " & Text.From(value),
PartType = "SheetData",
Data = Table.SelectRows(table, each Record.Field(_, columnName) = value)
]
)
)
in
partitionedTable,
// Create sheets for each unique Region value (up to 10)
excelDocument = partitionByColumn(SalesData, "Region", 10)
in
excelDocument
Динамические диаграммы для секционированных данных
Объединение секционирования с диаграммами для создания визуализаций для каждой группы:
let
buildReference = (name as text) => #table({}, {}) meta [Name = name],
createPartitionWithChart = (table as table, columnName as text) as table =>
let
distinctValues = List.Distinct(Table.Column(table, columnName)),
partitionRows = List.Transform(
distinctValues,
(value) =>
let
partitionData = Table.SelectRows(table, each Record.Field(_, columnName) = value),
sheetName = Text.From(value),
dataName = "Data_" & sheetName,
chartName = "Chart_" & sheetName
in
{
{sheetName, dataName, "SheetData", [], partitionData},
{sheetName & " Chart", chartName, "Chart",
[ChartType = "Column", ChartTitle = sheetName & " Analysis"],
buildReference(dataName)}
}
),
workbookRow = {{"Workbook", "Workbook", "Workbook", [ChartInferenceFunction = Office.InferChartPropertiesGenerator()], null}}
in
#table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
List.Combine({workbookRow} & partitionRows)
),
excelDocument = createPartitionWithChart(SalesData, "Region")
in
excelDocument
Распространенные шаблоны
В этом разделе приведены готовые шаблоны для частых сценариев. Скопируйте и адаптируйте эти шаблоны к вашим потребностям.
Шаблон: простой экспорт данных
Экспорт одной таблицы в Excel с минимальной конфигурацией:
let
excelDocument = #table(
type table [PartType = nullable text, Data = any],
{{"SheetData", YourDataTable}}
)
in
excelDocument
Шаблон: несколько листов из списка
Создайте один лист на элемент в списке:
let
// Assume you have a list of {Name, Table} pairs
dataSets = {
{"Sales", SalesTable},
{"Inventory", InventoryTable},
{"Customers", CustomersTable}
},
excelDocument = #table(
type table [Sheet = text, PartType = text, Data = table],
List.Transform(dataSets, each {_{0}, "SheetData", _{1}})
)
in
excelDocument
Шаблон: данные с диаграммой на одном листе
Создайте лист с данными и ее визуализацией:
let
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
{"Workbook", "Workbook", "Workbook", [ChartInferenceFunction = Office.InferChartPropertiesGenerator()], null},
{"Report", "SalesChart", "Chart",
[ChartType = "Column", Bounds = "F2:M18"],
YourDataTable
}
}
)
in
excelDocument
Шаблон: панель мониторинга с несколькими диаграммами с общими данными
Создайте лист панели мониторинга с несколькими диаграммами, ссылающимися на один источник данных:
let
ref = (name as text) => #table({}, {}) meta [Name = name],
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
{"Data", "SourceData", "SheetData", [], YourDataTable},
{"Dashboard", "Chart1", "Chart",
[ChartType = "Column", Bounds = "A1:H16",
DataSeries = [AxisColumns = {"Category"}, ValueColumns = {"Value1"}]],
ref("SourceData")},
{"Dashboard", "Chart2", "Chart",
[ChartType = "Line", Bounds = "J1:Q16",
DataSeries = [AxisColumns = {"Category"}, ValueColumns = {"Value2"}]],
ref("SourceData")}
}
)
in
excelDocument
Шаблон: параллельные таблицы
Поместите две таблицы рядом друг с другом на одном листе:
let
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
{"Report", "MainData", "Table",
[StartCell = "A1", TableStyle = "TableStyleMedium2"],
MainTable},
{"Report", "Summary", "Table",
[StartCell = "H1", TableStyle = "TableStyleLight15"],
SummaryTable}
}
)
in
excelDocument
Шаблон: сложенные таблицы с автоматическим размещением
Составление множества таблиц по вертикали с автоматическими расстояниями:
let
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
{"Report", "Section1", "Table", [], Table1},
{"Report", "Section2", "Table", [AutoPositionRowOffset = 2], Table2},
{"Report", "Section3", "Table", [AutoPositionRowOffset = 2], Table3}
}
)
in
excelDocument
Шаблон: отчет без линий сетки
Создайте отполированный отчет со скрытыми линиями сетки:
let
excelDocument = #table(
type table [Sheet = nullable text, Name = nullable text, PartType = nullable text, Properties = nullable record, Data = any],
{
{"Report", "Data", "Table",
[StartCell = "B2", ShowGridlines = false, TableStyle = "TableStyleMedium9"],
YourDataTable}
}
)
in
excelDocument
Заметки и ограничения
Ограничения Excel
В Excel имеются ограничения, влияющие на создание документов:
- Максимальное количество строк на листе: 1 048 576 строк
- Максимальные столбцы на лист: 16 384 столбцов
- Максимальные символы на ячейку: 32 767 символов
- Максимальная длина листа: 31 символов
-
Имена листов не могут содержать:
\ / ? * [ ]или начало и конец с'
Если данные превышают эти ограничения, рассмотрите возможность секционирования на нескольких листах.
Обработка ошибок
Ошибки на уровне ячеек в данных приводят к сбою создания документов. Соединитель проверяет данные по мере обработки каждой строки, и при возникновении ошибок, таких как деление на ноль или ошибка преобразования типов, вызывает исключение.
Чтобы предотвратить сбои, выполните приведенные действия.
- Использование
try...otherwiseвыражений для обработки потенциальных ошибок перед экспортом - Замените значения ошибок соответствующими значениями по умолчанию или null
- Проверка качества данных перед созданием таблицы навигации
let
RawData = #table(
type table [Product = text, Amount = text],
{
{"Laptop", "1250.50"},
{"Phone", "N/A"},
{"Tablet", "850.00"}
}
),
cleanData = Table.TransformColumns(
RawData,
{{"Amount", each try Number.From(_) otherwise null, type nullable number}}
),
excelDocument = #table(
type table [PartType = nullable text, Data = any],
{{"SheetData", cleanData}}
)
in
excelDocument
Обработка имен
Имена листов и частей автоматически очищаются для соответствия правилам именования Excel. Недопустимые символы удаляются, а имена усечены до 31 символов. Если StrictNameHandling включен в свойствах книги, то вместо автоматической очистки возникает ошибка.
Повторяющиеся имена листов автоматически создаются уникальными путем добавления числового суффикса.
Troubleshooting
В этом разделе рассматриваются распространенные ошибки, которые могут возникнуть при создании таблиц навигации и их устранении.
Справочник по ошибкам
| Код ошибки | Сообщение об ошибке | Как исправить |
|---|---|---|
| 10950 | Отсутствует {field} для части документа в строке {row}. | Убедитесь, что каждая строка в таблице навигации содержит все обязательные столбцы. Для частей SheetData укажите, чтобы столбец Data содержал значение из таблицы. Для частей диаграммы укажите встроенные данные или допустимую ссылку на таблицу. |
| 10951 | Повторяющееся имя части: {name} | Каждая строка в таблице навигации должна иметь уникальное Name значение. Переименуйте одну из повторяющихся частей, чтобы устранить эту ошибку. |
| 10953 | Недопустимое имя контейнера "{name}". Вместо этого рекомендуется использовать "{предложение}". | Имена листов содержат недопустимые символы (\ / ? * [ ]) или проблемы форматирования. Используйте предлагаемое альтернативное имя или включите автоматическую очистку, опустив StrictNameHandling или установив для него false. |
| 10954 | Повторяющийся контейнер "{name}". Каждая часть документа (строка) требует уникального значения в столбце контейнера. | Две части имеют одно и то же Sheet значение. При использовании SheetDataкаждый лист можно создать только один раз. Для нескольких регионов данных на одном листе используйте разделы Table или Range. |
| 10955 | Повторяющееся имя "{name}". Для каждой части документа (строки) требуется уникальное имя. | Две части, привязанные к данным, имеют одно и то же Name значение. Каждая часть, привязанная к данным, должна иметь уникальное имя, так как регистрирует источник данных, на который могут ссылаться другие части. Переименуйте одну из частей. |
| 10956 | Ссылка на таблицу "{name}" не найдена. | При использовании ссылок на таблицы (пустые таблицы с Name метаданными) убедитесь, что ссылка Name соответствует значению части Name данных. Проверьте опечатки и учёт регистра. |
| 10959 | AxisColumns должны быть единственным текстовым значением или списком текстов. | Свойство AxisColumns имеет недопустимый тип. Укажите текстовое значение, например "Category" или список, например {"Region", "Year"}. |
| 10962 | ValueColumns должен быть одним текстом, списком текстов или записью. | Свойство ValueColumns имеет недопустимый тип. Укажите текстовое значение, например "Revenue" или список, например {"Revenue", "Units"}. |
| 10963 | Отсутствуют столбцы значений для части "{name}". Укажите свойство ValueColumns. | Для диаграмм без ChartInferenceFunction необходимо явно указать ValueColumns в записи DataSeries. Добавьте ValueColumns = {"Column1", "Column2"} в диаграмму DataSeries. |
| 10966 | Столбцы осей не указаны для части "{name}". Предоставьте им свойство AxisColumns. | Для диаграмм без ChartInferenceFunction необходимо явно указать AxisColumns в записи DataSeries. Добавьте AxisColumns = {"CategoryColumn"} в диаграмму DataSeries. |
| 10968 | Не удалось определить подходящие столбцы оси или значения для части "{name}". Проверьте типы данных столбца. | Подсистема вывода не могла определить соответствующие столбцы. Убедитесь, что в таблице есть по крайней мере один категориальный или датовый столбец (для оси) и один числовый столбец (для значений) или явно укажите их. |
| 10970 | Столбец оси "{column}" отсутствует в схеме. | Имя столбца, указанное в AxisColumns таблице данных, не существует. Убедитесь, что имя столбца совпадает в точности (с учетом регистра). |
| 10971 | Столбец значения "{column}" отсутствует в схеме. | Имя столбца, указанное в ValueColumns таблице данных, не существует. Убедитесь, что имя столбца точно совпадает (с учетом регистра). |
| 10972 | Столбец "{column}" должен быть числовым, но имеет значение "{type}". | Столбцы значений диаграммы должны содержать числовые данные. Преобразуйте столбец в числовый тип с помощью Table.TransformColumnTypesили выберите другой столбец. |
| 10981 | Неопределено значение "{value}" для перечисления "{enum}". | Недопустимое значение было предоставлено для свойства, например ChartType или PartType. Проверьте документацию на наличие корректных значений. |
| 10985 | Ошибка ссылки на таблицу: найдена пустая таблица без метаданных Name, указывающих на строку данных. | При использовании пустых таблиц в качестве ссылок на данные они должны содержать Name метаданные. Используется #table({}, {}) meta [Name = "DataPartName"] для создания допустимой ссылки. |
| 10986 | Части типа "{type}" в файлах "{format}" должны иметь таблицу как данные. TableReference не допускается. |
SheetData, Tableи Range части должны содержать встроенные данные таблицы и не могут использовать ссылки на таблицы. Только части диаграммы могут ссылаться на данные из других частей. |
| 10987 | Элементы типа "{type}" должны иметь ссылку на таблицу или использовать таблицу в виде данных. | Для части требуется таблица или допустимая ссылка на таблицу в столбце Data . Убедитесь, что вы предоставляете табличное значение, а не null или другой тип. |
| 10988 | {field} не может быть пустым или пробелом. | Имя или другое обязательное Sheet поле пусто или содержит только пробелы. Укажите допустимое непустое значение. |
| 10989 | Тип части "{type}" не поддерживается. | Используйте допустимый тип части: Workbook, SheetData, Table, Range или Chart. Проверьте опечатки в столбце PartType. |
| 10990 | Часть {type} с параметрами документа должна быть первой частью (строкой) в таблице. | Часть Workbook (содержащая такие параметры ChartInferenceFunction) должна быть первой строкой в таблице навигации. Переупорядочьте строки соответствующим образом. |
| 30005 | Функция вывода диаграммы недоступна для части "{name}". Задайте свойство {property} вручную. | Добавьте часть Workbook в качестве первой строки с [ChartInferenceFunction = Office.InferChartPropertiesGenerator()] в ее Properties или вручную укажите необходимое свойство на диаграмме. |
| 30006 | Функция анализа диаграммы не вернула допустимый ChartType для части "{name}". | Подсистема вывода не могла определить подходящий тип диаграммы для данных. Явно укажите ChartType в записи диаграммы Properties . |
| 30018 | Предоставленное значение не представляется в Excel. | Данные содержат значения, которые нельзя хранить в Excel, такие как даты до 1900 или длительности за пределами диапазона Excel. Фильтрация или преобразование данных для удаления неподдерживаемых значений. |
| 30019 | Превышено максимальное количество столбцов Excel: {limit}. | В таблице больше столбцов, чем в Excel (16 384). Уменьшите количество столбцов или разделите данные по нескольким таблицам. |
| 30020 | Превышен предел строк Excel в {limit} строк. | Ваши данные превышают ограничение строки Excel (1 048 576). Секционирование данных по нескольким листам с помощью Table.Partition или Table.Group. |
| 30059 | Обнаружено перекрытие между частями "{part1}" и "{part2}". | Две части на одном листе имеют пересекающиеся диапазоны ячеек. Настройте StartCell положение или используйте автопозиционирование. |
| 30060 | Ссылка на ячейку "{ref}" превышает ограничения Excel для части "{name}". | Ссылка StartCell указывает положение за пределами допустимого диапазона Excel. Используйте допустимую ссылку на ячейку в столбцах от A до XFD и строках от 1 до 1048576. |
| 30062 | Контейнер "{name}" уже имеет часть SheetData. Невозможно добавить элементы диапазона и таблицы. | Лист с частью SheetData не может содержать Table или Range части. Используйте либо SheetData отдельно, либо Table/Range вместе. |
| 30063 | Контейнер "{name}" уже содержит компоненты диапазона или таблицы. Не удается добавить SheetData. | Лист с частями Table или Range не может иметь часть SheetData.
SheetData Удалите часть или переместите ее на другой лист. |
| 30066 | Диапазон "{name}" нельзя использовать в качестве источника данных для диаграммы, так как у него включена функция SkipHeader. | Диаграммы требуют строк заголовков для идентификации ряда данных. Удалите SkipHeader = true из диапазона или предоставьте встроенные данные для диаграммы. |
| 30067 | Значение {property} "{value}" для части "{name}" недопустимо. Ожидается указание на одну ячейку. | Значение StartCell не является допустимой ссылкой на ячейку Excel. Используйте формат, например "B3" или "AA100". |
| 30068 | Часть "{name}" указывает AutoPositionColumnOffset или AutoPositionRowOffset, но имеет явное значение StartCell. | Вы не можете комбинировать смещения автоматического размещения с явным StartCell. Либо удалите StartCell для автоматического размещения, либо удалите свойства смещения. |
| 30069 | Часть "{name}" с AutoPositionColumnOffset превысит максимальное количество столбцов Excel. | Смещение столбца в сочетании с шириной таблицы превышает предел 16 384 столбцов. Уменьшите смещение или число столбцов. |
| 30070 | Элемент TableStyle "{style}" для части "{name}" является недопустимым. | Используйте допустимый стиль таблицы Excel: TableStyleLight1-21,TableStyleMedium1-28 или .TableStyleDark1-11 |
Распространенные проблемы
Проблемы со структурой таблицы навигации
Проблема: создание документов завершается с ошибкой "Отсутствующее значение" или ошибками схемы.
Причина. Таблица навигации отсутствует обязательные столбцы или имеет неправильные типы столбцов.
Решение. Убедитесь, что таблица навигации содержит правильные столбцы с правильными типами:
type table [
Sheet = nullable text, // Optional: worksheet name
Name = nullable text, // Unique identifier for the part
PartType = nullable text, // "Workbook", "SheetData", "Table", "Range", or "Chart"
Properties = nullable record, // Configuration options
Data = any // Table, table reference, or null
]
Вывод диаграммы не работает
Проблема: диаграммы не удается создать, появляется ошибка "Без столбцов осей или значений".
Причина: Нет настроек ChartInferenceFunction и отсутствуют явные сопоставления столбцов.
Решение: Либо добавьте часть рабочей книги с функцией вывода данных в качестве первой строки:
{"Workbook", "Workbook", "Workbook", [ChartInferenceFunction = Office.InferChartPropertiesGenerator()], null}
Или явно укажите DataSeries для каждой диаграммы:
[DataSeries = [AxisColumns = {"Category"}, ValueColumns = {"Revenue", "Profit"}]]
Ссылки на таблицы не разрешаются.
Проблема: ошибка "Ссылка на таблицу не найдена" при использовании ссылок на таблицы.
Причина. Метаданные Name ссылки не соответствуют какой-либо части данных.
Решение. Убедитесь, что имя метаданных совпадает точно:
let
// Data part with name "SalesData"
dataRow = {"Sales", "SalesData", "SheetData", [], actualTable},
// Chart referencing the data - name must match
chartRow = {"Chart", "SalesChart", "Chart", [], #table({}, {}) meta [Name = "SalesData"]}
in
...
Ошибки типа данных в ячейках
Проблема. Создание документов завершается сбоем при обработке определенных строк.
Причина. Данные содержат значения ошибок (например, деление по нулю или сбоям преобразования типов).
Решение. Очистка значений ошибок перед экспортом:
Table.TransformColumns(
YourTable,
{{"ColumnName", each try _ otherwise null}}
)
Неподдерживаемые значения даты или времени
Проблема. Ошибка "Предоставленное значение не представляется в Excel" при экспорте данных даты и времени.
Причина: Excel не может представлять даты до 1 января 1900 г. или продолжительности за пределами поддерживаемого диапазона.
Решение: отфильтруйте неподдерживаемые значения или преобразуйте их:
Table.SelectRows(YourTable, each [DateColumn] >= #date(1900, 1, 1))
Ошибка смешивания sheetData и Table/Range
Проблема. Ошибка "Контейнер уже имеет часть SheetData" или "Контейнер уже содержит части диапазона или таблицы".
Причина. Вы не можете сочетать SheetData с Table или Range частями на одном листе.
Решение: либо используйте один SheetData для листа, либо используйте Table/Range части вместе.
// Option 1: Use SheetData alone
{"Sheet1", "Data", "SheetData", [], myTable}
// Option 2: Use Table/Range parts for multiple regions
{"Sheet1", "Table1", "Table", [StartCell = "A1"], firstTable},
{"Sheet1", "Table2", "Table", [StartCell = "F1"], secondTable}
Конфликты автоматического размещения
Проблема. Ошибка "Компонент указывает AutoPositionColumnOffset или AutoPositionRowOffset, но имеет явный StartCell".
Причина: Вы не можете использовать смещения автоматического размещения, когда StartCell задано явно.
Решение: либо удалите StartCell для использования автоматического размещения, либо удалите свойства смещения:
// Auto positioning with custom offsets (no StartCell)
{"Sheet1", "Table1", "Table", [AutoPositionColumnOffset = 2, AutoPositionRowOffset = 1], myTable}
// Or explicit positioning (no offset properties)
{"Sheet1", "Table1", "Table", [StartCell = "C2"], myTable}
Недопустимые имена листов
Проблема. Ошибка при указании недопустимого имени контейнера или автоматической очистки имен.
Причина. Имена листов содержат недопустимые символы (\ / ? * [ ]) или превышают 31 символов.
Решение: Предварительно очистите имена листов:
sanitizeName = (name as text) as text =>
let
cleaned = Text.Replace(Text.Replace(name, "/", "-"), "\", "-"),
truncated = Text.Start(cleaned, 31)
in
truncated