支持读写excel文件的模块有不少,可是都各有忧缺点,有些仅支持xls/xlsx的一种格式,有些仅支持读取数据,有些仅支持导出文件,有些须要依赖python解析。常见的npm依赖模块以下:html
js-xlsx: 目前 Github 上 star 数量最多的处理 Excel 的库,支持解析多种格式表格XLSX / XLSM / XLSB / XLS / CSV,解析采用纯js实现,写入须要依赖nodejs或者FileSaver.js实现生成写入Excel,能够生成子表Excel,功能强大,但上手难度稍大。不提供基础设置Excel表格api例单元格宽度,文档有些乱,不适合快速上手; node-xlsx: 基于Node.js解析excel文件数据及生成excel文件,仅支持xlsx格式文件; excel-parser: 基于Node.js解析excel文件数据,支持xls及xlsx格式文件,须要依赖python,过重不太实用; excel-export : 基于Node.js将数据生成导出excel文件,生成文件格式为xlsx,能够设置单元格宽度,API容易上手,没法生成worksheet字表,比较单一,基本功能能够基本知足; node-xlrd: 基于node.js从excel文件中提取数据,仅支持xls格式文件,不支持xlsx,有点过期,经常使用的都是XLSX 格式。
对于Excel文件的内容分析转换,已经有了比较成熟的解决方案:https://github.com/SheetJS/js...node
npm install xlsx
// workbook { SheetNames: ['sheet1', 'sheet2'], Sheets: { // worksheet 'sheet1': { // cell 'A1': { ... }, // cell 'A2': { ... }, ... }, // worksheet 'sheet2': { // cell 'A1': { ... }, // cell 'A2': { ... }, ... } } }
import XLSX from 'xlsx'; const wb = XLSX.readFile('path/to/file.xlsx'); // 返回 workbook workbook 对象结构以下: { SheetNames: ['Sheet1', 'Sheet2'], Sheets: { 'Sheet1': { ... }, 'Sheet2': { ... } }, Props: { ... }, .... }
根据表名获取对应的工做表python
const ws = wb.Sheets[workbook.SheetNames[0]]; // 返回 worksheet worksheet 对象结构以下: { '!ref': 'A1:C7', A1: { ... }, B1: { ... }, .... } // 其中 worksheet['!ref'] 是工做表的有效范围(基于 A-1)。
经过 worksheet[address_of_cell] 获取单元格,也就是经过 A1 标记的键名来获取单元格:git
const cell = wb['C7'];
或者经过地址对象 { r: R, c: C } 来获取单元格,R 和 C 分别表明从 0 开始的行和列的索引。github
// XLSX.utils 中的 encode_cell/decode_cell 方法能够转换单元格地址 const cell = wb[XLSX.utils.encode_cell({ r: 7, c: 2 })]; // 等同于 wb['C7'] cell 对象结构以下: { v: 'C7SKY', w: 'C7SKY', t: 's', .... }
cell.v = '小影志'; delete cell.w;
须要注意的是,内建的导出工具会优先尝试使用 w 的值,因此若是以后要使用导出功能,在修改值时应该同时删除 w 按键或设置为 undefined。npm
js-xlsx 并无提供删除行/删除列的功能,因此须要咱们自行实现:json
function encodeCell(r, c) { return XLSX.utils.encode_cell({ r, c }); } function deleteRow(ws, index) { const range = XLSX.utils.decode_range(ws['!ref']); for (let row = index; row < range.e.r; row++) { for (let col = range.s.c; col <= range.e.c; col++) { ws[encodeCell(row, col)] = ws[encodeCell(row + 1, col)]; } } range.e.r--; ws['!ref'] = XLSX.utils.encode_range(range.s, range.e); } function deleteCol(ws, index) { const range = XLSX.utils.decode_range(ws['!ref']); for (let col = index; col < range.e.c; col++) { for (let row = range.s.r; row <= range.e.r; row++) { ws[encodeCell(row, col)] = ws[encodeCell(row, col + 1)]; } } range.e.c--; ws['!ref'] = XLSX.utils.encode_range(range.s, range.e); }
XLSX.utils 中的 encode_range / decode_range 方法用来转换单元格范围(A2:C7 至关于 {s:{c:0, r:1}, e:{c:2, r:6}})。api
经过 XLSX.writeFile(wb, filename) 就能够生成新的表格文件:app
XLSX.writeFile(wb, 'output.xlsx');
而 XLSX.utils.sheet_to_* 则提供了多种导出格式(csv/txt/html/json/formulae),如下是导出 JSON 文件的代码:工具
const data = XLSX.utils.sheet_to_json(ws); fs.writeFileSync('path/to/export.json', JSON.stringify(data, null, 4));
使用HTML5的FileReader,打开本地文件。
<input type="file" id="excel-file">
var wb;//读取完成的数据 var rABS = false; //是否将文件读取为二进制字符串 function importf(obj) {//导入 if(!obj.files) { return; } var f = obj.files[0]; var reader = new FileReader(); reader.onload = function(e) { var data = e.target.result; if(rABS) { wb = XLSX.read(btoa(fixdata(data)), {//手动转化 type: 'base64' }); } else { wb = XLSX.read(data, { type: 'binary' }); } //wb.SheetNames[0]是获取Sheets中第一个Sheet的名字 //wb.Sheets[Sheet名]获取第一个Sheet的数据 document.getElementById("demo").innerHTML= JSON.stringify( XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]) ); }; if(rABS) { reader.readAsArrayBuffer(f); } else { reader.readAsBinaryString(f); } } function fixdata(data) { //文件流转BinaryString var o = "",l = 0,w = 10240; for(; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w))); o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w))); return o; }
var fs = require('fs'); var xlsx = require('node-xlsx'); var list = xlsx.parse("./excel/" +"1.xlsx"); //读取excel var datas=[]; var data=[1,2,3]; var data1=[4,5,6]; datas.push(data); //一行一行添加的 不是一列一列 datas.push(data1); writeXls(datas); function writeXls(datas) { var buffer = xlsx.build([ { name:'sheet1', data:datas } ]); fs.writeFileSync('test1.xlsx',buffer,{'flag':'w'}); //生成excel }