
I was asked if it was possible to format the BoM export from Inventor’s assembly environment, similar to the way that parts lists are formatted in drawings.
I wrote some code to do this, below is an animated GIF showing the code in action:
My solution was to build an iLogic utility that does the following:
- Creates a temporary drawing from a pre-defined drawing template (stored in C:\Temp)
- In this temporary drawing – a single view of the current assembly is added
- A parts list is automatically added (the style is pulled from the drawing template)
- The parts list is exported to a formatted excel sheet (based on a specified Excel template, saved in C:\Temp)
- The Excel sheet is saved into a folder with the name of the original assembly file.
The drawing template file is in Inventor 2021 format and should work with newer versions. If you would like to use it in older versions see template notes at the bottom of this post.
To get it all to work, you will need to download this Zip File, unblock it

Then place the 2 files into “C:\Temp” on your PC.

Next you need to run the rule below from an assembly file (.IAM). I always use external rules for this sort of thing,as I am then able to run this from any assembly, and I don’t need to maintain code in multiple places.
oOptions = ThisApplication.TransientObjects.CreateNameValueMap' create a new NameValueMap object
'iLogic Utility by @ClintBrown3D originally posted here --> https://clintbrown.co.uk/export-formatted-parts-list-with-ilogic
'Parts list placement from Autodesk Inventor API samples
'Parts list export based on Curtis Waguespack's blog post --> https://inventortrenches.blogspot.com/2011/06/ilogic-export-parts-list-with-options.html
'XLS SETUP--------------------------------------------------------------XLS SETUP---------------------------------------------------------------------------XLS SETUP
oOptions.Value("Template") = "C:\Temp\PartListExport.xlsx" 'specify an existing template file 'to use For formatting colors, fonts, etc
oExcelSaveLocation = "C:\Temp\Parts Lists\" ' Make sure path has "\" at end -> eg C:\Temp\Parts Lists\
If(Not System.IO.Directory.Exists(oExcelSaveLocation)) Then: System.IO.Directory.CreateDirectory(oExcelSaveLocation):End If 'Create XLS Parts List folder
'specify the columns to export
oOptions.Value("ExportedColumns") = "ITEM;QTY;PART NUMBER;DESCRIPTION;MATERIAL;MASS" 'These Must match what is shown on the drawing!!!
'specify the start cell
oOptions.Value("StartingCell") = "A2"
'XLS SETUP--------------------------------------------------------------XLS SETUP---------------------------------------------------------------------------XLS SETUP
On Error GoTo ClintsErrorTrap
Dim oDrawDoc As DrawingDocument ' Set a reference to the drawing document.' This assumes a drawing document is active
oDrawDoc = ThisApplication.ActiveDocument
Dim oSheet As Sheet 'Set a reference to the active sheet.
oSheet = oDrawDoc.ActiveSheet
Dim oDrawingView As DrawingView ' Set a reference to the first drawing view on' the sheet. This assumes the first drawing' view on the sheet is not a draft view.
oDrawingView = oSheet.DrawingViews(1)
Dim oBorder As Border ' Set a reference to th sheet's border
oBorder = oSheet.Border
Dim oPlacementPoint As Point2d
If Not oBorder Is Nothing Then ' A border exists. The placement point' is the top-right corner of the border
oPlacementPoint = oBorder.RangeBox.MaxPoint
Else' There is no border. The placement point' is the top-right corner of the sheet.
oPlacementPoint = ThisApplication.TransientGeometry.CreatePoint2d(oSheet.Width, oSheet.Height)
End If
Dim oPartsList As PartsList ' Create the parts list.
oPartsList = oSheet.PartsLists.Add(oDrawingView, oPlacementPoint)
ThisDoc.Document.SaveAs("C:\Temp\DeleteMe2.dwg" , False)
oRead = System.IO.File.OpenText("C:\TEMP\part1.txt") 'Get Original Assembly file name
EntireFile1 = oRead.ReadLine()
oRead.Close()
oDrawingName = EntireFile1
oDoc = ThisDoc.Document'define oDoc
path_and_name = oExcelSaveLocation + oDrawingName
'specify the drawing sheet
oSheet = oDoc.Sheets("Sheet:1") ' sheet by name
oPartsList = oSheet.PartsLists(1) ' say there is a Partslist on the sheet.
oOptions.Value("IncludeTitle") = True 'choose to include the parts list title row
oOptions.Value("AutoFitColumnWidth") = True 'choose to autofit the column width in the xls file
If Dir(path_and_name & ".xlsx") <> "" Then : Kill (path_and_name & ".xlsx"): End If 'check for existing XLS file and delete it if found
oPartsList.Export(path_and_name & ".xlsx",PartsListFileFormatEnum.kMicrosoftExcel, oOptions) ' export the Partslist to Excel with options
ThisDoc.Launch(path_and_name & ".xlsx") 'Open Parts List
ThisDoc.Document.Close(True)
Return
ClintsErrorTrap :
MsgBox("We've encountered a mystery")
ThisDoc.Document.Close(True)
Template Notes:
The Template drawing is set up with a local Parts List Style, which I have called “Unofficial” (you could call it anything really!), this style has every possible property added to the “Parts List Column Chooser”. The reason for this, is that if a property is specified in the iLogic Code, but it is not visible on the drawing, there will be an error when the parts list is exported.
If you wish to make this code work with an earlier version of Inventor you will need to do something similar (ensure that the columns you need are available on the drawing).

