Del via


Excel Avanceret Data Destination (Forhåndsvisning)

Bemærkning

Excel-format til filbaserede destinationer er i øjeblikket i forhåndsvisning.

Når du arbejder på en filbaseret destination i Dataflow Gen2, har du mulighed for at gemme dine data i forskellige formater, herunder Excel. Excel-filer kan oprettes med simple tabeldata, men du kan også lave komplekse arbejdsbøger med flere ark, diagrammer og tilpasset formatering ved at bruge navigationstabeller. Disse navigationstabeller definerer strukturen og indholdet af Excel-dokumentet programmatisk og giver en kraftfuld måde at generere dynamiske Excel-filer på.

Denne artikel forklarer, hvordan man konstruerer disse navigationstabeller for at generere Excel-dokumenter programmatisk ud fra dit Dataflow.

Forudsætninger

Før du kan bruge Excel Advanced-destinationen, skal du sætte din Dataflow Gen2 op med den korrekte konfiguration:

  1. Opret en navigationstabelforespørgsel - I din Dataflow Gen2 skal du oprette en forespørgsel, der udgiver en navigationstabel som beskrevet i denne artikel. Forespørgslen skal returnere en tabel med de nødvendige kolonner (PartType, Data, og valgfrit Sheet, Name, og Properties).

  2. Tilføj en datadestination - Vælg din forespørgsel i navigationstabelen og tilføj en datadestination ved at vælge Tilføj datadestination i forespørgslens kontekstmenu eller båndet.

  3. Vælg en filbaseret destination - Vælg en filbaseret destination såsom:

    • SharePoint
    • Lakehouse-arkiverne
    • Azure Data Lake Storage Gen2
    • Azure Blob Storage
  4. Indstil filformatet til Excel - I destinationskonfigurationen skal du sætte filformatet til Excel.

  5. Vælg Avanceret format - Vælg Avanceret i Format-dropdownmenuen. Denne mulighed fortæller connectoren, at den skal tolke dit forespørgselsoutput som en navigationstabel, der definerer Excel-dokumentets struktur.

    Skærmbillede, der viser datadestinationsdialogen med Excel-filformat og Avanceret format valgt.

Når dataflowet er konfigureret, læser systemet din navigationstabel og genererer den tilsvarende Excel-fil med den struktur, du har defineret.

Oversigt

Excel-dokumenter i Power Query repræsenteres som navigationstabeller – standard M-tabeller med specifikke kolonner, der beskriver dokumentstrukturen. Hver række i navigationstabellen repræsenterer en del af Excel-dokumentet, såsom et regneark med data eller et diagram, der visualiserer disse data.

Når du konfigurerer en Excel-outputdestination i et dataflow, læser systemet denne navigationstabel og genererer den tilsvarende Excel-fil. Denne tilgang giver fleksibilitet til at definere komplekse arbejdsbøger med flere ark, diagrammer og datarelationer.

Hurtig reference

Dette afsnit giver et samlet overblik over deltyper og deres nøgleegenskaber til hurtig opslag. For færdige kodeskabeloner, se Almindelige mønstre. For fejlløsning, se Fejlfinding.

Deltyper i et hurtigt overblik

Deltype Formål Data påkrævet Placering Multiple per ark
Workbook Dokumentniveau-indstillinger Nej (null) Ikke tilgængelig Nej (kun første række)
SheetData Simpel dataeksport Ja (inline-tabel) Altid A1 Nej
Table Excel-tabel med formatering Ja (inline-tabel) StartCell eller auto Ja (hvis der ikke er nogen overlapning)
Range Rådata uden tabelstyling Ja (inline-tabel) StartCell eller auto Ja (hvis der ikke er nogen overlapning)
Chart Diagram-visualisering Ja (inline eller reference) Bounds egenskab Ja

Nøgleegenskaber efter komponenttype

Property Workbook SheetData Tabel Område Diagram
StartCell - - -
TableStyle - - - ✓*
SkipHeader - - - -
ShowGridlines -
ChartType - - - -
ChartTitle - - - -
DataSeries - - - -
Bounds - - - -
ChartInferenceFunction - - - -
StrictNameHandling - - - -
UseSharedStrings - - - -
AutoPositionColumnOffset - - ✓*
AutoPositionRowOffset - - ✓*

* For diagrammer med inline-data styrer disse egenskaber backing datatabellen.

Minimalt eksempel

Den nemmeste måde at oprette et Excel-dokument på er at levere en navigationstabel med kun de data, du ønsker at eksportere. Alle kolonner undtagen Data og PartType er valgfrie – connectoren kan udlede manglende egenskaber og opbygge et funktionelt dokument.

Følgende eksempel definerer en SalesData tabel, der bruges gennem hele denne artikel:

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

Når du ikke angiver arknavne eller delnavne, genererer systemet automatisk passende standardindstillinger.

Henvisning til andre forespørgsler

I en Dataflow kan du referere til andre eksisterende forespørgsler i din navigationstabel. Kolonnen Data accepterer enhver tabelværdi, inklusive referencer til forespørgsler, der er defineret andre steder i din Dataflow:

