js-xlsx 使用总结 实现前端解析excel

背景

解析excel数据,前端或后端都可实现,考虑到当前需求为 导入并且预览表格数据,用户可对数据进行修改,最终提交的为用户修改后的数据,所以采用前端解析的方式更为合理。

依赖项

1、js-xlsx库:解析excel、写excel

github:https://github.com/SheetJS/sheetjs

2、react + ag-grid

步骤

默认已经搭建好了react脚手架,且支持ag-grid表格

1、安装xlsx
npm install xlsx
2、读取文件生成workbook
functionexplanation
XLSX.read(data, read_opts)attempts to parse data
XLSX.readFile(filename, read_opts)attempts to read filename and parse.
const { result } = event.target;
//  the entire excel spreadsheet object is read as a binary stream
const workbook = XLSX.read(result, { type: 'binary', cellDates: true });

workbook对象:

主要用到的有

  1. SheetNames:所有的sheet名的数组
  2. Sheets:所有的sheet内容的数组,是Sheet对象,需要在下一步解析
  3. Workbook.Sheets[index].Hidden,sheet是否隐藏
    workbook对象
    parsing Options(常用config):
Option NameDefaultDescription
typeInput data encoding,见第7步
cellDatesfasleStore dates as type d (default is n)
sheetsIf specified, only parse specified sheets
3、解析worksheet
functionexplanation
XLSX.utils.sheet_to_csv(sheet, config)generates CSV
XLSX.utils.sheet_to_txt(sheet, config)generates UTF16 Formatted Text
XLSX.utils.sheet_to_html(sheet, config)generates HTML
XLSX.utils.sheet_to_json(sheet, config)generates an array of objects
XLSX.utils.sheet_to_formulae(sheet, config)generates a list of formulae

使用 XLSX.utils.sheet_to_json将每一个sheet解析成对象,然后使用数据展示成表格或做其他处理

const { Sheets: sheets } = workbook;
let parseData = Object.keys(sheets).reduce((finalData, sheetName) => {
    let sheetData = XLSX.utils.sheet_to_json(sheets[sheetName]);
    finalData.push({ sheetName, sheetData })
    return finalData;
}, []);

主要备注sheet_to_json的config(其他配置见github Utility Functions):

Option NameDefaultDescription
rawtrueUse raw values (true) or formatted strings (false)
range(范围内取值)from WSOverride Range (see table below)
header(范围内取值)Control output format (see table below)
dateNFFMT 14Use specified date format in string output
defvalUse specified value in place of null or undefined
blankrows**Include blank lines in the output **

header is expected to be one of:

headerDescription
1Generate an array of arrays (“2D Array”)
"A"Row object keys are literal column labels
array of stringsUse specified strings as keys in row objects
(default)Read and disambiguate first row as keys

When header is not specified, the conversion will automatically disambiguate header entries by affixing _ and a count starting at 1. For example, if three columns have header foo the output fields are foo, foo_1, foo_2

> XLSX.utils.sheet_to_json(ws);
[ { S: 1, h: 2, e: 3, e_1: 4, t: 5, J: 6, S_1: 7 },
  { S: 2, h: 3, e: 4, e_1: 5, t: 6, J: 7, S_1: 8 } ]

> XLSX.utils.sheet_to_json(ws, {header:"A"});
[ { A: 'S', B: 'h', C: 'e', D: 'e', E: 't', F: 'J', G: 'S' },
  { A: '1', B: '2', C: '3', D: '4', E: '5', F: '6', G: '7' },
  { A: '2', B: '3', C: '4', D: '5', E: '6', F: '7', G: '8' } ]

> XLSX.utils.sheet_to_json(ws, {header:["A","E","I","O","U","6","9"]});
[ { '6': 'J', '9': 'S', A: 'S', E: 'h', I: 'e', O: 'e', U: 't' },
  { '6': '6', '9': '7', A: '1', E: '2', I: '3', O: '4', U: '5' },
  { '6': '7', '9': '8', A: '2', E: '3', I: '4', O: '5', U: '6' } ]

> XLSX.utils.sheet_to_json(ws, {header:1});
[ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ],
  [ '1', '2', '3', '4', '5', '6', '7' ],
  [ '2', '3', '4', '5', '6', '7', '8' ] ]
4、处理数据到worksheet
functionexplanation
XLSX.utils.aoa_to_sheet(data, config)converts an array of arrays of JS data to a worksheet.
XLSX.utils.json_to_sheet(data, config)converts an array of JS objects to a worksheet.
XLSX.utils.table_to_sheet(data, config)converts a DOM TABLE element to a worksheet.
XLSX.utils.sheet_add_aoa(data, config)adds an array of arrays of JS data to an existing worksheet.
XLSX.utils.sheet_add_json(data, config)adds an array of JS objects to an existing worksheet.

主要备注json_to_sheet的config配置(其他配置见github Utility Functions):

