安装或引入

  1. /**
  2. * 在浏览器中,只需添加脚本标记:
  3. * cdn 资源包网址: https://cdnjs.com/libraries/xlsx
  4. */
  5. <script src="https://oss.sheetjs.com/sheetjs/tests/xlsx.full.min.js"></script>
  6. 使用 npm:
  7. $ npm install xlsx
  1. import * as XLSX from 'xlsx';

导出excel

Json/二维数组导出excel

  1. function exportExcel() {
  2. /* 创建一个工作薄 */
  3. let workbook = XLSX.utils.book_new();
  4. /* 使用 XLSX.utils.aoa_to_sheet(data) 创建sheet对象, data 为二位数组 */
  5. const aoaSheet = XLSX.utils.aoa_to_sheet([
  6. ['周一', '周二', '周三', '周四', '周五'],
  7. ['语文', '数学', '历史', '政治', '英语'],
  8. ['数学', '数学', '政治', '英语', '英语'],
  9. ['政治', '英语', '历史', '政治', '数学'],
  10. ]);
  11. /* 使用 XLSX.utils.json_to_sheet(data) 创建sheet对象, data 为json对象 */
  12. const jsonSheet = XLSX.utils.json_to_sheet(
  13. [
  14. { 周一: '语文', 周二: '数学', 周三: '历史', 周四: '政治', 周五: '英语' },
  15. { 周一: '数学', 周二: '数学', 周三: '政治', 周四: '英语', 周五: '英语' },
  16. { 周一: '政治', 周二: '英语', 周三: '历史', 周四: '政治', 周五: '数学' },
  17. ],
  18. {
  19. // 序列化表头
  20. header: ['周五', '周四', '周三', '周二', '周一'],
  21. // 忽略原来的表头
  22. // skipHeader: true,
  23. },
  24. );
  25. /* 使用指定的单元格作为起点插入数据,r:行, c:列,详情看官网文档 */
  26. // XLSX.utils.sheet_add_aoa(
  27. // aoaSheet,
  28. // [
  29. // ['数学', '语文'],
  30. // ['政治', '语文'],
  31. // ['历史', '政治'],
  32. // ],
  33. // { origin: { r: 2, c: 4 } },
  34. // );
  35. /* 设置表格样式,!cols为列宽 */
  36. aoaSheet['!cols'] = [{ wpx: 100 }, { wpx: 100 }, { wpx: 100 }, { wpx: 100 }, { wpx: 100 }];
  37. /* 将sheet 对象添加到工作薄中,支持多个sheetData */
  38. XLSX.utils.book_append_sheet(workbook, aoaSheet, 'aoaSheet');
  39. XLSX.utils.book_append_sheet(workbook, jsonSheet, 'jsonSheet');
  40. /* 生成excel的配置项 */
  41. var options = {
  42. // 要生成的文件类型
  43. bookType: 'xlsx',
  44. // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
  45. bookSST: false,
  46. // 二进制类型
  47. type: 'binary',
  48. };
  49. /* 尝试编写工作簿 wb,在基于浏览器的环境中,它将尝试强制客户端下载*/
  50. XLSX.writeFile(workbook, '课程表.xlsx', options);
  51. }

另一种写法

  1. /* 创建一个工作薄 */
  2. let workbook = { SheetNames: ['Sheet1'], Sheets: {}, Props: {} };
  3. /* 使用 XLSX.utils.aoa_to_sheet(data) 创建sheet对象, data 为二位数组 */
  4. const sheet = XLSX.utils.json_to_sheet([['数学', '语文']]);
  5. /* 合并单元格 */
  6. // data['!merges'] = [
  7. // {
  8. // //合并第一行数据[B1,C1,D1,E1]
  9. // s: {
  10. // //s为开始
  11. // c: 1, //开始列
  12. // r: 0, //开始取值范围
  13. // },
  14. // e: {
  15. // //e结束
  16. // c: 4, //结束列
  17. // r: 0, //结束范围
  18. // },
  19. // },
  20. // ];
  21. /* 将sheet 对象添加到工作薄中,支持多个sheetData */
  22. wb.Sheets['Sheet1'] = sheet;

table表格导出excel

参考标题连接

使用 xlsx 修改样式(文字大小颜色)

  • js-xlsx 只能设置,行宽等简单的颜色, 设置背景色,自动换行等样式(也就是cell.s 这个属性)暂不支持, 他的pro版收费, 但是支持多种样式设置;
  • 设置样式可以使用 xlsx-style,可能是版本问题 xlsx-style 会报错

excel导入解析

excel解析json

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>示例</title>
  6. </head>
  7. <body>
  8. <input id="input" type="file" accept=".xls,.xlsx,.csv" />
  9. <!-- <div id="myBtn">88</div> -->
  10. <script src="https://oss.sheetjs.com/sheetjs/tests/xlsx.full.min.js"></script>
  11. <script>
  12. let inputDom = document.getElementById('input');
  13. inputDom.addEventListener('change', (evt) => {
  14. // 获取 file 文件
  15. var selectedFile = evt.target.files[0];
  16. var reader = new FileReader();
  17. reader.onload = function (event) {
  18. // 数据读取存放
  19. const dataArr = [];
  20. var data = event?.target?.result;
  21. // 将文件转为二进制
  22. var workbook = XLSX.read(data, {
  23. type: 'binary',
  24. });
  25. // 获取工作蒲的工作表名称
  26. workbook.SheetNames.forEach(function (sheetName, index) {
  27. let XL_row_object = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName], {
  28. // 可以指定对象属性值
  29. // header: [
  30. // 'userId',
  31. // 'empId',
  32. // 'userName',
  33. // 'indexCode',
  34. // 'weight',
  35. // 'indexValue',
  36. // 'rowNum',
  37. // ],
  38. });
  39. if (XL_row_object.length > 0) {
  40. console.log(XL_row_object, '有数据啦...');
  41. }
  42. });
  43. inputDom.value = '';
  44. };
  45. reader.onerror = function (event) {
  46. console.error('File could not be read! Code ' + event?.target?.error?.code);
  47. };
  48. // 读取上传文件为二进制
  49. reader.readAsBinaryString(selectedFile);
  50. });
  51. </script>
  52. </body>
  53. </html>

参考文档