let
    // Reference existing queries named "MonthlySales" and "CurrentInventory"
    excelDocument = #table(
        type table [PartType = nullable text, Data = any],
        {
            {"SheetData", MonthlySales},
            {"SheetData", CurrentInventory}
        }
    )
in
    excelDocument

Navigationstabellen følger et specifikt skema med følgende kolonner:

Kolonne Type Påkrævet Beskrivelse
Lagen Nullérbar tekst Nej Navnet på forældrearket for delen. Hvis det ikke er specificeret, genereres et standardnavn.
Navn Nullérbar tekst Nej En unik identifikator for delen. Påkrævet kun, når andre dele skal referere til denne dels data.
PartType Nullérbar tekst Nej Den type del, der skabes: Workbook, , SheetData, Table, Range, eller Chart.
Egenskaber Annullerbar registrering Nej Konfigurationsmuligheder specifikke for reservedelstypen.
Data vilkårlig Ja Det faktiske dataindhold. Det kan være en tabel eller en reference til en anden del.

Understøttede deletyper

  • Arbejdsbog: Dokumentkonfiguration. Det må være første række, hvis det bruges. Indeholder ikke data.
  • SheetData: Et arbejdsark med tabeldata. Denne del er databundet. SheetData-dele skal indeholde inline-data og må ikke bruge tabelreferencer. Opretter et enkelt dataområde, der starter ved celle A1.
  • Tabel: En Excel-tabel (formateret med tabelstyling). Denne del er databundet. Understøtter eksplicit positionering via StartCell og automatisk positionering. Flere Table-dele kan eksistere på samme ark, hvis de ikke overlapper.
  • Område: Et dataområde uden formatering i Excel-tabelen. Denne del er databundet. Understøtter eksplicit positionering via StartCell og automatisk positionering. Flere Range-dele kan eksistere på samme ark, hvis de ikke overlapper.
  • Diagram: En diagramvisualisering. Kan placeres på sit eget ark eller kombineres med data. Denne del er databundet , når den indeholder inline-data, eller den kan referere til data fra en anden del.

Bemærkning

Databundne dele er dele, der indeholder eller refererer til tabulære data. SheetData, Table, , Rangeog Chart (med inline data) er databundne dele. Hver databundet del registrerer sin datakilde ved hjælp af delens Name, så alle databundne dele skal have unikke navne.

Vigtigt!

Du kan ikke blande SheetData med Table eller Range dele på samme ark. Brug enten SheetData alene eller Table/Range dele sammen. Når du har brug for flere dataområder på ét ark, brug Table eller Range dele med positionering.

Valg af den rigtige reservedelstype

Brug denne beslutningsguide til at vælge den passende deltype til din situation:

Brug SheetData når:

  • Du har brug for et simpelt, enkelt dataområde pr. ark
  • Data bør starte ved celle A1
  • Du behøver ikke funktioner i Excel-tabellen (filtre, strukturerede referencer)
  • Du eksporterer ligetil tabeldata

Brug Table når:

  • Du vil have formatering af Excel-tabelen med filterdropdowns
  • Du har brug for strukturerede referencer til formler
  • Du placerer flere dataregioner på ét ark
  • Du har brug for præcis kontrol over positionering med StartCell
  • Du vil gerne anvende tabelstile (TableStyleMedium1osv.)

Brug Range når:

  • Du har brug for rådata uden formatering af Excel-tabeller
  • Du vil udelade headers (SkipHeader = true)
  • Du placerer flere dataregioner på ét ark
  • Dataene vil blive forbrugt af andre systemer, der forventer almindelige intervaller

Brug Chart når:

  • Du har brug for datavisualisering
  • Med inline-data: diagram og data vises samlet på det samme ark
  • Med referencer: diagram og data kan være på separate ark, og flere diagrammer kan dele én datakilde

Eksempel med fuld struktur

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

Diagrammer og dataplacering

Når du opretter en diagramdel, kan du kontrollere, hvor diagrammet og dets data vises i arbejdsbogen.

Diagram med separat datablad

Når et diagram refererer til data fra en anden del ved hjælp af meta [Name = "..."] syntaksen, placeres dataene og diagrammet på separate ark.

Vigtigt!

Når man bruger referencer, er kolonnen Name obligatorisk. Referencen løses ved at matche værdien i meta [Name = "..."] med kolonnen Name i en anden række i navigationstabellen.

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

Diagram med indbyggede data

Når en diagramdel inkluderer data direkte (uden at referere til en anden del), oprettes både dataene og diagrammet på samme ark:

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

Denne tilgang er praktisk, når du ønsker, at brugerne skal se dataene sammen med visualiseringen.

Flere diagrammer med inline data på samme ark

Når flere diagramdele har inline-data (ikke referencer), opretter hvert diagram sin egen backing-datatabel på samme ark. Systemet positionerer automatisk disse backing tables for at undgå overlap ved hjælp af automatisk positionering. Du kan styre baggrundsbordets udseende ved at angive TableStyle, AutoPositionColumnOffset, og AutoPositionRowOffset på diagram-delen.

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

Tabel og Range-dele