Option NameDefaultDescription
headerUse specified column order (default Object.keys)
dateNFFMT 14Use specified date format in string output
cellDatesfalseStore dates as type d (default is n)
skipHeaderfalseIf true, do not include header row in output
ar ws = XLSX.utils.json_to_sheet([
  { A:"S", B:"h", C:"e", D:"e", E:"t", F:"J", G:"S" },
  { A: 1,  B: 2,  C: 3,  D: 4,  E: 5,  F: 6,  G: 7  },
  { A: 2,  B: 3,  C: 4,  D: 5,  E: 6,  F: 7,  G: 8  }
], {header:["A","B","C","D","E","F","G"], skipHeader:true});
5、处理worksheet到workbook
functionexplanation
XLSX.utils.book_append_sheet(wb, ws, ws_name)Add the worksheet to an existing workbook
XLSX.utils.book_new()Creating a new workbook from scratch
6、写入excel文件
functionexplanation
XLSX.write(wb, write_opts)attempts to write the workbook wb
XLSX.writeFile(wb, filename, write_opts)attempts to write wb to filename. In browser-based environments, it will attempt to force a client-side download
XLSX.writeFileAsync(filename, wb, o, cb)attempts to write wb to filename. If o is omitted, the writer will use the third argument as the callback.

writing Options(常用config):

Option NameDefaultDescription
typeOutput data encoding,见第7步
cellDatesfasleStore dates as type d (default is n)
sheetsName of Worksheet for single-sheet formats
7、各种type

read 和 write时type-读取类型:

typeexpected input
"base64"string: Base64 encoding of the file
"binary"string: binary string (byte n is data.charCodeAt(n))
"string"string: JS string (characters interpreted as UTF8)
"buffer"nodejs Buffer
"array"array: array of 8-bit unsigned int (byte n is data[n])
"file"string: path of file that will be read (nodejs only)

单元格 原始值存在value中,类型存在type中,所以使解析或者写入时,可以设置类型:

TypeDescription
bBoolean: value interpreted as JS boolean
eError: value is a numeric code and w property stores common name **
nNumber: value is a JS number **
dDate: value is a JS Date object or string to be parsed as Date **
sText: value interpreted as JS string and written as text **
zStub: blank stub cell that is ignored by data processing utilities **
8、常见问题

1、xlsx解析文件日期比实际少一天

解决办法:读取文件时,添加cellDates: true,使日期类cell读取后是date格式,在输出前,将所有date格式的cell统一加一天转为string

// excel中设置了日期格式的列,统一加1天,并格式化为'YYYY-MM-DD'字符串,便于统一处理
row[item] = moment(row[item]).add(1, 'days').format('YYYY-MM-DD');

2、若日期修改后,变成时间戳,导出时需转换

日期、下拉框类cell编辑,ag表格配置valueParser属性无效,所以使用valueGetter + valueSetter

{
    headerName: '日期格式',
    field: 'date',
    type: ['date', 'dateEditor'],
    valueGetter: function (params) {
        return params.data.date;
    },
    valueSetter: (params) => {
        const { newValue, oldValue } = params;
        let valueChanged = oldValue !== newValue;
        if (valueChanged) {
            params.data.date = convertToDateString(newValue);
        }
        return valueChanged;
    },                 
},

3、只需要读取未隐藏的工作表

XLSX.read读取得到的对象是wb

wb.Workbook.Sheets[index].Hidden // Hidden为0代表未隐藏,Hidden为1代表隐藏

参考

https://www.codestudyblog.com/sfb20react1/0306015318.html

  • 17
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个利用 js-xlsx 实现 Excel 文件导入导出功能的示例: 首先在 HTML 文件中引入 js-xlsx 库: ```html <script src="https://cdn.jsdelivr.net/npm/xlsx/dist/xlsx.full.min.js"></script> ``` 然后在 JavaScript 文件中编写以下代码: ```javascript // 导出 Excel 文件 function exportExcel(data, filename) { const ws = XLSX.utils.json_to_sheet(data); const wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, 'Sheet1'); XLSX.writeFile(wb, `${filename}.xlsx`); } // 导入 Excel 文件 function importExcel(file, callback) { const reader = new FileReader(); reader.readAsArrayBuffer(file); reader.onload = (e) => { const data = new Uint8Array(e.target.result); const workbook = XLSX.read(data, { type: 'array' }); const sheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[sheetName]; const result = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); callback(result); }; } ``` 其中,exportExcel 函数用于将数据导出为 Excel 文件,参数 data 为要导出的数据,filename 为导出的文件名。 importExcel 函数用于导入 Excel 文件,参数 file 为要导入的文件,callback 为导入成功后的回调函数,回调函数的参数 result 为导入的数据。 示例代码中使用了 FileReader 对象读取文件内容,然后使用 js-xlsx解析 Excel 文件并将数据转化为 JSON 格式。 使用示例: ```javascript const data = [ { name: '张三', age: 20, gender: '男' }, { name: '李四', age: 22, gender: '女' }, { name: '王五', age: 25, gender: '男' }, ]; exportExcel(data, 'test'); // 导出 Excel 文件,文件名为 test.xlsx const inputElement = document.getElementById('input-file'); inputElement.addEventListener('change', (e) => { const file = e.target.files[0]; importExcel(file, (result) => { console.log(result); // 输出导入的数据 }); }); ``` 在 HTML 文件中添加一个文件选择框: ```html <input type="file" id="input-file"> ``` 用户选择一个 Excel 文件后,调用 importExcel 函数导入数据,并在回调函数中处理导入的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值