vue+elementUI+XLSX.utils.sheet_to_json实现复杂表头的导入功能

导入表excel

在这里插入图片描述

问题

XLSX.utils.sheet_to_json方法不带参数的调用,无法解析我们的复杂表头的excel表格,因此,我们需要通过传参数,来指定表头的真实起始位置。

关键代码分析:XLSX.utils.sheet_to_json

XLSX.utils.sheet_to_json(data, type)有两个参数,第一个是我们wordBook对象里面Sheets对象对应的数据,第二个参数配置如下:

  • raw: 使用原始值 (true) 或格式化字符串 (false) (默认值:true)
  • dateNF: 在字符串输出中使用指定的日期格式(默认值:FMT 14)
  • defval: 使用指定值代替 null 或 undefined ()
  • blankrows: 在输出中包含空行**(默认值:** )
  • range:
    - (number)使用工作表范围,但将起始行设置为值
    - (String)使用指定范围(A1 样式的有界范围字符串
    - (default)使用工作表范围 ( worksheet[‘!ref’])
  • header:
    - 1: 生成数组数组(“二维数组”)
    - “A”.行对象键是文字列标签
    - array of strings: 使用指定的字符串作为行对象中的键
    - (default): 将第一行作为键读取并消除歧义
核心代码:
```javascript
// 模板代码
<el-upload
            action="/fileUploadApi"
            style="float:inline-end;margin-bottom: 5px;margin-right: 1%;"
            :on-change="readExcel"
            :auto-upload="false"
            :show-file-list="false"
            accept=".xlsx"
            ref="upload"
            :multiple="true"
            >
<el-button type="primary" size="mini">导入文件</el-button>
// 引用
import FileSaver from "file-saver";
import * as XLSX from "xlsx";

// 读取解析表格数据
 readExcel(file, fileList) {
 			fileList
            if (!file) {
                return false;
            } else if (!/.(xls|xlsx)$/.test(file.name.toLowerCase())) {
                this.$message.error("上传格式不正确,请上传xls或者xlsx格式");
                return false;
            }
            const fileReader = new FileReader();
            fileReader.onload = (ev) => {
                try {
                    const data = ev.target.result;
                    const workbook = XLSX.read(data, {
                        type: "binary",
                    });
                    if (workbook.SheetNames.length >= 1) {
                        this.$message({
                        message: "导入数据表格成功",
                        showClose: true,
                        type: "success",
                        });
                    }
                    const wsname = workbook.SheetNames[0]; //取第一张表
                    console.log(workbook.Sheets[wsname])
                    const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname], {range:1,header:1,defval:''}); //生成json表格内容
                    console.log("生成json:", ws);
                } catch (e) {
                    console.log(e);
                return false;
                }
            };
            // 如果为原生 input 则应是 files[0]
            fileReader.readAsBinaryString(file.raw);
        }, 

结果

在这里插入图片描述
通过生成如上的数组,我们再进行二次处理,即可渲染出我们想要的复杂表格。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用 `xlsx` 库和 `file-saver` 库来导出 xlsx 表格。具体步骤如下: 1. 安装 `xlsx` 和 `file-saver` 库 ``` npm install xlsx file-saver --save ``` 2. 在组件中引入 `xlsx` 和 `file-saver` 库 ```typescript import * as XLSX from 'xlsx'; import { saveAs } from 'file-saver'; ``` 3. 定义表格数据和表头 ```typescript const data = [ { name: 'John', age: 25, gender: 'male' }, { name: 'Mary', age: 30, gender: 'female' }, { name: 'Tom', age: 35, gender: 'male' }, ]; const header = ['Name', 'Age', 'Gender']; ``` 4. 定义导出函数 ```typescript export const exportExcel = () => { // 创建工作簿 const workbook = XLSX.utils.book_new(); // 创建工作表 const worksheet = XLSX.utils.json_to_sheet(data); // 设置表头 const headerRange = XLSX.utils.decode_range(worksheet['!ref']); headerRange.s.r = 1; XLSX.utils.sheet_set_range_style(worksheet, XLSX.utils.encode_range(headerRange), { font: { bold: true }, fill: { fgColor: { rgb: 'cccccc' } }, }); XLSX.utils.sheet_add_aoa(worksheet, [header], { origin: 'A1' }); // 设置表格宽度 const colWidth = header.map((item) => ({ wch: item.length + 5, })); worksheet['!cols'] = colWidth; // 添加工作表到工作簿 XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); // 导出表格 const buffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); const blob = new Blob([buffer], { type: 'application/octet-stream' }); saveAs(blob, 'example.xlsx'); }; ``` 5. 在组件中调用导出函数 ```html <template> <button @click="exportExcel">导出表格</button> </template> <script lang="ts"> import * as XLSX from 'xlsx'; import { saveAs } from 'file-saver'; const data = [ { name: 'John', age: 25, gender: 'male' }, { name: 'Mary', age: 30, gender: 'female' }, { name: 'Tom', age: 35, gender: 'male' }, ]; const header = ['Name', 'Age', 'Gender']; export default { methods: { exportExcel() { const workbook = XLSX.utils.book_new(); const worksheet = XLSX.utils.json_to_sheet(data); const headerRange = XLSX.utils.decode_range(worksheet['!ref']); headerRange.s.r = 1; XLSX.utils.sheet_set_range_style(worksheet, XLSX.utils.encode_range(headerRange), { font: { bold: true }, fill: { fgColor: { rgb: 'cccccc' } }, }); XLSX.utils.sheet_add_aoa(worksheet, [header], { origin: 'A1' }); const colWidth = header.map((item) => ({ wch: item.length + 5, })); worksheet['!cols'] = colWidth; XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); const buffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); const blob = new Blob([buffer], { type: 'application/octet-stream' }); saveAs(blob, 'example.xlsx'); }, }, }; </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值