Table og Range dele giver mere kontrol over dataplacering end SheetData. Brug dem, når du har brug for flere dataområder på samme ark eller har brug for specifik positionering.

Tabeldel

Delen Table opretter en Excel-tabel med formatering, filterdropdowns og strukturerede referencer. Brug den, når du vil have funktioner i Excel Table.

Property Type Standard Beskrivelse
StartCell sende sms "auto" Den øverste venstre celle for tabellen (f.eks. "B3"). Brug "auto" den til automatisk positionering.
TableStyle sende sms "TableStyleMedium2" Excel-tabelstilen. Gyldige værdier: TableStyleLight1-21, TableStyleMedium1-28, . TableStyleDark1-11
AutoPositionColumnOffset nummer 1 Kolonnen er forskudt fra A ved automatisk positionering (1 = kolonne B).
AutoPositionRowOffset nummer 1 Række-forskel fra tidligere indhold, når man auto-positionerer.
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

Rækkevidde-delen

Delen Range opretter et dataområde uden formatering af Excel-tabellen. Brug det, når du har brug for rådata uden tabelfunktioner.

Property Type Standard Beskrivelse
StartCell sende sms "auto" Den øverste venstre celle for intervallet (f.eks. "C5"). Brug "auto" den til automatisk positionering.
SkipHeader logisk false Når true, udelader overskriftsrækken.
AutoPositionColumnOffset nummer 1 Kolonnen er forskudt fra A, når du automatisk positionerer.
AutoPositionRowOffset nummer 1 Række-forskel fra tidligere indhold, når man auto-positionerer.

Bemærkning

Når SkipHeader er true, kan området ikke bruges som datakildereference for diagrammer. Diagrammer kræver headerrækker for at identificere navne på dataserier.

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

Flere tabeller på samme ark

Du kan placere flere Table eller Range dele på det samme ark, så længe de ikke overlapper.

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

Automatisk positionering

Når du ikke specificerer StartCell (eller sætter det til "auto"), placerer systemet automatisk delene lodret, én under hinanden, i den rækkefølge de vises i navigationstabellen. Dette er nyttigt, når du har flere dataregioner og ikke behøver præcis kontrol.

Property Standard Beskrivelse
AutoPositionColumnOffset 1 Startkolonnen er forskudt fra A. Værdien af 0 starter i kolonne A, 1 ved kolonne B.
AutoPositionRowOffset 1 Antallet af tomme rækker mellem dele. Værdien af 0 at placere dele umiddelbart ved siden af.
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

For at ændre positioneringsadfærden:

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

Vigtigt!

Du kan ikke blande auto-positionering med eksplicitte StartCell værdier på samme ark. Alle dele på et ark skal bruge enten automatisk positionering (no StartCell eller StartCell = "auto") eller eksplicitte cellereferencer.

Overlap

Systemet registrerer og rapporterer overlappende afstande. Hvis to dele skriver til de samme celler, kastes en fejl.

For at undgå overlap:

  • Brug automatisk positionering og lad systemet arrangere delene vertikalt
  • Når du bruger eksplicitte StartCell værdier, skal du sikre dig, at delene ikke deler nogen celler
  • Overvej header-rækken, når du beregner positioner (tabeller inkluderer altid en header-række, i intervaller er det valgfrit)

Kolonnebredder

Kolonnebredder beregnes automatisk baseret på indhold og datatyper. Når flere områder deler de samme kolonner, bestemmer det øverste område (ved startrække) kolonnebredden for de delte kolonner.

ShowGridlines-egenskaben

Egenskaben ShowGridlines styrer, om Excels gitterlinjer er synlige for et ark. Denne egenskab kan sættes på SheetData, Table, Range, eller Chart dele og påvirker hele arket. Når true (standarden), er gitterlinjer synlige. Når false, er gitterlinjer skjult.

Hvis en del på et ark eksplicit sætter ShowGridlines til false, skjuler hele arket gitterlinjer.

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

Arbejdsbogens egenskaber

Deltypen Workbook giver dig mulighed for at konfigurere indstillinger på dokumentniveau. Hvis den bruges, skal det være den første række i navigationstabellen.

Property Type Beskrivelse
ChartInferenceFunction funktion En funktion, der automatisk bestemmer kortets egenskaber, når det ikke er eksplicit angivet. Brug Office.InferChartPropertiesGenerator() til den indbyggede inferensmotor.
StrictNameHandling logisk Når true, giver en fejl, hvis ark- eller delnavne indeholder ugyldige tegn. Når false (standard), bliver navne automatisk renset.
UseSharedStrings logisk Når true (standard), bruger Excels delte streng-tabel til tekstceller, hvilket resulterer i mindre filer.

Eksempel med arbejdsbogsegenskaber

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

Flere diagrammer med delte data

Diagrammer kan referere til den samme datakilde, hvilket gør det muligt at lave flere visualiseringer af det samme datasæt uden at duplikere dataene i arbejdsbogen.

Brug syntaksen meta [Name = "..."] til at oprette referencer. Kolonnen Name skal specificeres for datadelen, så diagrammer kan løse referencen.

