Skip to content

Batch printing from spreadsheets

Design one label with placeholders, import your data, and export selected rows. Imports support up to 5,000 rows within file and cell limits; split large exports into smaller ranges within the output limits. Review values and test one label before printing a batch.

Put {{Column Name}} anywhere text or a barcode value goes — the Field tool in the toolbar lists your imported columns so you don’t have to type them. A barcode whose value is {{SKU}} uses that row’s value. Encoding checks do not establish ownership of an identifier or guarantee a successful scan.

Import data in the top bar accepts four sources:

  • File upload — .xlsx, .xls, .ods, .csv, .tsv. Store identifiers as text in the source spreadsheet and check the import preview. Leading zeros or digits already lost to spreadsheet rounding cannot be recovered by import.
  • Google Sheets — use a link only for a sheet already intended for Anyone with the link access. Do not widen sharing on private order/contact data: download a file or paste cells instead. A #gid= selects a tab for import; it does not make other tabs in the shared spreadsheet private.
  • Paste — straight from Excel or any table.
  • Manual grid — type rows in place.

Columns auto-match your placeholders; warnings flag anything unmatched or empty. Blank cells collapse — no gap lines from a missing address line 2.

Everything after the column name is optional, so a bare {{SKU}} prints exactly what the cell holds.

Placeholder Prints
{{SKU}} the row’s value for the SKU column
{{#}} this label’s sequence number
{{date}} today, as 2026-08-27
{{date+30}} 30 days out; {{date-7}} goes back a week
{{expiry+30}} 30 days after the date in your expiry column
{{date|mdy}} today, as 08/27/2026
{{sku|upper}} the value uppercased
{{qty|pad5}} 00042 — zero-padded to 5 characters
{{name|cut20}} the first 20 characters

Column names are matched without regard to case. A column actually named date or # wins over the built-in of the same name.

{{date}} is the day you generate the batch — one date for the whole run, even one that crosses midnight. Add + or - and a number of days to shift it for date arithmetic. The tool does not determine shelf life, safety dates or regulatory labeling rules; supply and verify dates appropriate for your product.

The same offset works on your own data. With an expiry column holding 2026-01-15, {{expiry+30}} prints 2026-02-14 — the shift is from the cell, not from the day you print. Cells have to be real dates to shift: 2026-01-15 or 20260115, which is what the importer writes for a date cell. A cell in any other form prints exactly as typed rather than being read as a date and guessed at.

Add a format name to any date placeholder:

Format {{date|format}}
iso (the default) 2026-08-27
yyyymmdd 20260827
yymmdd 260827
mdy 08/27/2026
dmy 27/08/2026

Every format emits digits, - and / only, so a date inside a Code 39 or GS1-128 payload still renders. yymmdd is the GS1 date form for a (17) expiry or (11) production date.

Chain transforms with |; they run left to right.

Transform Does
upper, lower, trim case, and surrounding whitespace
digits strips everything but 0–9 — for EAN, UPC, ITF
padN zero-pads to N characters
cutN keeps the first N characters

{{name\|trim\|upper\|cut20}} is a valid chain. cutN counts characters as you see them, so an emoji or a CJK ideograph is never cut in half. A transform name that isn’t in this table leaves the value alone — a typo never blanks a label.

  • {{#}} inserts a sequential number with a start value, step, zero padding, and prefix — INV-0001, INV-0002, …
  • {{#}} counts by is the step. 2 numbers every other unit; -1 counts down, ending the run at 1 (set a start value to count down from your own number instead).
  • Print each ×N prints multiples per row (two per cable end, three per moving box).
  • Row ranges like 1-50, 60 reprint parts of a run without regenerating everything.

Imports hold up to 5,000 rows. The first 2,000 are saved with the design — rows past that print fine now but need re-importing after a reload.

Preview renders real labels from your first rows — check a barcode scans before committing. Generate produces one PDF with a label per row (or imposed N-up on Avery sheets, with a start-position offset for partially used sheets).

Invalid rows — say, a bad EAN check digit — are flagged and their barcode is left off the label rather than printing stale data.