--- title: File Properties sidebar_position: 12 ---
File Format Support (click to show) Excel supports a number of standard properties. Most modern versions of Excel also support custom properties. | Formats | Standard | Custom | Separate | |:----------|:--------:|:-------|----------| | XLSX/XLSM | ✔ | ✔ | ✔ | | XLSB | ✔ | ✔ | ✔ | | XLML | ✔ | ✔ | ✔ | | BIFF8 XLS | ✔ | ✔ | | | BIFF5 XLS | R | R | | The letter R (R) marks features parsed but not written in the format. The "Separate" column marks formats that store standard and custom properties in different locations. Legacy XLS files commingle properties.
Modern spreadsheet software support special file properties including titles and keywords. Third-party tools can understand the file properties without having to process or understand the spreadsheet structure. In the SheetJS Data Model, the workbook object `Props` property holds standard properties and the `Custprops` property holds custom properties. ## Live Demo The following demo generates `SheetJSProperties.xlsx` with two file properties: - The standard `Title` property will be set to `SheetJS Properties Test`. This will be displayed in the "Summary" tab of the Excel file properties dialog: !["Standard" tab showing "Title" property](pathname:///props/standard-title.png) - The custom `Custom Quip` property will be set to `Get Sheet Done`. This will be displayed in the "Properties" table in the "Custom" tab of the dialog: !["Custom" tab with "Custom Quip" property](pathname:///props/custom-quip.png) ```jsx live function SheetJSPropertiesExport() { return (); } ``` ## Spreadsheet Applications Spreadsheet applications commonly display file properties in separate windows: - Excel for Windows: select "File" above the ribbon bar, select "Info" in the left sidebar, and click Properties > Advanced Properties - Excel for Mac: select "File" in the menu bar and select "Properties" - WPS Office: select "Menu" > "Document Encryption" > "Properties" :::note pass When this demo was last tested, Apple Numbers (14.2, build 7041.0.109) did not support file properties in the XLSX import and export codecs. ::: ## Standard Properties Some properties cannot be changed in spreadsheet applications. The underlying SheetJS output codecs can write arbitrary values. The `Props` object understands the "standard" properties listed in the following table. "SheetJS Name" refers to the name of the property in the `Props` object. "Excel Property Setting" refers to the name in the Excel file properties dialog. | SheetJS Name | Excel Property Setting | |:--------------|:-------------------------------| | `Title` | Summary tab "Title" | | `Subject` | Summary tab "Subject" | | `Author` | Summary tab "Author" | | `Manager` | Summary tab "Manager" | | `Company` | Summary tab "Company" | | `Category` | Summary tab "Category" | | `Keywords` | Summary tab "Keywords" | | `Comments` | Summary tab "Comments" | | `LastAuthor` | Statistics tab "Last saved by" | | `CreatedDate` | Statistics tab "Created" | It is strongly recommended to test if the `Props` property exists: ```js title="Set the 'Title' file property" /* ensure `Props` exists */ if(!wb.Props) wb.Props = {}; /* set `Title` property */ wb.Props.Title = "SheetJS Properties Test"; ``` ## Custom Properties Custom properties are added in the workbook `Custprops` object. As with `Props`, scripts should test for the existence of the `Custprops` property: ```js title="Set the 'Custom Quip' custom file property" /* ensure `Custprops` exists */ if(!wb.Custprops) wb.Custprops = {}; /* set `Custom Quip` property */ wb.Custprops["Custom Quip"] = "Get Sheet Done"; ``` ## Export Override The SheetJS `write` and `writeFile` methods[^1] accept options. The `Props` option instructs the writer to override properties from the workbook object. In the following example, the workbook object sets the "Title" and "Keywords" standard properties. `writeFile` will override the "Keywords" property and add the "Category" property. The generated file will have the following properties: - "Title" will be set to "SheetJS Properties Test" (from the workbook object) - "Keywords" will be blank (overridden by `writeFile` option) - "Category" will be "Sheetpost" (assigned through `writeFile` option) ```jsx live function SheetJSPropertiesOverride() { return (); } ``` [^1]: See [`write` and `writeFile` in "Writing Files"](/docs/api/write-options)