Vigtigt!

Når diagrammer refererer til data, skal du angive konfigurationen DataSeries med AxisColumns og ValueColumns. Uden en ChartInferenceFunction konfigureret i Workbook-egenskaberne resulterer udeladelse af disse nødvendige parametre i en fejl.

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

Referencer arbejder både fremad og bagud – et diagram kan referere til data, der defineres senere i tabellen, og flere diagrammer kan referere til den samme datakilde.

Typefacetter og celleformatering

Power Query-datatyper og deres facetter påvirker direkte, hvordan celler formateres i den genererede Excel-fil. Typesystemet tilbyder rige formateringsmuligheder, der oversættes til passende Excel-talformater.

Grundlæggende typeafbildninger

Power Query-type Excel-format
Text.Type Tekst (@)
Int32.Type, Int64.Type Almindelig
Decimal.Type, Number.Type Tal med to decimaler
Currency.Type Tal med tusind-skille og to decimaler
Percentage.Type Procentdel med to decimaler
Date.Type Datoformat
Time.Type Tidsformat med AM/PM
DateTime.Type Dato og tidspunkt format
DateTimeZone.Type Dato og tidspunkt format
Duration.Type Varighedsformat (d.hh:mm:ss)
Logical.Type Generelt (SANDT/FALSK)

Brug af skriftfacetter til præcis formatering

Typefacetter tillader dig at specificere præcision og skala for numeriske værdier:

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-præcision

Du kan kontrollere præcisionen af tidskomponenter ved hjælp af facetten 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

Bemærkning

Excel understøtter maksimalt tre cifre med brøkdelsekundspræcision. Højere præcisionsværdier afkortes.

Kortkonfiguration

Diagrammer konfigureres gennem registreringen Properties . Du kan eksplicit specificere diagramindstillinger eller stole på inferensmotoren til at bestemme passende værdier.

Hitlisteegenskaber

Property Type Beskrivelse
Diagramtype sende sms Den type diagram, der skal laves.
HitlisteTitel sende sms Titlen vises på diagrammet.
DataSeries post Konfiguration for dataserier, akser og værdier.
Grænser Optagelse eller tekst Placering og størrelse på diagrammet. Se Diagramplacering.

Placering på hitlisterne

Ejendommen Bounds bestemmer, hvor et diagram placeres, og dets størrelse. Du kan angive grænser som en tekstværdi ved hjælp af Excel-intervalsyntaks, eller som en post med detaljerede positioneringsmuligheder.

Standardplacering

Når det Bounds ikke er angivet, placeres diagrammerne på en standardplacering, der starter ved celle H8 med en standardstørrelse på 8 kolonner i bredden og 16 rækker i højden. Flere diagrammer på samme ark uden eksplicit Bounds vil overlappe på denne standardposition.

Tekstformat (Excel-områdesyntaks)

Brug en enkelt cellereference til øverste venstre hjørne (standardstørrelse på 8 kolonner x 16 rækker) eller et interval for eksplicitte dimensioner:

// Single cell: chart starts at B2 with default size
[Bounds = "B2"]

// Range: chart fills the area from G6 to N21
[Bounds = "G6:N21"]

Pladeformat med bredde og højde

Angiv øverste venstre hjørne og dimensioner:

Property Type Beskrivelse
FromColumn nummer eller tekst Kolonneindeks (0-baseret) eller Excel-kolonnenavn (f.eks. "A", ). "G" Standard: 7 (kolonne H).
FromRow nummer Rækkeindeks (0-baseret). Standard: 7 (række 8).
Bredde nummer Diagrambredde i antal kolonner. Standard: 8.
Højde nummer Lav højde i antal rækker. Standard: 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
]]

Recordformat med eksplicitte hjørner

Alternativt angiv begge hjørner af kortets område:

Property Type Beskrivelse
FromColumn nummer eller tekst Startkolonne (0-baseret indeks eller Excel-navn). Standard: 7 (kolonne H).
FromRow nummer Startrække (0-baseret). Standard: 7 (række 8).
ToColumn nummer eller tekst Slutkolonne (0-baseret indeks eller Excel-navn).
ToRow nummer Slutrække (0-baseret).
[Bounds = [
    FromColumn = "A",
    FromRow = 0,
    ToColumn = "H",
    ToRow = 16
]]

Gitterlayout-hjælpefunktion

Når du placerer flere diagrammer på et ark, kan du bruge en hjælpefunktion til at beregne gitterpositioner:

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

Avanceret positionering med EMU-forskydninger

For præcis placering inden for celler, brug offset-egenskaber. Offsets er i EMU'er (English Metric Units), hvor 914400 EMU'er svarer til 1 tomme.

