博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
H5以及Node读取excel
阅读量:6756 次
发布时间:2019-06-26

本文共 5330 字,大约阅读时间需要 17 分钟。

支持读写Excel的node.js模块

支持读写excel文件的模块有很多,但是都各有忧缺点,有些仅支持xls/xlsx的一种格式,有些仅支持读取数据,有些仅支持导出文件,有些需要依赖python解析。常见的npm依赖模块如下:

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 格式。

xlxs

对于Excel文件的内容分析转换,已经有了比较成熟的解决方案:

npm install xlsx
  • workbook 对象,指的是整份 Excel 文档。我们在使用 js-xlsx 读取 Excel 文档之后就会获得 workbook 对象。
  • worksheet 对象,指的是 Excel 文档中的表。我们知道一份 Excel 文档中可以包含很多张表,而每张表对应的就是 worksheet 对象。
  • cell 对象,指的就是 worksheet 中的单元格,一个单元格就是一个 cell 对象。
  • A1 标记,引用单元格时所使用的地址格式(如:A1、C7)
// workbook{ SheetNames: ['sheet1', 'sheet2'], Sheets: { // worksheet 'sheet1': {  // cell  'A1': { ... },  // cell  'A2': { ... },  ... }, // worksheet 'sheet2': {  // cell  'A1': { ... },  // cell  'A2': { ... },  ... } }}

基本用法

  1. 用 XLSX.read 读取获取到的 Excel 数据,返回 workbook
  2. 用 XLSX.readFile 打开 Excel 文件,返回 workbook
  3. 用 workbook.SheetNames 获取表名
  4. 用 workbook.Sheets[xxx] 通过表名获取表格
  5. 用 worksheet[address]操作单元格
  6. 用XLSX.utils.sheet_to_json针对单个表获取表格数据转换为json格式
  7. 用XLSX.writeFile(wb, 'output.xlsx')生成新的 Excel 文件

读取文件

import XLSX from 'xlsx';const wb = XLSX.readFile('path/to/file.xlsx'); // 返回 workbookworkbook 对象结构如下:{    SheetNames: ['Sheet1', 'Sheet2'],    Sheets: {       'Sheet1': { ... },       'Sheet2': { ... }    },    Props: { ... },    ....}

获取工作表

根据表名获取对应的工作表

const ws = wb.Sheets[workbook.SheetNames[0]]; // 返回 worksheetworksheet 对象结构如下:{    '!ref': 'A1:C7',    A1: { ... },    B1: { ... },    ....}// 其中 worksheet['!ref'] 是工作表的有效范围(基于 A-1)。

获取单元格

通过 worksheet[address_of_cell] 获取单元格,也就是通过 A1 标记的键名来获取单元格:

const cell = wb['C7'];

或者通过地址对象 { r: R, c: C } 来获取单元格,R 和 C 分别代表从 0 开始的行和列的索引。

// 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。

删除行/删除列

js-xlsx 并没有提供删除行/删除列的功能,所以需要我们自行实现:

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}})。

保存/导出

通过 XLSX.writeFile(wb, filename) 就可以生成新的表格文件:

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));

H5读取excel

使用HTML5的FileReader,打开本地文件。

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;}

Node读取excel

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}

转载地址:http://ggweo.baihongyu.com/

你可能感兴趣的文章
ROS学习之catkin_make
查看>>
Android中的颜色值RGB对照表表
查看>>
css单位
查看>>
jquery.validate remote BUG
查看>>
一百元的智能家居——Asp.Net Mvc Api+讯飞语音+Android+Arduino
查看>>
C/C++变量命名规则
查看>>
pandas安装及使用
查看>>
Linux SHELL if 命令参数说明
查看>>
Python的构造函数和析构函数,对象和类的变量不一样
查看>>
window常用的『运行』命令
查看>>
3G中的A-GPS移动定位技术
查看>>
java第五章:面向对象(oop)
查看>>
Maze
查看>>
激光炸弹
查看>>
9.23 模拟赛
查看>>
static_cast、dynamic_cast、const_cast和reinterpret_cast总结
查看>>
阶段性放弃 wxPython 前的总结
查看>>
Fegla and the Bed Bugs 二分
查看>>
linux 文本处理
查看>>
swoole重启机制(转载)
查看>>