关于下载上传的sheetjs

一、背景

需要讲后端返回来的表格数据通过前端设置导出其中某些字段,而且得是xlsx格式的。

那就考虑使用控件SheetJS。如果是几年前,一般来说,保存excel的文件都是后端去处理,处理完成给前端一个接口,前端调用了打开就可以下载到该表格了。但是,因为PC电脑的硬件处理数据的能力越来越好,前端也具备了处理一些大数据的能力。那么处理大数据就需要把相关的情况考虑完全的控件,SheetJS就是这样的一个工具。

二、官网

API Reference | SheetJS Community Edition

三、常用的API

*    XLSX.utils.aoa_to_sheet:数组转换为worksheet
*    XLSX.utils.json_to_sheet:json对象转换为worksheet
*    XLSX.utils.table_to_sheet:表格转换为worksheet

四、两大对象

workbook对象与worksheet对象

可以理解成,workbook对象是整个表格的内容,而worksheet可以理解成表格的数据内容。

直观点看: 

fileInput.addEventListener("change", (event) => {

     handleFileUpload(event.target.files[0]);

 });
// 文件上传函数
        function handleFileUpload(file) {
            const reader = new FileReader();
            reader.readAsArrayBuffer(file);

            
            // 定义一个加载完成的回调,在 FileReader 完成文件读取操作后被调用。
            reader.onload = (event) => {
                const data = new Uint8Array(event.target.result);
                const workbook = XLSX.read(data, { type: "array" });
                console.log('workbook', workbook)
                // 获取工作表名数组
                const sheetNameArray = workbook.SheetNames;
                // 获取第一个工作表
                const firstSheet = workbook.Sheets[sheetNameArray[0]];
                // 将工作表转换为二维数组
                const sheetDataArray = XLSX.utils.sheet_to_json(firstSheet, {
                    // defval: "" // 配置这个得到对象数组的格式
                    header: 1 // 得到二维数组
                });
                // 调用渲染 Excel 的函数
                renderTable(sheetDataArray);
            };
        }

打印的workbook如下:

显然,多个表,它也能够把它的数据抓出来。

五、上传相关

//读取(本地或网络)文件,并创建一个工作薄
let workbook = XLSX.read(data, opts);
//创建一个新的工作簿
let workbook = XLSX.utils.book_new();
//通过抓取页面中的 HTML TABLE 创建工作表
let workbook = XLSX.utils.table_to_book(dom_element, opts);

//将Array<Object>生成为sheet,其中包含基于对象键自动生成的“标题”。
//header 标题使用指定的字段顺序(默认 Object.keys)
//skipHeader 如果为true,则不会在输出中包含标题行
let worksheet = XLSX.utils.json_to_sheet(Array<Object>, {header, skipHeader: false});
//将Array<Array>生成为sheet
let worksheet = XLSX.utils.aoa_to_sheet(Array<Array>);
//接受一个表 DOM 元素并返回一个类似于输入表的工作薄	
let worksheet = XLSX.utils.table_to_sheet(DOM)

//更新sheet,在对应位置进行覆盖
XLSX.utils.sheet_add_json(worksheet, Array<Object>, {header,skipHeader: true, origin: "A2"});
XLSX.utils.sheet_add_aoa(worksheet, Array<Array>, { origin: "A1" });
XLSX.utils.sheet_add_dom(worksheet, DOM, { origin: -1 });

//将sheet工作表添加到该工作薄中
XLSX.utils.book_append_sheet(workbook, worksheet, "sheet名称");

伪代码(开发过程根据自己的业务进行):

