CSV format
The parser looks for column names in the header row, not column position, so content can come first, last, or in the middle. content is the only required column. type is optional and defaults to url when left blank or omitted. label is optional and defaults to the first 30 characters of the content, used for the downloaded filename.
Quoted fields are supported, so a content value containing a comma can be wrapped in double quotes and it will not be split into extra columns. The exact sample file this page generates is:
Notice the last row: the mailto: scheme is written directly into the content column. The phone row above it is not written as tel:+1-555-123-4567, so it encodes as plain text rather than a tappable phone link. The type column is a label only; it does not add a scheme for you. If you want a phone or email QR that a phone recognizes as an action, put the full tel: or mailto: prefix in the content column yourself.
Advertisement
Formula-injection sanitization
Spreadsheet apps treat a cell starting with =, +, @, or - as the start of a formula, which is a known CSV attack vector: a malicious cell like =HYPERLINK("http://evil","click") can run when the file is reopened in Excel or Google Sheets. Every content value that starts with one of those characters, or with a tab or carriage return, gets a leading single quote inserted before it is used, which neutralizes it as a formula. This runs automatically on every row you upload, and again on any row you edit in the table.
Style options
One style applies to the entire batch. Choose from 8 color presets (Classic, Ocean, Sunset, Forest, Royal, Noir, Coral, Midnight), 6 dot styles (Square, Dots, Rounded, Classy, Classy Rounded, Extra Rounded), and 4 error correction levels: L (7% recovery), M (15%, the default), Q (25%), and H (30%). Higher error correction survives more real-world damage but makes each code slightly denser. For codes that will be printed small or handled a lot, use H; see the reliability audit to test one before committing to a full print run.
Export and ZIP naming
Each QR is rendered to a 400 by 400 pixel canvas and exported as a PNG. Click any generated thumbnail to download it individually, or use Download ZIP to bundle every generated code into one file. Inside the ZIP, each file is named after its label with anything that is not a letter, number, hyphen, or underscore replaced with an underscore, plus a .png extension. If two rows share the same label, they produce the same filename inside the ZIP, so give each row a distinct label if you plan to keep every file.
Measured limits
- Row cap: 200. The parser stops reading after the 200th data row.
- Generation speed: roughly 150ms per code (a short render wait plus a delay between codes), so a full 200-row batch takes about 30 seconds from clicking Generate All to having every thumbnail ready.
- Accepted uploads: .csv and .txt files.
- Output: PNG only, 400 by 400 pixels per code, at whatever color, dot style, and error correction level is selected for the batch.
Frequently Asked Questions
What columns does my CSV need?
One required column: content. Two optional columns: type (a label only, defaults to "url" if left out) and label (used for the downloaded filename, defaults to the first 30 characters of the content). The header row is required and column order does not matter, since the generator matches column names, not positions.
Is there a limit on how many QR codes I can generate at once?
Yes, 200 rows. Rows past the 200th are ignored during parsing. Generating a full batch of 200 takes roughly 30 seconds, since each QR is rendered to canvas with a short delay between codes to keep the browser responsive.
Does the "type" column change what gets encoded in the QR?
No. The type column is a label shown in the table and stored in the exported data, but it does not add a URI scheme to the content. If you want a QR that opens the phone dialer or an email client, put the full scheme in the content column yourself, for example tel:+15551234567 or mailto:info@link2qr.com, the way the sample CSV's email row already does.
Will my CSV data be uploaded anywhere?
No. The file is read in your browser with the FileReader API, and every QR code is rendered locally with qr-code-styling. Nothing in this tool sends your CSV or your QR content to a server.
What happens to formulas or special characters in my CSV?
Any content cell that starts with =, +, @, a hyphen, a tab, or a carriage return is prefixed with a single quote before it is encoded or shown in the table. This is a standard formula-injection guard: it stops a cell like =HYPERLINK(...) from being treated as a live formula if you later reopen the CSV in Excel or Google Sheets.
Can each QR code in a batch have its own color or style?
No. Color preset, dot style, and error correction level apply to the whole batch in one generation pass. To mix styles, split your data into separate CSV files and run each one through the tool.