Importing Data
When a job has 30 or more pieces, entering them one by one is slow and easy to get wrong. CutOptim supports two bulk import methods that let you bring a full cut list into the app in seconds — whether your data lives in Excel, Google Sheets, or a CSV file exported from a design program.
- Paste works for both the Stock table and the Parts table, in all three modes (2D panels, 1D linear, and wood).
- CSV file import is available on the Parts table (2D, 1D, and wood) — under the CSV ⌄ dropdown in each Parts section header.
Both methods are available on all plans, including Free.
Method 1: Paste from Excel or Google Sheets
This is the fastest path from a spreadsheet into CutOptim. There is no file to export — just copy, paste, and go.
- 1
Open your spreadsheet
Open the Excel workbook, Google Sheet, or LibreOffice Calc file that contains your cut list or stock list.
- 2
Select the data range
Select the cells containing your data, in the expected order (Name, Width, Length, Qty for 2D; Name, Length, Qty for 1D; Name, Qty, Width, Height, Length for wood). You can include the header row — it decides the column order in every mode, so your columns can be in any order. A title line above the header (the name of the job) is fine too. A row with a missing or unreadable dimension, or a quantity of 0, is skipped, and the message after the paste says how many rows were skipped.
- 3
Copy to clipboard
Press **Ctrl+C** (or **Cmd+C** on Mac) to copy. The cells are now on your clipboard as tab-separated values. Text copied from a CSV file in Notepad or an e-mail (`Door;600;400;2`) pastes just as well — the semicolon or comma is recognised.
- 4
Paste into CutOptim
In the **Stock** or **Parts** section for your mode, click the **Paste** button in the section header — or click the paste box under the header and press **Ctrl+V**. The paste box is a slim one-line row until you click it; then it opens to full size with the column hint, ready for Ctrl+V. The rows are read and added to the table.
- 5
Confirm the unit (wood Parts only)
Pasting **wood into the Parts table** opens a short dialog with a preview asking which unit your numbers are in (mm, cm, or inch). Pick the source unit and confirm — the values are converted to your current working unit. Everything else — 2D, 1D, and **wood pasted into the Stock table** — is added straight away with no dialog; Stock wood is read in your current working unit, so set the unit before you paste.
This method works with any spreadsheet application that copies tab-separated values to the clipboard: Microsoft Excel, Google Sheets, LibreOffice Calc, Apple Numbers, and most other desktop spreadsheet tools. No special export step is needed.
How columns are read
Copy the header row with your data and CutOptim matches the columns by their titles, in every mode — in any order, with short titles such as w, h, l, Qty recognised as well as full words in every app language (Name/Név, Qty/Darab/Menge, Width/Sz/Breite, Height/M/Höhe, Length/Hossz/Länge …). Common alternatives are understood too — for the quantity Pieces, Count, Anzahl, Mennyiség, Spanish Cant.; for the price Cost, Kosten, Coût, Material price. In 2D, a list titled Name | Qty | w | l is read as width w, second side l, quantity Qty; in 1D, Qty | Length | Name is read as it says. A unit in a title — Width (mm), Länge [cm], Length (in) — is honoured, and the numbers under it are converted to your working unit.
Without a header row, columns are read by position, from left to right, in the order below. If a header is only partly recognised (for example a quantity column titled with a word CutOptim does not know), the rows are read by position and the message after the paste says so: check the table, and rename the column or reorder it if the numbers landed in the wrong place. If reading by position would contradict the header — the columns it did recognise are not where reading by position would look for them — nothing is imported, and the message names the unknown column: rename it (for example Name, Width, Length, Qty) or remove the header row, then import again.
In wood, the column hint the app shows in your language (for example Name | Qty | W | H | Length) works as a header row as it is, and a thickness column (Thickness, Dicke, Vastagság …) is recognised as a cross-section dimension.
| Mode | Column order |
|---|---|
| 2D panels | Name (optional), Width, Length, Quantity |
| 1D linear | Name (optional), Length, Quantity |
| Wood | Name (optional), Quantity, Width, Height, Length |
If you leave out the Name column, start the row with the first dimension — CutOptim assigns an automatic label.
Pasting into the Stock table keeps your names in every mode, from the Paste button and the paste box alike.
In 2D, the template’s optional Rot. and Edge banding columns come through a paste too — with a header row wherever they are, without one right after the quantity. A 0 (or no) in Rot. gives that piece a grain along the sheet, so a grain-locked part stays grain-locked — its Grain icon shows the lines. Excel’s TRUE / FALSE is understood in the Rot. column in any language (FALSCH, HAMIS, FAUX …).
A Grain column sets the grain direction from the file. Write W (the grain runs along the Width) or L (along the Length) — words such as along Length or Breite work too — or none in any app language (nincs, keine, aucun …) for no grain. It works in the Parts table (CSV and paste) and in the Stock paste, where it sets the grain of each sheet row (none = a sheet without grain, such as MDF). The message after the import says how many rows got their grain direction from the file.
Cut lists exported from other tools
A list exported from another cut-list program (columns such as Length, Width, Qty, Material, Label, Enabled, Grain direction) is read by its titles like any other, and three of those columns do something:
- Enabled — a row marked
FALSE/no/0is left out, and the message after the import says how many. - Grain direction — a part with a grain direction is locked against rotation, but only when the column actually tells parts apart. If every row carries the same value (the exporting tool’s default), the column is ignored and rotation stays on — locking every part would only cost material — and the message says so. When the column holds both h and v (horizontal and vertical), the two are kept 90° apart: h parts keep the orientation they were entered in, v parts are turned 90° from it — the Grain icon of each row shows which. A
Rot.column, when present, always wins. - Material — in Material-specific mode a name that is already in your material inventory is assigned to the part. For names the inventory does not know, CutOptim asks once after the import whether to create them and assign the parts; with Material-specific mode off and two or more materials in the file, it asks whether to cut them separately by material (which switches the mode on). Say no and nothing changes. New materials take the size of your first stock row — the file does not say how big the sheets are — so check the stock size of each material before you run.
Method 2: Import a CSV File
If your cut list is exported as a CSV from a design program, CAD tool, or ERP system, you can import it directly into the Parts table. There is no upload — the file is read in your browser.
New to the format? Open the CSV ⌄ dropdown in the Parts section header and choose Template to download a ready-made .csv with the correct columns and two example rows that give an example for every column (in 2D also an edge-banding type code, T:ABS 22×1;B:ABS 22×1) — fill it in and import it back.
- 1
Prepare the CSV
Save your parts as a `.csv` file (a tab-separated `.txt` from Excel's *Text (Tab delimited)* works too) with the columns in the order for your mode (see the reference below). An optional header row is fine — CutOptim uses it to match the columns, and skips a title line above it.
- 2
Click the CSV button
In the **Parts** section for your mode (2D, 1D, or Wood), open the **CSV ⌄** dropdown in the section header and choose **Import CSV**. A file picker opens.
- 3
Choose your file
Select the `.csv` file from your computer. It is read immediately — nothing is sent to a server — and the parts are added to the Parts table.
- 4
Confirm the unit (wood only)
A **wood** CSV opens the same unit-confirmation dialog as paste: preview the rows, choose whether the numbers are in mm, cm, or inch, and confirm. 2D and 1D CSV rows are added directly.
CSV import adds the rows to whatever is already in the Parts table — it does not clear it first. Clear the table beforehand if you want only the imported rows.
A row that cannot be read is skipped, never guessed. A blank, unreadable, zero or negative dimension, or a quantity of 0, means the row is left out — CutOptim does not invent a size for it. The message after the import says how many rows were skipped, so compare that number with your list and fix those rows in the file.
(Changed 2026-09-29.) Until then a 2D CSV row with an unreadable width became a 400 × 300 part and a 1D one a 500 length, with no warning. If you imported a CSV before that date and a stray 400×300 or 500 is in your saved project, it came from such a row.
CSV Format Reference
CSV import populates the Parts table. If your file has a header row, columns are matched by name (so you can include only the columns you need, in any order, and add optional ones); without a header they are read by position in the order below. Dimensions are in your current working unit (millimetres by default), except wood, where you choose the source unit on import.
2D Parts (panels)
| Position | Column | Required | Description |
|---|---|---|---|
| 1 | Name |
Yes | Label for this piece, e.g. Side Panel (may be left blank, but the field must be present) |
| 2 | Width |
Yes | Piece width |
| 3 | Length |
Yes | Piece length |
| 4 | Quantity |
Yes | Number of identical pieces |
| 5 | Rotatable |
Optional | 0 (or no, false, nem, nein …, and Excel’s FALSE in any language) keeps the orientation fixed; any other value, a blank cell, or leaving the column out allows 90° rotation |
| 6 | Edge banding |
Optional | Which sides are banded, and with which type. TRBL bands those sides with no specific type — Top, Right, Bottom, Left, any order, e.g. TR for top + right, blank for none. T:ABS oak 22;L:ABS white 22 assigns a banding type by name per side (separate pairs with ;, or quote the cell to use commas); names resolve against your banding-type library, and an unknown name still bands the edge. Applied on every signed-in plan, Free included (without an account the column is ignored); ignored if left blank |
| 7 | Grain |
Optional | W (grain along the Width) or L (along the Length); none or a blank cell = no grain. Read from a header row; the downloaded template shows L on its second example row (a non-rotatable row) |
| 8 | Price/pc |
Optional | Extra cost per finished piece (machining, edge banding…). Adds to the job cost; never shown on a client quotation |
| 9 | Selling price |
Optional | What you charge the customer per finished piece. Used when a quotation is built from product prices |
Example: Side Panel,600,400,4,1
1D Parts (linear pieces)
| Position | Column | Required | Description |
|---|---|---|---|
| 1 | Name |
Yes | Label for this piece (may be blank) |
| 2 | Length |
Yes | Piece length |
| 3 | Quantity |
Yes | Number of identical pieces |
| 4 | Price/pc |
Optional | Extra cost per finished piece |
| 5 | Selling price |
Optional | Charge per finished piece |
Example: Rail,1200,6
Wood Parts (length × cross-section)
| Position | Column | Required | Description |
|---|---|---|---|
| 1 | Name |
Yes | Label for this part (may be blank) |
| 2 | Quantity |
Yes | Number of identical parts |
| 3 | Width |
Yes | Cross-section width |
| 4 | Height |
Yes | Cross-section height |
| 5 | Length |
Yes | Part length |
| 6 | Price/pc |
Optional | Extra cost per finished part |
| 7 | Selling price |
Optional | Charge per finished part |
Example: Leg,4,50,50,700
With a header row, a Thickness column is recognised as a cross-section dimension, and the app’s own wood column hint in your language is accepted as the header.
Offcut inventory CSV
The Offcut Inventory has its own CSV ⌄ dropdown (see Offcut Inventory). A file without a header row is read by the number of values in each row: 4 values = name, width, height, quantity (a panel off-cut); 3 values = name, length, quantity (a bar off-cut).
Use one unit throughout a file. For 2D and 1D the numbers are taken in your current CutOptim unit, so switch the app to the right unit before importing. For wood you pick the source unit in the import dialog, and CutOptim converts for you.
Commas, semicolons or tabs — all three work
You do not have to convert your file. CutOptim looks at the first line that contains a separator and picks whichever of comma, semicolon or tab it finds most of, then uses that for the whole file. This matters if you are on a European Windows locale, where Excel’s “CSV” is usually semicolon-separated — save it and import it as is.
Quoted fields are handled properly, so a name containing the separator ("Shelf, long") survives the trip.
Numbers, units and file encoding
- Decimal comma or point, with or without thousands separators.
600,5,600.5,1 220,5,1.220,5and1,220.5are all read correctly. When a number carries both marks, the last one is the decimal mark. A lone1.220or1,220is ambiguous: it is read as a decimal unless other numbers in the same file prove which mark is the decimal one — and the message after the import names the value so you can check it. - A unit written in the cell —
720 mm,72 cm,2.44 m,28 3/8",2' 3 5/8"— is converted to your working unit, whatever the app is set to. Inch fractions (23 5/8) work without the inch mark too, in the working unit. This is how a SketchUp OpenCutList parts list comes in: itsDesignationbecomes the name and its raw cutting size (Length - raw,Width - raw) is used. - A unit in the column title —
Width (cm),Länge [mm]— applies to the plain numbers in that column. - File encoding. Excel’s “CSV” on Windows is not UTF-8 but the Windows code page of your language (Windows-1250 for Hungarian, Czech, Polish, Romanian and Croatian, Windows-1252 for Western languages). CutOptim detects this, so
Ajtó,TürorListwa ściennaarrive intact. UTF-8 (with or without BOM) and Excel’s Unicode text work as well.
The price columns and header rows
The two price columns are optional everywhere, but there is one thing to know:
For 2D and 1D, the price columns are only read when your file has a recognised header row. A headerless 2D or 1D file is read purely by position, and prices in it are ignored. Wood reads them positionally too (columns 6 and 7). If you are importing prices, keep the header row — the downloadable Template already has one.
A column named plainly Price maps to the cost column, not the selling price. For the selling price use a header containing sell or selling.
Preparing Your Spreadsheet
A few habits make imports go smoothly every time:
- A header row is optional. Both paste and CSV import recognise a header row and never import it as a part, so you can keep your column titles in either method.
- Column order or names. With a header row, CSV import and paste match columns by their titles, in any order, in every mode; without one, columns are read by position. Extra columns after the last needed one are ignored.
- Use whole numbers for quantity. Fractional quantities are not supported. Round up if a job calls for 2.5 sheets — enter
3. A quantity written as2 db,3xor×4is read as 2, 3 and 4; a quantity of0skips the row. - Use one unit throughout. Mixing units in a column (some values in mm, some in cm) produces wrong results. Convert the sheet to one unit first (for wood, just tell CutOptim the unit on import).
- Labels can contain spaces and special characters.
Left Side Panel – Oakis a valid label. In a CSV file, wrap a label in double quotes if it contains a comma. - Empty rows are skipped. Blank lines between data groups do not cause errors. A title line above the header is skipped too.
After Importing
Imported rows appear in the Parts or Stock table exactly as if you had typed them. From here:
- Review each row before running. Check that dimensions look right and quantities match your job.
- Edit individual cells by clicking on them. If a value came in wrong, click the cell and correct it.
- Add or remove rows as normal — imported rows behave identically to manually entered ones.
- Run the optimization when you are satisfied. Click Run optimizer or press Ctrl+Enter.
Both paste and CSV import add to the rows already in the table — with one exception: a table that still holds only its untouched example rows is replaced by the import, so the sample parts do not end up in your plan. Once you have edited or added a row, imports are appended; to replace your own rows, remove them first, then import.