function excelImport(vv) {
        const eleInput = document.createElement('input');
        eleInput.type = 'file';
        eleInput.style.display = 'block';
        eleInput.onchange = function (e) {
            const file = e.target.files[0];
            let name = file.name
            let suffix = name.substr(name.lastIndexOf("."));
            let reader = new FileReader()
            reader.onload = async (event) => {
                try {
                    // 判断文件类型是否正确
                    if (".xls" != suffix && ".xlsx" != suffix) {
                        cb.utils.alert("选择Excel格式的文件导入!");
                        return false;
                    }
                    let { result } = event.target;
                    // 读取文件
                    let workbook = XLSX.read(result, { type: 'binary' });
                    let data = [];
                    // 循环文件中的每个表
                    let reg = /[\u4e00-\u9fa5|(|)|_$]/g;
                    for (let sheet in workbook.Sheets) {
                        if (workbook.Sheets.hasOwnProperty(sheet)) {
                            let str = XLSX.utils.sheet_to_json(workbook.Sheets[sheet])
                            sheet = sheet.replace(reg, "")
                            // 将获取到表中的数据转化为json格式
                            data = data.concat(str)
                        }
                    }
                    let source = data.splice(3, data.length);
                    insertExcellData(vv, source); //该方法是处理数据的详细方式,根据业务需要来处理。
                } catch (e) {
                    cb.utils.alert("文件类型不正确!");
                }
            }
            reader.readAsBinaryString(file);
            document.body.removeChild(eleInput);
        }
        document.body.appendChild(eleInput);
        eleInput.dispatchEvent(new MouseEvent('click'))
    }

也可以试试直接cdn引入的方式:

<html lang="zh-CN">

<head>
    <meta charset="utf-8">
    </meta>
</head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.4/xlsx.full.min.js"></script>

<body>
    <!-- 用于点击上传文件的输入字段 -->
    <input type="file" id="fileInput" style="display: none" accept=".xls,.xlsx" required />
    <label for="fileInput" class="label">点击上传文件</label>

    <!-- 用于拖放文件上传的输入字段 -->
    <div id="dropArea">
        <p>拖拽文件至此处</p>
    </div>

    <!-- 用于显示解析后的数据表 -->
    <div id="table-container" style="margin-top: 20px"></div>
    <script>
        const fileInput = document.getElementById("fileInput");
        const dropArea = document.getElementById("dropArea");

        fileInput.addEventListener("change", (event) => {
            handleFileUpload(event.target.files[0]);
        });

        dropArea.addEventListener("drop", (e) => {
            e.preventDefault();
            dropArea.style.border = "2px dashed #ccc";
            const droppedFiles = e.dataTransfer.files;
            handleFileUpload(droppedFiles[0]);
        });

        // 文件上传函数
        function handleFileUpload(file) {
            const reader = new FileReader();
            console.log('file', file)
            reader.readAsArrayBuffer(file);

            
            // 定义一个加载完成的回调,在 FileReader 完成文件读取操作后被调用。
            reader.onload = (event) => {
                console.log('event', event)
                const data = new Uint8Array(event.target.result);
                const workbook = XLSX.read(data, { type: "array" });
                console.log('workbook', workbook)
                // 获取工作表名数组
                const sheetNameArray = workbook.SheetNames;
                // 获取第一个工作表
                const firstSheet = workbook.Sheets[sheetNameArray[0]];
                // 将工作表转换为二维数组
                const sheetDataArray = XLSX.utils.sheet_to_json(firstSheet, {
                    // defval: "" // 配置这个得到对象数组的格式
                    header: 1 // 得到二维数组
                });
                // 调用渲染 Excel 的函数
                renderTable(sheetDataArray);
            };
        }

        // 将数据渲染为一个表格
        function renderTable(sheetDataArray) {
            const table = document.createElement("table");
            table.classList.add("table", "table-striped");

            sheetDataArray.forEach((row) => {
                const tableRow = document.createElement("tr");

                row.forEach((cell) => {
                    const tableCell = document.createElement("td");
                    tableCell.textContent = cell;
                    tableRow.appendChild(tableCell);
                });

                table.appendChild(tableRow);
            });

            // 添加数据表到表格容器
            const tableContainer = document.getElementById("table-container");
            tableContainer.innerHTML = "";
            tableContainer.appendChild(table);
        }

        // 为拖放添加事件监听器
        dropArea.addEventListener("dragover", (e) => {
            e.preventDefault();
            dropArea.style.border = "2px dashed #333";
        });

        dropArea.addEventListener("dragleave", () => {
            dropArea.style.border = "2px dashed #ccc";
        });


    </script>
</body>

</html>

六、下载相关

最重要的代码片段如下:

//数据

                let sheet=XLSX.utils.json_to_sheet(arr),
                book=XLSX.utils.book_new();
                XLSX.utils.book_append_sheet(book,sheet,"sheet1");
                // user开头加时间戳的文件名,可以修改成其它名字
                XLSX.writeFile(book,`列表.xls`);

