Batch printing
Batch printing fills one label design with the rows of a spreadsheet and prints one label per row. Use it for customer addresses, product SKUs, asset tags, serial-numbered stickers, or anything where the layout stays the same and the words change.

Numbered labels without a spreadsheet#
To print a run of numbers, such as 100 to 195 in steps of 5, use File → Print a number range… in the Designer instead. See Label Designer.
How it works in three steps#
- Put placeholders in your design. In the Label Designer, type
${ColumnName}wherever a value should go, in text, barcode, or QR content. - Prepare a CSV file whose first row names the columns.
- Open the batch window with File → Batch print from CSV…, choose the file, check the preview, and print.
Step 1: placeholders in the design#
A placeholder is a column name between ${ and }. For the sample file below, a design might contain:
| Object | Content |
|---|---|
| Text | Ship to: ${Name} |
| Text | ${City} #${serial} |
| Barcode (Code 128) | ${SKU} |
| QR code | https://example.com/${SKU} |
- Column names are not case-sensitive:
${sku}matches a column calledSKU. - Use as many placeholders as you like, in any text, barcode, or QR object. The same column can appear more than once.
${date}and${serial}keep their usual meaning, including the formatted versions${date:%d/%m/%Y}and${serial:4}, which are never mistaken for column names. In a batch,${serial}starts at the design's serial number and goes up by one per row.
Step 2: the CSV file#
Export a CSV from your spreadsheet program (File → Save as → CSV). Here is a small example:
Name,City,SKU
Ada Lovelace,London,SKU-1001
Grace Hopper,New York,SKU-1002
Alan Turing,Manchester,SKU-1003
| Rule | Details |
|---|---|
| Separator | Commas, semicolons, or tabs. ThermalPrint works out which one your file uses, so exports from any region work. |
| First row | Column names. Every name must be filled in and different from the others (ignoring upper and lower case). |
| Values with commas or line breaks | Put them in double quotes, like "Smith, Jo". Spreadsheet programs do this for you. |
| Short or empty rows | Missing cells print as blank. Completely empty rows are skipped. |
| Spaces | Spaces around a value are trimmed. |
| Limits | Up to 500 rows, 64 columns, and 2 MB per file. Split bigger lists into several files. |
| File types | .csv, .tsv, or .txt. A byte-order mark at the start (added by some Excel exports) is handled. |
Step 3: the batch window#
- Open File → Batch print from CSV… in the Label Designer.
- Press Choose CSV file… and pick your file. The window shows customers.csv · 3 rows · 3 columns.
- Read the messages below it:
- A red message means the design uses a placeholder the file has no column for, such as The design uses ${Phone} but the file has no column with that name. Printing is disabled until you fix the name.
- A gray line lists Columns not used. This is only information.
- An orange message says the design has no placeholders yet.
- Change Preview row to see the finished label for any row.
- Press Print N labels. If Print Center asks for more than one copy, the button says so (for example Print 3 labels × 2 copies).
The Help button in the batch window opens this page.
What happens when you print#
- Every row is checked first. ThermalPrint draws all the labels before it sends anything. If any row has a problem, nothing is printed and the message names the rows, for example Row 2: EAN-13: … . Fix the data and try again.
- The labels are then sent in order to the printer chosen in Print Center, using its media, resolution, and copies. Alignment offsets apply too.
- If something goes wrong partway through, the batch stops and tells you which row it stopped at.
- With Print using raw ZPL turned on (Export menu), labels are sent as ZPL instead of PDF.
- The finished batch appears in Recent prints as one entry, such as Customer label · batch of 3.
Values are inserted exactly as written. A value that itself looks like a placeholder, such as ${City}, is printed literally and not replaced again.
Common problems#
| Message | What to do |
|---|---|
| The first row must name the columns, or Column N has no name | Make sure the first row has a name in every column. |
| Two columns are named "…" | Rename one. Names that differ only in capital letters count as the same. |
| More than 500 rows | Split the file into smaller ones. |
| The file has a header but no data rows | Add at least one row under the header. |
| Row N: … invalid barcode | The value in that row does not suit the barcode type. See the rules for each type. A common case is an EAN-13 with the wrong number of digits. |
| Characters look wrong | Save the file as UTF-8 CSV. Characters that the built-in label font does not have, such as Chinese, Japanese, and Korean, cannot be drawn. |