iLogic Code in the Template is as follows:
oOptions = ThisApplication.TransientObjects.CreateNameValueMap' create a new NameValueMap object
'iLogic Utility by @ClintBrown3D originally posted here --> https://clintbrown.co.uk/export-formatted-parts-list-with-ilogic
'Parts list placement from Autodesk Inventor API samples
'Parts list export based on Curtis Waguespack's blog post --> https://inventortrenches.blogspot.com/2011/06/ilogic-export-parts-list-with-options.html
'XLS SETUP--------------------------------------------------------------XLS SETUP---------------------------------------------------------------------------XLS SETUP
oOptions.Value("Template") = "C:\Temp\PartListExport.xlsx" 'specify an existing template file 'to use For formatting colors, fonts, etc
oExcelSaveLocation = "C:\Temp\Parts Lists\" ' Make sure path has "\" at end -> eg C:\Temp\Parts Lists\
If(Not System.IO.Directory.Exists(oExcelSaveLocation)) Then: System.IO.Directory.CreateDirectory(oExcelSaveLocation):End If 'Create XLS Parts List folder
'specify the columns to export
oOptions.Value("ExportedColumns") = "ITEM;QTY;PART NUMBER;DESCRIPTION;MATERIAL;MASS" 'These Must match what is shown on the drawing!!!
'specify the start cell
oOptions.Value("StartingCell") = "A2"
'XLS SETUP--------------------------------------------------------------XLS SETUP---------------------------------------------------------------------------XLS SETUP
On Error GoTo ClintsErrorTrap
Dim oDrawDoc As DrawingDocument ' Set a reference to the drawing document.' This assumes a drawing document is active
oDrawDoc = ThisApplication.ActiveDocument
Dim oSheet As Sheet 'Set a reference to the active sheet.
oSheet = oDrawDoc.ActiveSheet
Dim oDrawingView As DrawingView ' Set a reference to the first drawing view on' the sheet. This assumes the first drawing' view on the sheet is not a draft view.
oDrawingView = oSheet.DrawingViews(1)
Dim oBorder As Border ' Set a reference to th sheet's border
oBorder = oSheet.Border
Dim oPlacementPoint As Point2d
If Not oBorder Is Nothing Then ' A border exists. The placement point' is the top-right corner of the border
oPlacementPoint = oBorder.RangeBox.MaxPoint
Else' There is no border. The placement point' is the top-right corner of the sheet.
oPlacementPoint = ThisApplication.TransientGeometry.CreatePoint2d(oSheet.Width, oSheet.Height)
End If
Dim oPartsList As PartsList ' Create the parts list.
oPartsList = oSheet.PartsLists.Add(oDrawingView, oPlacementPoint)
ThisDoc.Document.SaveAs("C:\Temp\DeleteMe2.dwg" , False)
oRead = System.IO.File.OpenText("C:\TEMP\part1.txt") 'Get Original Assembly file name
EntireFile1 = oRead.ReadLine()
oRead.Close()
oDrawingName = EntireFile1
oDoc = ThisDoc.Document'define oDoc
path_and_name = oExcelSaveLocation + oDrawingName
'specify the drawing sheet
oSheet = oDoc.Sheets("Sheet:1") ' sheet by name
oPartsList = oSheet.PartsLists(1) ' say there is a Partslist on the sheet.
oOptions.Value("IncludeTitle") = True 'choose to include the parts list title row
oOptions.Value("AutoFitColumnWidth") = True 'choose to autofit the column width in the xls file
If Dir(path_and_name & ".xlsx") <> "" Then : Kill (path_and_name & ".xlsx"): End If 'check for existing XLS file and delete it if found
oPartsList.Export(path_and_name & ".xlsx",PartsListFileFormatEnum.kMicrosoftExcel, oOptions) ' export the Partslist to Excel with options
ThisDoc.Launch(path_and_name & ".xlsx") 'Open Parts List
ThisDoc.Document.Close(True)
Return
ClintsErrorTrap :
MsgBox("We've encountered a mystery")
ThisDoc.Document.Close(True)
Notes:
This version of the code was briefly tested in Inventor 2021.
As always, please test all iLogic code extensively on non-production files. Do not use any code in a production environment until YOU have thoroughly tested it and have verified that it works as expected. Always back up any data before running any experimental code. You are ultimately responsible for any iLogic code that you run, so make sure you test it thoroughly!

You must be logged in to post a comment.