伪代码如下:

<div onclick="clickfn()">点击这里</div>
function clickfn() {
            let arr = [
                {
                    '序号': 1,
                    '名字': '张三',
                    '员工号码': '789'
                }
            ]
            let sheet=XLSX.utils.json_to_sheet(arr), //arr 数据需要业务上给与
               book=XLSX.utils.book_new();
               XLSX.utils.book_append_sheet(book,sheet,"sheet1");
               // user开头加时间戳的文件名,可以修改成其它名字
               XLSX.writeFile(book,`列表.xls`);
        }


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/585824.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQLite的扩展函数Carray()表值函数(三十八)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite如何处理CSV 虚拟表 下一篇&#xff1a;SQLite—系列文章目录 ​ 1. 概述 Carray()是一个具有单列的表值函数(名为 “value”)和零行或多行。 carray() 中每一行的“值”取自 C 语言数组 由应用程序通过参数绑定提…

如何进行面向对象分析、面向对象设计和面向对象编程

目录 1.引言 2.案例介绍和难点剖析 3.如何进行面向对象分析 4.如何进行面向对象设计 5.如何进行面向对象编程 6.总结 1.引言 面向对象分析(OOA)、面向对象设计(00D)和面向对象编程(OOP)是面向对象开发的3个主要环节。 在以往的工作中&#xff0c;作者发现&#xff0c;很多…

JavaScript原型链深度剖析

目录 前言 一、原型链 1.原型链的主要组成 原型&#xff08;Prototype&#xff09; 构造函数&#xff08;Constructor&#xff09; 实例&#xff08;Instance&#xff09; 2.原型链的工作原理 前言 在JavaScript的世界中&#xff0c;原型链&#xff08;Prototype Chain&…

Amazon云计算AWS之[4]非关系型数据库服务SimpleDB和DynamoDB

文章目录 简介非关系型VS关系数据库SimpleDB域条目属性值SimpleDB的使用 DynamoDBSimpleDB VS DynamoDB 简介 非关系型数据库服务主要用于存储结构化的数据&#xff0c;并为这些数据提供查找、删除等基本的数据库功能。AWS中提供的非关系型数据库主要包括SimpleDB和DynamoDB …

聚醚醚酮(Polyether Ether Ketone)PEEK在粘接使用时可以使用UV胶水吗?要注意哪些事项?

一般情况下&#xff0c;聚醚醚酮&#xff08;Polyether Ether Ketone&#xff0c;PEEK&#xff09;是一种难以黏附的高性能工程塑料&#xff0c;而UV胶水通常不是与PEEK进行粘接的首选方法。PEEK表面的化学性质和高温性能使得它对常规胶水的附着性较低。然而&#xff0c;有一些…

(成品论文22页)24深圳杯数学建模A题1-4问完整代码+参考论文重磅更新!!!!

论文如下&#xff1a; 基于三球定位的多个火箭残骸的准确定位 针对问题一&#xff1a;为了进行单个残骸的精确定位&#xff0c;确定单个火箭残骸发生音爆 时的精确位置和时间&#xff0c;本文基于三球定位模型&#xff0c;考虑到解的存在性和唯一性&#xff0c; 选取了四个监测…

用HTML5实现播放gif文件

用HTML5实现播放gif文件 在HTML5中&#xff0c;你可以使用<img>标签来播放GIF文件。GIF文件本质上是一种图像格式&#xff0c;它支持动画效果&#xff0c;因此当在网页上加载时&#xff0c;它会自动播放动画。先看一个简单的示例&#xff1a; <!DOCTYPE html> &l…

清华同方电脑文件删除怎么恢复

在日常使用清华同方电脑的过程中&#xff0c;我们难免会遇到误删重要文件的情况。文件丢失不仅可能导致数据损失&#xff0c;还可能影响到我们的工作、学习甚至是生活。那么&#xff0c;当在清华同方电脑上删除了重要文件后&#xff0c;我们应该如何恢复呢&#xff1f;本文将为…

Linux服务器安全基础 - 查看入侵痕迹

