Back to blog
Stuklijst (BOM) uitlezen met C# in Inventor
Intermediate

Stuklijst (BOM) uitlezen met C# in Inventor

David De Lombaerde David De Lombaerde · juli 10, 2026 · 15 min read

De stuklijst (BOM — Bill of Materials) is het hart van elk Inventor-assembly. Via C# kun je de BOM volledig automatisch uitlezen, exporteren naar Excel of CSV, en er rapportages mee genereren. Dit artikel toont alles wat je nodig hebt voor professionele BOM-automatisering.

Hoe de BOM werkt in Inventor

Inventor heeft twee soorten BOM-weergaven: Structured (hiërarchisch, toont sub-assembly-niveaus) en Parts Only (enkel de bladonderdelen, geen sub-assemblies). Elke weergave heeft rijen (BOMRows) met kolommen die eigenschappen tonen zoals onderdeelnummer, beschrijving, aantal en massa.

BOM openen en rijen uitlezen

using Inventor;
using System.Runtime.InteropServices;

public void LeesStuklijst(AssemblyDocument asmDoc)
{
    var bom = asmDoc.ComponentDefinition.BOM;

    // Activeer de Parts Only weergave
    bom.PartsOnlyViewEnabled     = true;
    bom.StructuredViewEnabled    = true;
    bom.StructuredViewFirstLevel = false; // toon alle niveaus

    // Werk met Parts Only View
    var bomView = bom.BOMViews["Parts Only"];

    foreach (BOMRow rij in bomView.BOMRows)
    {
        LeesBomRij(rij);
    }
}

private void LeesBomRij(BOMRow rij)
{
    string ondNr  = rij["Part Number"]?.ToString()   ?? "";
    string beschr = rij["Description"]?.ToString()   ?? "";
    string aantal = rij["Quantity"]?.ToString()       ?? "";
    string massa  = rij["Mass"]?.ToString()           ?? "";
    string mat    = rij["Material"]?.ToString()       ?? "";

    Console.WriteLine($"{ondNr,-20} {beschr,-30} Qty={aantal,-5} M={massa,-10} Mat={mat}");

    // Geneste rijen (sub-assembly-onderdelen)
    if (rij.ChildRows.Count > 0)
        foreach (BOMRow kind in rij.ChildRows)
            LeesBomRij(kind);
}

Eigen kolommen toevoegen aan de BOM

Via BOMView.AddCustomColumn voeg je eigen kolommen toe die je daarna kunt vullen:

// Voeg "Leverancier"-kolom toe
bomView.AddCustomColumn("Leverancier", "");

// Waarde instellen per rij
foreach (BOMRow rij in bomView.BOMRows)
{
    // Zoek de occurrence op om iProperties te lezen
    if (rij.ComponentOccurrences.Count > 0)
    {
        var occ = (ComponentOccurrence)rij.ComponentOccurrences[1];
        var doc = (Document)occ.Definition.Document;
        string leverancier = LeesProperty(doc, "Custom", "Leverancier");
        rij["Leverancier"] = leverancier;
    }
}

BOM exporteren naar CSV

public void ExporteerBomNaarCsv(AssemblyDocument asmDoc, string uitvoerPad)
{
    var bomView  = asmDoc.ComponentDefinition.BOM.BOMViews["Parts Only"];
    var regels   = new List();

    // Koptekst
    regels.Add("Onderdeelnummer,Beschrijving,Aantal,Massa (kg),Materiaal");

    // Data
    foreach (BOMRow rij in bomView.BOMRows)
    {
        string nr    = rij["Part Number"]?.ToString()  ?? "";
        string desc  = rij["Description"]?.ToString()  ?? "";
        string qty   = rij["Quantity"]?.ToString()     ?? "";
        string mass  = rij["Mass"]?.ToString()         ?? "";
        string mat   = rij["Material"]?.ToString()     ?? "";

        // Escape voor CSV (aanhalingstekens als er komma's in zitten)
        regels.Add($""{nr}","{desc}",{qty},{mass},"{mat}"");
    }

    File.WriteAllLines(uitvoerPad, regels, System.Text.Encoding.UTF8);
    Console.WriteLine($"BOM CSV opgeslagen: {uitvoerPad}");
}

