ThermalPrint Manual GitHub
On this page

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.

The Batch print from CSV window showing the loaded file, a row preview of a customer label, and the Print 3 labels button
The batch window: the file summary, a live preview of the chosen row, and the Print button.

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#

  1. Put placeholders in your design. In the Label Designer, type ${ColumnName} wherever a value should go, in text, barcode, or QR content.
  2. Prepare a CSV file whose first row names the columns.
  3. 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:

ObjectContent
TextShip to: ${Name}
Text${City} #${serial}
Barcode (Code 128)${SKU}
QR codehttps://example.com/${SKU}
  • Column names are not case-sensitive: ${sku} matches a column called SKU.
  • 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
RuleDetails
SeparatorCommas, semicolons, or tabs. ThermalPrint works out which one your file uses, so exports from any region work.
First rowColumn names. Every name must be filled in and different from the others (ignoring upper and lower case).
Values with commas or line breaksPut them in double quotes, like "Smith, Jo". Spreadsheet programs do this for you.
Short or empty rowsMissing cells print as blank. Completely empty rows are skipped.
SpacesSpaces around a value are trimmed.
LimitsUp 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#

  1. Open File → Batch print from CSV… in the Label Designer.
  2. Press Choose CSV file… and pick your file. The window shows customers.csv · 3 rows · 3 columns.
  3. 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.
  4. Change Preview row to see the finished label for any row.
  5. 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#

MessageWhat to do
The first row must name the columns, or Column N has no nameMake 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 rowsSplit the file into smaller ones.
The file has a header but no data rowsAdd at least one row under the header.
Row N: … invalid barcodeThe 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 wrongSave 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.