# Bulk printing from Excel

> No code: upload Excel or CSV, match columns, print one label per row. Copies column, start slot, PDF.

Source: https://82label.app/en/docs/bulk/

On the [bulk print](https://82label.app/en/print/) page, pick a template and upload a spreadsheet: one label per row. It works without signing in, with samples, the template you were making in the designer, or a JSON template file. The file is read in the browser and never uploaded.

- **Template**: samples (Coupang Rocket Growth barcodes and more), your saved templates, the designer draft, a JSON file, a blank roll label. Open one by URL: `/en/print/?id=…`, `?sample=coupang-50x30`, `?preset=formtec-3108`, `?draft=1`.
- **File**: xlsx (first sheet), csv (UTF-8 or EUC-KR; comma, semicolon or tab detected), tab-separated txt. You can also copy a table in Excel and press Ctrl+V. Save old xls files as xlsx first.
- **Match columns**: automatic by exact name, by name without spaces, case and brackets, and by synonyms (barcode ↔ sku, name ↔ product, qty ↔ quantity, and the Korean column names). Your choices are remembered per template in this browser.
- **Copies column**: prints the same label as many times as the number says (0 skips the row, at most 9,999). Edit it per row in the table too.
- **Pick rows**: search, select all or none, a checkbox per row.
- **Preview**: real pages with your values. Sheets start at the start slot and show empty slots dashed.
- **Print**: silent with the print agent, else the browser dialog. [Save PDF](https://82label.app/en/docs/pdf/) works too.

## Doing the same in code

```js
import { print } from '@82label/core';

// rows: [{ name, sku, qty }, …]
await print('lbl_…', rows, { qtyField: 'qty', startAt: 3, serialStart: 1 });
```

> If labels come out a few mm off, set it once on the [calibration](https://82label.app/en/calibrate/) page.