1. 常见系统日志 /var/log/cron 记录了系统定时任务相关的日志 /var/log/dmesg 记录了系统在开机时内核自检的信息&#xff0c;也可以使用dmesg命令直接查看内核自检信息 /var/log/secure:记录登录系统存取数据的文件;例如:pop3,ssh,telnet,ftp等都会记录在此. /var/log/btmp:记…

服务器被攻击,为什么后台任务管理器无法打开?

在服务器遭受DDoS攻击后&#xff0c;当后台任务管理器由于系统资源耗尽无法打开时&#xff0c;管理员需要依赖间接手段来进行攻击类型的判断和解决措施的实施。由于涉及真实代码可能涉及到敏感操作&#xff0c;这里将以概念性伪代码和示例指令的方式来说明。 判断攻击类型 步…

C#---使用Coravel实现定时任务

Coravel是一款框架轻&#xff0c;使用简单&#xff0c;支持秒级定时任务。 1.添加NuGet引用 2.定义自己的工作任务 using Coravel.Invocable; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Thread…

【Java笔记】JVM:对象在内存中是什么样的?如何计算对象占用的内存大小?

文章目录 Java对象的内存布局计算对象占用的内存大小Openjdk jol来算几个Object o new Object() 该对象在内存中占用多少字节&#xff1f;基本数据类型作为成员变量的对象有实例对象作为成员变量的对象 Java对象的内存布局 Java中&#xff0c;一个实例对象在内存中的组成主要包…

国家开放大学2024年春《Matlab语言及其应用》实验五Simulink系统 建模与仿真参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 实验报告 姓名&#xff1a; 学号&#xff1a; 实验五名称…

【JAVA进阶篇教学】第九篇:MyBatis-Plus用法介绍

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第九篇&#xff1a;MyBatis-Plus用法介绍。 在 MyBatis-Plus 3.5.0 中&#xff0c;LambdaQueryWrapper支持多种条件构造方式&#xff0c;除了等于&#xff08;eq&#xff09;、不等于&#xff08;ne&#xff09;、大于&a…

大模型公开课-大模型的语言解码游戏学习总结

在当今快速发展的人工智能领域&#xff0c;深度学习作为其中的一项关键技术&#xff0c;正引领着科技的新潮流。而对于初学者来说&#xff0c;了解大型语言模型的解码游戏&#xff0c;对于理解深度学习的基本概念至关重要。本篇博客将对一次关于大型语言模型解码游戏的视频教学…

SQL如何利用Bitmap思想优化array_contains()函数

目录 0 问题描述 1 位图思想 2 案例实战 3 小结 0 问题描述 在工作中&#xff0c;我们往往使用array_contains()函数来进行存在性问题分析&#xff0c;如判断某个数是否在某个数组中&#xff0c;但是当表数据量过多&#xff0c;存在大量array_contains()函数时&#xff0c;…

ollama-python-Python快速部署Llama 3等大型语言模型最简单方法

ollama介绍 在本地启动并运行大型语言模型。运行Llama 3、Phi 3、Mistral、Gemma和其他型号。 Llama 3 Meta Llama 3 是 Meta Inc. 开发的一系列最先进的模型&#xff0c;提供8B和70B参数大小&#xff08;预训练或指令调整&#xff09;。 Llama 3 指令调整模型针对对话/聊天用…

案例分享:使用RabbitMQ消息队列和Redis缓存优化Spring Boot秒杀功能

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c…

神经网络与深度学习(四)--自然语言处理NLP

这里写目录标题 1.序列模型2.数据预处理2.1特征编码2.2文本处理 3.文本预处理与词嵌入3.1文本预处理3.2文本嵌入 3.RNN模型3.1RNN概要3.2RNN误差反传 4.门控循环单元&#xff08;GRU&#xff09;4.1GRU基本结构 5.长短期记忆网络 (LSTM) 1.序列模型 分类问题与预测问题 图像分…

FSD自动驾驶泛谈

特斯拉的FSD&#xff08;Full-Self Driving&#xff0c;全自动驾驶&#xff09;系统是特斯拉公司研发的一套完全自动驾驶系统。旨在最终实现车辆在多种驾驶环境下无需人类干预的自动驾驶能力。以下是对FSD系统的详细探讨&#xff1a; 系统概述 FSD是特斯拉的自动驾驶技术&…