QR codes from a spreadsheet, without the formula.
You have a column of links, part numbers, or room names in Excel, Google Sheets, or a plain list, and you need one QR code per row — each saved under the name that row already has. This is that job, done in your browser, with a manifest you can check afterwards.
Why the usual answers are painful
Search this and most of what comes back teaches you to build the codesinside the spreadsheet: an IMAGE() formula pointing at a third-party chart API, a VBA macro, or a paid add-in. Each has the same three problems.
- A formula sends every row to someone else's server. The
IMAGE()approach builds a URL containing your payload and asks a remote API to render it. Your list leaves the file, one request per row, and the images stop working the day that service does. - What you get is a picture in a cell, not a file. Anything that needs real files — a printer, a label run, an asset register — needs the codes exported and named, and that export is the part the tutorials leave to you.
- A macro is not portable. It breaks on Google Sheets, on Mac, on a locked-down work machine, and on the colleague you hand the file to.
Copying two columns into a page that hands back named files skips all three.
Two columns is the whole format
Copy two columns out of Excel, Google Sheets, or Numbers: the name you want the file to have, and the text the code should carry. Add the header row and paste the result into the generator. Copying cells from a spreadsheet gives you tab-separated text, so use File → Save As → CSV in Excel, or File → Download → Comma-separated values in Google Sheets, and paste from that.
filename,text
bench-01,https://example.com/assets/bench-01
bench-02,https://example.com/assets/bench-02
meeting-room-a,https://example.com/rooms/aIf your spreadsheet has no name column, make one. A formula such as="item-"&ROW()-1 is enough, and it keeps the names predictable rather than leaving you with qr-1.svg throughqr-400.svg in no particular order.
A plain list of URLs works too
If all you have is a list of links, put a name in the first column and the link in the second. The name is what tells the finished files apart; without one you are back to matching images to rows by hand, which is the part of this job that actually costs time.
Every file is named, and the manifest proves it
Each row produces <filename>.svg — not a numbered export you have to re-match later. The ZIP also containsmanifest.json, listing every filename against the exact payload encoded into it. Before you send 400 codes to a printer, that file is how you check that bench-02.svg really carries bench 02's link.
Read it as JSON rather than opening it in a spreadsheet: a payload beginning with =, +, -, or @ is treated as a formula by Excel, and a review file that executes its own contents is not a review file.
There is no row limit
The CSV itself is capped at 64 KiB, which is thousands of ordinary rows, and that is the only bound. Hosted generators cap their free tiers because they pay for the processing; here your own browser does the work, so there is no per-batch cost to ration.
Nothing is uploaded
Asset registers, room lists, and internal links are often exactly the data you are not allowed to hand to a third party. The CSV, the generated SVGs, and the ZIP stay in the page: nothing is sent to a server, the codes contain no redirect through anyone else's domain, and no scan is tracked.
Check a sample before you print
Scan two or three of the generated files with the phone camera your audience will actually use, at the size you intend to print. Scanning depends on payload length, print quality, contrast, and damage, and no generator can promise a code will read. A generated QR code also points wherever your spreadsheet told it to — verify the payloads before distribution.
Open the browser-local generator
CSV rules and print-check guide ·QR codes for equipment asset tags ·Static vs dynamic QR