function exportWithAoaToSheet() { // 创建二维数组数据 const aoaData = [ ['姓名', '年龄', '城市', '职业'], ['张三', 25, '北京', '工程师'], ['李四', 30, '上海', '设计师'], ['王五', 28, '广州', '产品经理'], ['赵六', 35, '深圳', '销售'], ['孙七', 22, '杭州', '实习生'] ]; // 创建工作簿和工作表 const wb = XLSX.utils.book_new(); const ws = XLSX.utils.aoa_to_sheet(aoaData); // 将工作表添加到工作簿 XLSX.utils.book_append_sheet(wb, ws, '用户信息'); // 导出文件 XLSX.writeFile(wb, '用户信息_aoa_to_sheet.xlsx');}
function exportWithJsonToSheet() { // 创建JSON数据 const jsonData = [ { name: '张三', age: 25, city: '北京', job: '工程师' }, { name: '李四', age: 30, city: '上海', job: '设计师' }, { name: '王五', age: 28, city: '广州', job: '产品经理' }, { name: '赵六', age: 35, city: '深圳', job: '销售' }, { name: '孙七', age: 22, city: '杭州', job: '实习生' }, { name: '周八', age: 29, city: '成都', job: '运营' } ]; // 创建工作簿和工作表 const wb = XLSX.utils.book_new(); const ws = XLSX.utils.json_to_sheet(jsonData); // 设置每列的列宽,10代表10个字符,注意中文占2个字符 ws['!cols'] = [ { wch: 10 }, { wch: 30 }, { wch: 25 }, { wch: 10 }, { wch: 30 }, { wch: 25 }, ] // 将工作表添加到工作簿 XLSX.utils.book_append_sheet(wb, ws, '用户信息'); // 导出文件 XLSX.writeFile(wb, '用户信息_json_to_sheet.xlsx');}
<tableid="html-table"> <thead> <tr> <th>产品名称</th> <th>价格</th> <th>库存</th> <th>分类</th> </tr> </thead> <tbody> <tr> <td>笔记本电脑</td> <td>5999</td> <td>150</td> <td>电子产品</td> </tr> <tr> <td>智能手机</td> <td>3999</td> <td>280</td> <td>电子产品</td> </tr> <tr> <td>无线耳机</td> <td>799</td> <td>500</td> <td>电子产品</td> </tr> <tr> <td>机械键盘</td> <td>499</td> <td>120</td> <td>电脑配件</td> </tr> </tbody></table>
function exportWithTableToSheet() { // 获取HTML表格元素 const table = document.getElementById('html-table'); // 创建工作簿和工作表 const wb = XLSX.utils.book_new(); const ws = XLSX.utils.table_to_sheet(table); // 将工作表添加到工作簿 XLSX.utils.book_append_sheet(wb, ws, '产品信息'); // 导出文件 XLSX.writeFile(wb, '产品信息_table_to_sheet.xlsx');}
// csv转sheet对象function csv2sheet(csv) { var sheet = {}; // 将要生成的sheet csv = csv.split('\n'); csv.forEach(function(row, i) { row = row.split(','); if(i == 0) sheet['!ref'] = 'A1:'+String.fromCharCode(65+row.length-1)+(csv.length-1); row.forEach(function(col, j) { sheet[String.fromCharCode(65+j)+(i+1)] = {v: col}; }); }); return sheet;}// 将一个sheet转成最终的excel文件的blob对象,然后利用URL.createObjectURL下载function sheet2blob(sheet, sheetName) { sheetName = sheetName || 'sheet1'; var workbook = { SheetNames: [sheetName], Sheets: {} }; workbook.Sheets[sheetName] = sheet; // 生成excel的配置项 var wopts = { bookType: 'xlsx', // 要生成的文件类型 bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性 type: 'binary' }; var wbout = XLSX.write(workbook, wopts); var blob = new Blob([s2ab(wbout)], {type:"application/octet-stream"}); // 字符串转ArrayBuffer function s2ab(s) { var buf = new ArrayBuffer(s.length); var view = new Uint8Array(buf); for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; return buf; } return blob;}
function downloadBlob(blob, filename) { const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); window.URL.revokeObjectURL(url);}
// 传入csv,执行后就会弹出下载框function exportExcel(csv) { var sheet = csv2sheet(csv); var blob = sheet2blob(sheet); downloadBlob(blob, '导出.xlsx');}
<divclass="input-group"> <labelfor="excel-file">选择Excel文件:</label> <inputtype="file"id="excel-file"accept=".xlsx,.xls" /> <divid="file-info"class="file-info"style="display: none;"></div></div>
// 全局变量,存储读取的Excel数据let workbook = null;let selectedSheetName = null;// 监听文件选择document.getElementById('excel-file').addEventListener('change', function(e) { const file = e.target.files[0]; if (file) { const fileInfo = document.getElementById('file-info'); fileInfo.innerHTML = ` <strong>文件名:</strong>${file.name}<br> <strong>大小:</strong>${(file.size / 1024).toFixed(2)} KB<br> <strong>类型:</strong>${file.type} `; fileInfo.style.display = 'block'; // 读取文件 const reader = new FileReader(); reader.onload = function(e) { const data = new Uint8Array(e.target.result); workbook = XLSX.read(data, { type: 'array' }); selectedSheetName = workbook.SheetNames[0]; alert('文件读取成功!共有 ' + workbook.SheetNames.length + ' 个工作表。'); }; reader.readAsArrayBuffer(file); }});
function readAsCSV() { if (!workbook || !selectedSheetName) { alert('请先选择Excel文件!'); return; } const sheet = workbook.Sheets[selectedSheetName]; const csv = XLSX.utils.sheet_to_csv(sheet); const output = document.getElementById('csv-output'); output.querySelector('pre').textContent = csv; output.style.display = 'block';}
// 将csv转换成简单的表格,会忽略单元格合并function csv2table(csv) { var html = "<table>"; var rows = csv.split("\n"); rows.pop(); // 最后一行没用的 rows.forEach(function (row, idx) { var columns = row.split(","); columns.unshift(idx + 1); // 添加行索引 if (idx == 0) { // 添加列索引 html += "<tr>"; for (var i = 0; i < columns.length; i++) { html += "<th>" + (i == 0 ? "" : String.fromCharCode(65 + i - 1)) + "</th>"; } html += "</tr>"; } html += "<tr>"; columns.forEach(function (column) { html += "<td>" + column + "</td>"; }); html += "</tr>"; }); html += "</table>"; return html;}
function readAsTxt() { if (!workbook || !selectedSheetName) { alert('请先选择Excel文件!'); return; } const sheet = workbook.Sheets[selectedSheetName]; const txt = XLSX.utils.sheet_to_txt(sheet); const output = document.getElementById('txt-output'); output.querySelector('pre').textContent = txt; output.style.display = 'block';}
function readAsHtml() { if (!workbook || !selectedSheetName) { alert('请先选择Excel文件!'); return; } const sheet = workbook.Sheets[selectedSheetName]; const html = XLSX.utils.sheet_to_html(sheet); const output = document.getElementById('html-output'); output.innerHTML = html; output.style.display = 'block';}
function readAsJson() { if (!workbook || !selectedSheetName) { alert('请先选择Excel文件!'); return; } const sheet = workbook.Sheets[selectedSheetName]; const json = XLSX.utils.sheet_to_json(sheet); const output = document.getElementById('json-output'); output.querySelector('pre').textContent = JSON.stringify(json, null, 2); output.style.display = 'block';}
XLSX.read(data, {type: type});返回一个叫WorkBook的对象,type主要取值如下:binary: BinaryString格式(byte n is data.charCodeAt(n))array: Uint8Array,8位无符号数组;// 读取本地excel文件functionreadWorkbookFromLocalFile(file, callback) { var reader = new FileReader(); reader.onload = function(e) { var data = e.target.result; var workbook = XLSX.read(data, {type: 'binary'}); if(callback) callback(workbook); }; reader.readAsBinaryString(file);}
// 从网络上读取某个excel文件,url必须同域,否则报错function readWorkbookFromRemoteFile(url, callback) {var xhr = new XMLHttpRequest(); xhr.open('get', url, true); xhr.responseType = 'arraybuffer'; xhr.onload = function(e) {if(xhr.status == 200) {var data = new Uint8Array(xhr.response)var workbook = XLSX.read(data, {type: 'array'});if(callback) callback(workbook); } }; xhr.send();}
SheetNames:[ 'sheet1' , 'sheet2' ,......]; Sheet1: { !ref:"A1:D3", A1:{t: 's', v: '姓名', }, B1{ }, ......}Sheet2: { !ref:"A1:D3", A1:{ }, B1{ }, ......}SheetNames里面保存了所有的sheet名字,然后Sheets则保存了每个sheet的具体内容(我们称之为Sheet Object)每一个Sheet Object表示一张表格,只要不是!开头的都表示普通cell,否则,表示一些特殊含义,具体如下:sheet['!ref']:表示所有单元格的范围,例如从A1到F8则记录为A1:F8;sheet[!merges]:存放一些单元格合并信息,是一个数组,每个数组由包含s和e构成的对象组成,s表示开始,e表示结束,r表示行,c表示列;每一个单元格是一个对象(Cell Object),主要有t、v、r、h、w等字段(详见这里):t:表示内容类型,s表示string类型,n表示number类型,b表示boolean类型,d表示date类型,等等// 读取 excel文件function outputWorkbook(workbook) {var sheetNames = workbook.SheetNames; // 工作表名称集合 sheetNames.forEach(name => {var worksheet = workbook.Sheets[name]; // 只能通过工作表名称来获取指定工作表for(var key in worksheet) {// v是读取单元格的原始值console.log(key, key[0] === '!' ? worksheet[key] : worksheet[key].v); } });}
var aoa = [ ['主要信息', null, null, '其它信息'], // 特别注意合并的地方后面预留2个null ['姓名', '性别', '年龄', '注册时间'], ['张三', '男', 18, new Date()], ['李四', '女', 22, new Date()]];var sheet = XLSX.utils.aoa_to_sheet(aoa);sheet['!merges'] = [ // 设置A1-C1的单元格合并 {s: {r: 0, c: 0}, e: {r: 0, c: 2}}];openDownloadDialog(sheet2blob(sheet), '单元格合并示例.xlsx');
注意:被合并的单元格要用null预留出位置,否则后面的内容(本例中是第四列其它信息)会被覆盖