← Back to all tools

Excel to HTML

Turn an Excel spreadsheet into a standalone HTML file with one table per sheet.

Drop your Excel file here, or click to choose a file Excel files only (.xlsx)

No file chosen yet.

Your file is ready.

Download

How it works

  1. Choose an .xlsx file.
  2. Click Convert to HTML.
  3. Download the .html file and open it in any browser.

The first row of each sheet is shown as the table header. Old .xls files cannot be read in the browser.

Why use Excel to HTML on Abloom Pdfly

Excel to HTML: common questions

Is Excel to HTML free?

Yes — every tool on Abloom Pdfly, including Excel to HTML, is free to use. No account, no watermark on your output, and no daily limit.

Are my files uploaded to a server?

No. The work happens on your own device, inside your browser. Nothing you convert, edit or read is sent to a server.

Will it change my original file?

Never. Excel to HTML creates a new file for you to download, and your original stays exactly as it was.

Does it work on my phone?

Yes. Any modern browser works — Android, iOS, Windows, macOS or Linux — and there is no app to install.

\n'; showDownload(new Blob(['\ufeff' + html], { type: 'text/html' }), 'spreadsheet.html', fmt(html.length)); setStatus('Done!', 'ok'); }) .catch(function(e){ setStatus('Failed: ' + (e.message||e), 'err'); }); }); function escXml(s){ return s.replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"'); } function readXlsx(zip){ var shared = []; function getShared(){ var f = zip.file('xl/sharedStrings.xml'); if(!f) return Promise.resolve([]); return f.async('string').then(function(xml){ var re = /([\s\S]*?)<\/si>/g, m; while((m = re.exec(xml)) !== null){ var inner = m[1], t = ''; var tr = /]*>([\s\S]*?)<\/t>/g, tm; while((tm = tr.exec(inner)) !== null) t += tm[1]; shared.push(t.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, "'")); } return shared; }); } function tagText(x, tag){ var mm = x.match(new RegExp('<' + tag + '[^>]*>([\\s\\S]*?)')); return mm ? mm[1] : ''; } function cellVal(inner, t){ if(t === 's'){ var idx = parseInt(tagText(inner, 'v'), 10); return shared[idx] || ''; } if(t === 'inlineStr') return tagText(inner, 't'); return tagText(inner, 'v'); } return getShared().then(function(){ var sheetNames = Object.keys(zip.files).filter(function(n){ return /^xl\/worksheets\/sheet\d+\.xml$/.test(n); }).sort(); if(!sheetNames.length) throw new Error('No worksheets found in this file.'); var chain = Promise.resolve([]); sheetNames.forEach(function(name, si){ chain = chain.then(function(all){ return zip.file(name).async('string').then(function(xml){ var rows = [], re = /]*>([\s\S]*?)<\/row>/g, rm; while((rm = re.exec(xml)) !== null){ var cells = [], cr = /]*)>([\s\S]*?)<\/c>/g, cm; while((cm = cr.exec(rm[1])) !== null){ var tm = cm[1].match(/\st="([^"]*)"/); cells.push(cellVal(cm[2], tm ? tm[1] : null)); } if(cells.length) rows.push(cells); } all.push({ sheet: si + 1, rows: rows }); return all; }); }); }); return chain; }); }