Property Type Beskrivelse
FromColumnOffset nummer Forskudt fra venstre kant af startcellen (i EMU'er).
FromRowOffset nummer Forskudt fra den øverste kant af startcellen (i EMU'er).
TilKolonneForskydning nummer Forskudt fra venstre kant af slutcellen (i EMU'er).
ToRowOffset nummer Forskudt fra den øverste kant af slutcellen (i EMU'er).
[Bounds = [
    FromColumn = "C",
    FromColumnOffset = 352425,
    FromRow = 6,
    FromRowOffset = 142874,
    ToColumn = "R",
    ToColumnOffset = 142875,
    ToRow = 22,
    ToRowOffset = 171449
]]

Understøttede diagramtyper

Diagramtype Beskrivelse
Area Områdediagram
Area3D 3D-områdediagram
Bar Horisontalt søjlediagram
Bar3D 3D horisontalt søjlediagram
Column Vertikal kolonnediagram
Column3D 3D vertikal kolonnediagram
Doughnut Donut-diagram (ringformet)
Line Kurvediagram
Line3D 3D-linjediagram
Pie Cirkeldiagram
Pie3D 3D-cirkeldiagram
Radar Radarkort
StackedBar Stablet horisontalt søjlediagram
StackedBar100 100% stablet horisontalt søjlediagram
StackedColumn Stablet vertikal kolonnediagram
StackedColumn100 100% stablet lodret kolonnediagram

DataSeries-konfiguration

Posten DataSeries definerer, hvordan dine data kortlægges til diagramelementer:

Property Type Påkrævet Beskrivelse
AxisColumns Liste eller tekst Ja* En eller flere kolonnenavne bruges som diagramakse (kategorier).
ValueColumns Liste eller tekst Ja* En eller flere kolonnenavne til brug som diagramværdier (serie).
PrimærakseKolonne sende sms Nej Når man bruger kolonner med flere akser, angiver den, hvilken der fungerer som primær akselabel.

* Påkrævet, medmindre a ChartInferenceFunction er konfigureret i arbejdsbogens egenskaber. Uden slutning giver udeladelse AxisColumns en fejl "Ingen aksekolonner leveret", og udeladelse ValueColumns giver en fejl "Ingen værdikolonner angivet".

Eksempel med eksplicit diagramkonfiguration

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

Flerlagsaksekort

For hierarkiske kategoridata kan du specificere flere aksekolonner:

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

Brug af Office.InferChartPropertiesGenerator

Funktionen Office.InferChartPropertiesGenerator opretter en inferensmotor, der automatisk bestemmer diagramegenskaber baseret på dine data. Denne funktion er nyttig, når du ønsker fornuftige standardindstillinger uden at specificere alle diagramkonfigurationsdetaljer.

Vigtigt!

Uden en diagraminferensfunktion skal du eksplicit angive DataSeries både AxisColumns og ValueColumns for hvert diagram. Udeladelse af disse nødvendige parametre resulterer i en fejl.

Grundlæggende brug

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

Slutningsmuligheder

Office.InferChartPropertiesGenerator accepterer en valgfri post med følgende muligheder:

Mulighed Type Standard Beskrivelse
Allow3DCharts logisk falsk Når true, kan inferensmotoren vælge 3D-diagramtyper for passende data.
ForetrækMultilevelChartInference logisk falsk Når true, bruger alle ledende ikke-numeriske kolonner som aksekolonner for flerniveaudiagrammer.

Eksempel med inferensmuligheder

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

Hvordan slutning fungerer

Inferensmotoren returnerer en post med tre funktioner:

  • ChartType: Analyserer dataskemaet og bestemmer den optimale diagramtype baseret på:

    • Antal dataserier
    • Antal kategorier
    • Om aksekolonnerne er dato-, numeriske eller kategoriske
    • Rækkeantal
  • ChartTitle: Genererer en beskrivende titel baseret på diagramtypen og kolonnenavnene.

  • DataSeries: Udleder akse- og værdikolonner fra tabelskemaet:

    • Datokolonner foretrækkes som aksekolonner
    • Kategoriske (tekst) kolonner betragtes som aksekolonner
    • Numeriske kolonner bliver værdikolonner

Diagramtype-udvælgelseslogik

Inferensmotoren vælger diagramtyper baseret på datakarakteristika:

Datakarakteristika Udledt korttype
Enkelt række, ≤6 kategorier, kategorisk akse Cirkeldiagram
Enkelt serie, 7-15 kategorier, kategorisk akse Doughnut
DateTime-aksen Linje eller område
≥3-serier, ≤15 kategorier, kategorisk Radar
Flere serier, 3-25 kategorier Stablet Bar
Enkeltserier, få kategorier Kolonne
Mange kategorier Liggende søjle

Brugerdefineret inferensfunktion

Du kan give din egen inferensfunktion, der følger samme grænseflade:

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

Avancerede scenarier

Dette afsnit dækker programmatiske tilgange til dynamisk generering af navigationstabeller.

Opdeling af data i flere ark

Du kan bruge Power Querys liste- og tabelfunktioner til dynamisk at oprette ark baseret på dataværdier.

Brug af Table.Group

Gruppere data i en kolonne og oprette et ark for hver gruppe:

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

Brug af Table.Partition

Partitioner en tabel i grupper baseret på en brugerdefineret hashfunktion. Dette eksempel opdeler salgsdata i indtægtskategorier:

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

Brugerdefineret partitioneringsfunktion

For mere kontrol, brug en brugerdefineret partitioneringsfunktion:

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

Dynamiske diagrammer for opdelte data

Kombiner opdeling med diagrammer for at lave visualiseringer for hver gruppe:

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

Almindelige mønstre

Denne sektion indeholder færdige skabeloner til hyppige scenarier. Kopier og tilpas disse mønstre til dine behov.

Mønster: Simpel dataeksport

Eksporter en enkelt tabel til Excel med minimal konfiguration:

let
    excelDocument = #table(
        type table [PartType = nullable text, Data = any],
        {{"SheetData", YourDataTable}}
    )
in
    excelDocument

Mønster: Flere ark fra en liste

Opret ét ark pr. punkt i en liste:

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

Mønster: Data med skema på samme ark

Lav et ark med både data og visualisering:

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

Mønster: Dashboard med flere diagrammer, der deler data

Opret et dashboardark med flere diagrammer, der refererer til én datakilde:

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

Mønster: Side-om-side borde

Placer to borde ved siden af hinanden på samme ark:

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

Mønster: Stablede borde med automatisk positionering

Stab flere borde vertikalt med automatisk afstand:

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

Mønster: Ren rapport uden gitterlinjer

Opret en poleret rapport med skjulte gitterlinjer:

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

Bemærkninger og begrænsninger

Excel-grænser

Excel har iboende begrænsninger, der påvirker dokumentgenerering:

  • Maksimalt antal rækker pr. arbejdsark: 1.048.576 rækker
  • Maksimalt antal kolonner pr. arbejdsark: 16.384 kolonner
  • Maksimalt antal tegn pr. celle: 32.767 tegn
  • Arkets navn maksimal længde: 31 tegn
  • Arknavne kan ikke indeholde: \ / ? * [ ] eller starte/slutte med '

Når dine data overstiger disse grænser, bør du overveje at opdele dem på flere ark.

Fejlhåndtering

Celleniveau-fejl i dine data får dokumentgenerering til at fejle. Connectoren validerer data, mens den behandler hver række, og hvis den støder på en fejlværdi (såsom division med nul eller typekonverteringsfejl), udløser en undtagelse.

For at forhindre fejl:

  • Brug try...otherwise udtryk til at håndtere potentielle fejl før eksport
  • Erstat fejlværdier med passende standardværdier eller nullværdier
  • Valider datakvaliteten, før du bygger din navigationstabel
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

Navnehåndtering

Ark- og delnavne bliver automatisk renset for at overholde Excels navngivningsregler. Ugyldige tegn fjernes, og navne forkortes til 31 tegn. Hvis er StrictNameHandling aktiveret i Arbejdsbogens egenskaber, kastes en fejl i stedet for automatisk sanitering.

Duplikerede arknavne gøres automatisk unikke ved at tilføje et numerisk suffiks.

Fejlfinding

Dette afsnit dækker almindelige fejl, du kan støde på, når du opbygger navigationstabeller, og hvordan du løser dem.

Fejlreference

Fejlkode Fejlmeddelelse Afhjælpning
10950 Mangler {felt} for dokumentdel i række {række}. Sørg for, at hver række i din navigationstabel indeholder alle nødvendige kolonner. For SheetData-dele skal kolonnen Data få en tabelværdi. For diagramdele skal enten inline-data eller en gyldig tabelreference være tilgængelig.
10951 Duplikat delnavn: {name} Hver række i navigationstabellen skal have en unik Name værdi. Omdøb en af de dubletdele for at løse fejlen.
10953 Containernavnet '{name}' er ugyldigt. Overvej at bruge '{suggestion}' i stedet. Arknavne indeholder ugyldige tegn (\ / ? * [ ]) eller formateringsproblemer. Brug det foreslåede alternative navn eller aktiver automatisk desinfektion ved at udelade StrictNameHandling eller sætte det til false.
10954 Duplikeret beholder '{name}'. Hver dokumentdel (række) skal have en unik værdi i kolonnen Container. To dele har samme Sheet værdi. Når man bruger SheetData, kan hvert arbejdsark kun oprettes én gang. For flere dataområder på samme ark, brug Table eller Range dele i stedet.
10955 Duplikat navn '{name}'. Hver dokumentdel (række) skal have et unikt navn. To databundne dele har samme Name værdi. Hver databundet del skal have et unikt navn, fordi den registrerer en datakilde, som andre dele kan referere til. Omdøb en af delene.
10956 Den refererede tabel '{name}' blev ikke fundet. Når du bruger tabelreferencer (tomme tabeller med Name metadata), skal du sikre, at den refererede Name matcher værdien af Name en datadel. Tjek for slåfejl og kasusfølsomhed.
10959 AxisColumns skal være en enkelt tekstværdi eller en liste over tekster. Ejendommen AxisColumns har en ugyldig type. Angiv en tekstværdi som "Category" eller en liste som {"Region", "Year"}.
10962 ValueColumns skal være en enkelt tekst, en liste over tekster eller en post. Ejendommen ValueColumns har en ugyldig type. Angiv en tekstværdi som "Revenue" eller en liste som {"Revenue", "Units"}.
10963 Der er ikke angivet værdikolonner for delen '{name}'. Giv dem egenskaben 'ValueColumns'. For diagrammer uden et ChartInferenceFunction, skal du eksplicit angive ValueColumns det i posten DataSeries . Tilføj ValueColumns = {"Column1", "Column2"} til dit horoskop.DataSeries
10966 Der er ingen aksekolonner angivet for delen '{name}'. Giv dem egenskaben 'AxisColumns'. For diagrammer uden et ChartInferenceFunction, skal du eksplicit angive AxisColumns det i posten DataSeries . Tilføj AxisColumns = {"CategoryColumn"} til dit horoskop.DataSeries
10968 Kunne ikke bestemme egnede akse- eller værdikolonner for delen '{name}'. Tjek kolonnedatatyperne. Inferensmotoren kunne ikke identificere passende kolonner. Sørg for, at din tabel har mindst én kategorisk/dato-kolonne (for aksen) og én numerisk kolonne (for værdier), eller angiv dem eksplicit.
10970 Aksekolonnen '{kolonne}' er ikke med i skemaet. Kolonnenavnet, der er angivet i AxisColumns , findes ikke i din datatabel. Kontroller at kolonnenavnet passer præcist (kasusfølsomt).
10971 Værdikolonnen '{kolonne}' er ikke i skemaet. Kolonnenavnet, der er angivet i ValueColumns , findes ikke i din datatabel. Kontroller at kolonnenavnet passer præcist (kasusfølsomt).
10972 Værdikolonnen '{kolonne}' skal være numerisk, men er '{type}'. Søjler i diagrammets værdier skal indeholde numeriske data. Enten konverter kolonnen til en numerisk type ved hjælp af Table.TransformColumnTypes, eller vælg en anden kolonne.
10981 Ukendt værdi '{value}' for enum '{enum}'. En ugyldig værdi blev angivet for en ejendom som ChartType eller PartType. Tjek dokumentationen for gyldige værdier.
10985 Tabelreferencefejl: fandt en tom tabel uden 'Navn'-metadata, der pegede på datarækken. Når tomme tabeller bruges som datareferencer, skal de inkludere Name metadata. Brug #table({}, {}) meta [Name = "DataPartName"] den til at oprette en gyldig reference.
10986 Dele af typen '{type}' i '{format}'-filer skal have en tabel som data. TableReference er ikke tilladt. SheetData, Table, og Range dele skal indeholde inline tabeldata og må ikke bruge tabelreferencer. Kun diagramdele kan referere data fra andre dele.
10987 Dele af typen '{type}' skal have en tabel eller en tabelreference som Data. Delen kræver enten en tabel eller en gyldig tabelreference i kolonnen Data . Sørg for, at du giver en tabelværdi, ikke null eller en anden type.
10988 {felt} kan ikke være nul eller hvidrum. Navnet Sheet eller et andet krævet felt er tomt eller indeholder kun blankrum. Angiv en gyldig ikke-tom værdi.
10989 Deltypen '{type}' understøttes ikke. Brug en gyldig deltype: Workbook, , SheetData, Table, Range, eller Chart. Tjek for slåfejl i kolonnen PartType .
10990 Del {type} med dokumentindstillinger skal være den første del (række) i tabellen. Den Workbook del (der indeholder muligheder som ChartInferenceFunction) skal være den første række i din navigationstabel. Omarranger dine rækker derefter.
30005 Diagraminferensfunktionen er ikke tilgængelig for delen '{name}'. Sæt {property}-egenskaben manuelt. Tilføj en Workbook del som første række med [ChartInferenceFunction = Office.InferChartPropertiesGenerator()] i dens Properties, eller angiv manuelt den nødvendige egenskab på diagrammet.
30006 Diagraminferensfunktionen returnerede ikke en gyldig ChartType for delen '{name}'. Inferensmotoren kunne ikke bestemme en passende diagramtype for dine data. Angiv ChartType det eksplicit i diagrammets Properties registrering.
30018 Den angivne værdi kan ikke repræsenteres i Excel. Dataene indeholder værdier, der ikke kan gemmes i Excel, såsom datoer før år 1900 eller varigheder uden for Excels område. Filtrer eller transformér dataene for at fjerne værdier, der ikke understøttes.
30019 Excel-kolonnegrænsen for {limit}-kolonner blev overskredet. Din tabel har flere kolonner, end Excel understøtter (16.384). Reducer antallet af kolonner eller del dataene op over flere tabeller.
30020 Excel-rækkegrænsen for {limit} rækker blev overskredet. Dine data overstiger Excels rækkegrænse (1.048.576). Partitioner dataene på tværs af flere ark ved hjælp af Table.Partition eller Table.Group.
30059 Overlap mellem delene '{part1}' og '{part2}' blev opdaget. To dele på samme ark har overlappende celleområder. Juster StartCell positioner eller brug automatisk positionering.
30060 Cellereference '{ref}' overskrider Excel-grænserne for delen '{name}'. Referencen StartCell angiver en position uden for Excels gyldige område. Brug en gyldig cellereference i kolonnerne A-XFD og rækkerne 1-1048576.
30062 Container '{name}' har allerede en SheetData-del. Rækkevidde- og borddele kan ikke tilføjes. Et ark med en SheetData del kan ikke have Table eller Range dele have. Brug enten SheetData alene eller Table/Range dele sammen.
30063 Beholderen '{name}' har allerede Range eller Table dele. SheetData kan ikke tilføjes. Et ark med Table eller Range dele kan ikke have en SheetData del. Fjern SheetData delen eller flyt den til et andet ark.
30066 Området '{name}' kan ikke bruges som datakilde til diagrammet, fordi det har SkipHeader aktiveret. Diagrammer kræver header-rækker for at identificere dataserier. Fjern SkipHeader = true fra intervallet eller giv inline-data til diagrammet.
30067 {property}-værdien '{value}' for delen '{name}' er ugyldig. Forventede en enkeltcelle-reference. Værdien StartCell er ikke en gyldig Excel-cellereference. Brug formater som "B3" eller "AA100".
30068 Del '{name}' specificerer AutoPositionColumnOffset eller AutoPositionRowOffset, men har en eksplicit StartCell. Du kan ikke kombinere auto-positioneringsforskydninger med en eksplicit StartCell. Fjern enten StartCell for at bruge auto-positionering, eller fjern offset-egenskaberne.
30069 Delen '{name}' med AutoPositionColumnOffset ville overskride Excels maksimale kolonnegrænse. Kolonneforskydningen kombineret med tabellens bredde overstiger kolonne 16.384. Reducer offset eller antallet af kolonner.
30070 TableStyle-'{style}' for delen '{name}' er ugyldig. Brug en gyldig Excel-tabelstil: TableStyleLight1-21,28-TableStyleMedium1 , eller .TableStyleDark1-11

Almindelige problemer

Problem: Dokumentgenerering fejler med "Manglende værdi" eller skemafejl.

Årsag: Navigationstabellen mangler de nødvendige kolonner eller har forkerte kolonnetyper.

Løsning: Verdsig, at din navigationstabel indeholder de korrekte kolonner med de korrekte typer:

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
]

Diagraminferens virker ikke

Problem: Diagrammer kan ikke genereres med fejl som "Ingen akse/værdi-kolonner leveret".

Årsag: IngenChartInferenceFunction er konfigureret, og eksplicitte kolonnemappinger mangler.

Løsning: Enten tilføj en arbejdsbogsdel med inferensfunktionen som første række:

{"Workbook", "Workbook", "Workbook", [ChartInferenceFunction = Office.InferChartPropertiesGenerator()], null}

Eller specificér DataSeries eksplicit for hvert diagram:

[DataSeries = [AxisColumns = {"Category"}, ValueColumns = {"Revenue", "Profit"}]]

Tabelreferencer løses ikke

Problem: "Referencet tabel blev ikke fundet" fejl ved brug af tabelreferencer.

Årsag: Metadataene Name på referencen matcher ikke nogen datadel.

Løsning: Sørg for, at metadatanavnet matcher nøjagtigt:

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
    ...

Datatypefejl i celler

Problem: Dokumentgenerering fejler, når visse rækker behandles.

Årsag: Dine data indeholder fejlværdier (såsom division med nul eller fejl i typekonvertering).

Løsning: Rens fejlværdier før eksport:

Table.TransformColumns(
    YourTable,
    {{"ColumnName", each try _ otherwise null}}
)

Uunderstøttede dato- eller tidspunktværdier

Problem: Fejl "Den angivne værdi kan ikke repræsenteres i Excel" ved eksport af dato-/tidsdata.

Årsag: Excel kan ikke repræsentere datoer før 1. januar 1900 eller varigheder uden for det understøttede område.

Løsning: Filtrer ikke-understøttede værdier fra eller transformér dem:

Table.SelectRows(YourTable, each [DateColumn] >= #date(1900, 1, 1))

SheetData og tabel-/områdeblandingsfejl

Problem: Fejl "Container har allerede en SheetData-del" eller "Container har allerede Range- eller Table-dele."

Årsag: Du kan ikke kombinere SheetData med Table eller Range dele på samme ark.

Løsning: Enten bruger SheetData du alene til et ark, eller bruger Table/Range delene sammen:

// 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}

Konflikter med automatisk positionering

Problem: Fejl "Part specificerer AutoPositionColumnOffset eller AutoPositionRowOffset, men har en eksplicit StartCell."

Årsag: Du kan ikke bruge automatisk positioneringsforskydning, når StartCell den er eksplicit sat.

Løsning: Fjern enten StartCell for at bruge autopositionering, eller fjern offset-egenskaberne:

// 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}

Ugyldige arknavne

Problem: Fejl med henvisning til ugyldigt containernavn eller automatisk navnesinficering.

Årsag: Arknavne indeholder ugyldige tegn (\ / ? * [ ]) eller overstiger 31 tegn.

Løsning: Fordesinficér navnene på dine ark:

sanitizeName = (name as text) as text =>
    let
        cleaned = Text.Replace(Text.Replace(name, "/", "-"), "\", "-"),
        truncated = Text.Start(cleaned, 31)
    in
        truncated