BOM exporteren naar Excel via interop

public void ExporteerBomNaarExcel(AssemblyDocument asmDoc, string uitvoerPad)
{
    var bomView = asmDoc.ComponentDefinition.BOM.BOMViews["Parts Only"];

    var excel   = new Microsoft.Office.Interop.Excel.Application();
    var wb      = excel.Workbooks.Add();
    var ws      = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[1];

    // Koptekst
    ws.Cells[1, 1] = "Onderdeelnummer";
    ws.Cells[1, 2] = "Beschrijving";
    ws.Cells[1, 3] = "Aantal";
    ws.Cells[1, 4] = "Massa (kg)";
    ws.Cells[1, 5] = "Materiaal";

    int rij = 2;
    foreach (BOMRow bomRij in bomView.BOMRows)
    {
        ws.Cells[rij, 1] = bomRij["Part Number"]?.ToString()  ?? "";
        ws.Cells[rij, 2] = bomRij["Description"]?.ToString()  ?? "";
        ws.Cells[rij, 3] = bomRij["Quantity"]?.ToString()     ?? "";
        ws.Cells[rij, 4] = bomRij["Mass"]?.ToString()         ?? "";
        ws.Cells[rij, 5] = bomRij["Material"]?.ToString()     ?? "";
        rij++;
    }

    wb.SaveAs(uitvoerPad);
    wb.Close();
    excel.Quit();
    Marshal.ReleaseComObject(excel);

    Console.WriteLine($"BOM Excel opgeslagen: {uitvoerPad}");
}

Structured vs Parts Only weergave

Gebruik Structured als je de assemblagehiërarchie wil bewaren (sub-assemblies als groepen). Gebruik Parts Only voor een vlakke inkoop- of fabricagelijst. In code schakel je tussen de weergaven via bom.BOMViews["Structured"] respectievelijk bom.BOMViews["Parts Only"].

Aantal per niveau berekenen

In een geneste assembly is het totale aantal van een onderdeel het product van het aantal op elk niveau. Inventor rekent dit voor je uit in de Parts Only-weergave — het Quantity-veld geeft al het gecombineerde totaal.

Onderdelen filteren op categorie

// Alleen metalen onderdelen tonen
foreach (BOMRow rij in bomView.BOMRows)
{
    string mat = rij["Material"]?.ToString() ?? "";
    if (mat.Contains("Steel") || mat.Contains("Aluminium") || mat.Contains("Staal"))
        Console.WriteLine($"{rij["Part Number"]} — {mat}");
}

Veelgemaakte fouten

BOMView["Parts Only"] geeft een fout — de weergave moet eerst geactiveerd worden: stel bom.PartsOnlyViewEnabled = true in voor je de weergave opent.

Massa is 0 of leeg — massa wordt pas ingevuld als het materiaal correct is ingesteld in Inventor. Controleer de materiaalinstellingen van het onderdeel.

Kolomnamen zijn gelokaliseerd — de namen van BOM-kolommen (Part Number, Quantity) zijn afhankelijk van de taalinstelling van Inventor. Test je code op de doelinstallatie.

Samenvatting

Stuklijst-automatisering bespaart enorm veel tijd bij het aanmaken van inkoop- en fabricageoverzichten. Met de Inventor BOM-API lees je in een paar regels code alle onderdelen, aantallen, massa's en materialen uit en exporteer je ze naar CSV of Excel. Combineer dit met iProperty-uitlezing voor maximale flexibiliteit.

Share this article

LinkedIn WhatsApp X

Comments

No comments yet — be the first!

Leave a comment

Sign in to skip moderation — anonymous comments are reviewed before appearing.