web前端之解析xlsx文件、使用showOpenFilePicker选择文件、限制文件类型、动态创建html标签、动态添加类名、script标签的type属性、Excel表格转为JSON数据

MENU

  • 前言
  • 效果
  • html
  • JavaScript
  • XLSX包介绍
  • 动态添加类名
  • script标签的type属性


前言

在日常开发中遇到批量导入(新增)的功能,此功能原先是后端收到前端上传的xlsx文件后进行解析再存入数据库。
但是为了节省服务器资源与数据计算,需要前端解析好后传JSON数据给后端存入数据库。
用户上传一个文件大概100~1024K,如果前端直接转成JSON数据可以减少很多数据传输量。


效果

web前端之解析xlsx文件、使用showOpenFilePicker选择文件、限制文件类型、动态创建html标签、动态添加类名、script标签的type属性、Excel表格转为JSON数据_第1张图片


web前端之解析xlsx文件、使用showOpenFilePicker选择文件、限制文件类型、动态创建html标签、动态添加类名、script标签的type属性、Excel表格转为JSON数据_第2张图片


html

方式一引入xlsx包
npm install xlsx下载
yarn add xlsx下载
引入xlsx


方式二引入xlsx包

DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>解析Exceltitle>
    <link rel="stylesheet" href="../style/index.css">
head>

<body class="h_100vh d_f fd_c jc_c ai_c">
    <div class="d_f fd_c jc_c ai_c">
        <button class="fs_32" onclick="handleFlex()">选择并解析xlsx文件button>
        <div id="idTable" class="mt_20">div>
    div>
    
    <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js">script>
    <script src="./index.js">script>
body>

html>

JavaScript

/**
 * 选择文件并解析为JSON
 */
async function handleFlex() {
    let fileHandle = await window.showOpenFilePicker(),
        file = await fileHandle[0].getFile(),
        isFile = !/\.(xls|xlsx)$/.test(file.name.toLowerCase());

    if (isFile) return proxy.$modal.msgWarning("请请上传xls或xlsx格式的文件");

    let reader = new FileReader();

    reader.onload = (e) => {
        // binary(二进制)
        // array(数组)
        const workBook = XLSX.read(e.target.result, { type: "binary" });
        // 第二个参数中的range表示从第几行开始读取数据
        const ws = XLSX.utils.sheet_to_json(
            workBook.Sheets[workBook.SheetNames[0]]
        );

        handleTemplate(ws);
    };

    reader.readAsBinaryString(file);
}

/**
 * 拼接数据为数组对象
 * @param {Array} arr 
 */
function handleTemplate(arr) {
    let temp = {
        姓名: "name",
        性别: "sex",
        年龄: "age"
    },
        list = [];

    arr.forEach((item) => {
        let obj = {};

        for (const key in temp) {
            if (Object.hasOwnProperty.call(temp, key)) {
                obj[temp[key]] = item[key];
            }
        }

        list.push({ ...obj });
    });

    handleCreateElement(list);
}

/**
 * 创建元素
 * @param {Array} arr 
 */
function handleCreateElement(arr) {
    let table = document.createElement('table'),
        thead = `姓名性别年龄`;

    tbody = document.createElement('tbody');
    table.classList.add('bc_c', 'fs_68');

    arr.forEach(item => {
        let row = document.createElement('tr');

        for (const key in item) {
            if (Object.hasOwnProperty.call(item, key)) {
                let cell = document.createElement('td');
                cell.classList.add('pl_6', 'pr_6', 'b_1s_696969');

                let cellText = document.createTextNode(item[key]);

                cell.appendChild(cellText);
                row.appendChild(cell);

            }
        }

        tbody.appendChild(row);
    });

    table.innerHTML = thead;
    table.appendChild(tbody);

    idTable.appendChild(table);
}

XLSX包介绍

1、XLSX.utils.sheet_to_json(worksheet, { range: 2 });表示从Excel的第二行开始解析。
2、… …


动态添加类名

className属性

添加类名
多个类名用空格隔开
el.className = "p_8 mt_20 ... ...";


移除类名
等于一个空字符串即可删除类名
el.className = "";


classList属性

添加一个类名
el.classList.add("d_f");


添加多个类名
el.classList..add("w_68", "h_86", "color_696969", ... ...);


移除一个类名
el.classList.remove("w_68");


移除多个类名
el.classList.remove("p_8", "m_8", "d_f", ... ...);


script标签的type属性

你可能感兴趣的:(JavaScript,web前端,html,javascript,前端,web前端,html,开发语言)