js-xlsx实现excel读取&导出
- 2026-11-06 09:24:04
js-xlsx实现excel读取&导出导出Excel aoa_to_sheet(二维数组) json_to_sheet(JSON数据) table_to_sheet(html) csv2sheet 下载blob都比较熟悉了 读取Excel sheet_to_csv(csv) csv2table sheet_to_txt(文本) sheet_to_html sheet_to_json 知识补充 XLSX.read(data, {type: type}); 返回一个叫WorkBook的对象,type主要取值如下: base64: 以base64方式读取; binary: BinaryString格式(byte n is data.charCodeAt(n)) string: UTF8编码的字符串; buffer: nodejs Buffer; array: Uint8Array,8位无符号数组; file: 文件的路径(仅nodejs下支持); 读取本地文件 读取网络文件 WorkBook对象 SheetNames:[ 'sheet1' , 'sheet2' ,......]; Sheets: 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类型,等等 v:表示原始值; f:表示公式,如B2+B3; h:HTML内容 w:格式化后的内容 r:富文本内容rich text 读取workbook 处理单元格合并 注意:被合并的单元格要用null预留出位置,否则后面的内容(本例中是第四列其它信息)会被覆盖
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 = {}; // 将要生成的sheetcsv = 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"});// 字符串转ArrayBufferfunction 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';}
// 读取本地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();}

// 读取 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');
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。