关于下载上传的sheetjs

news2025/1/10 21:01:07

一、背景

需要讲后端返回来的表格数据通过前端设置导出其中某些字段,而且得是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`);
        }


 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初学React基础

最近准备跟着黑马React学一下React&#xff0c;扩充一下技术面&#xff0c;打算还是以一边学习一边记笔记为主&#xff0c;进行学习&#xff01; 1. React介绍 1.1. React是什么&#xff1f; React是由FaceBook现在称&#xff08;Meta&#xff09;开发的开源 JavaScript 库&a…

如何使用 ArcGIS Pro 查找小区最近的地铁站

学习 GIS 除了可以用在工作上之外&#xff0c;还可以将其运用到生活之中&#xff0c;比如查找距离小区最近的地铁站&#xff0c;这里为大家介绍一下查找的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的POI数据&#xff0c;除了POI数据…

Python流程控制

描述 Python中的流程控制是编程中用来控制代码执行顺序的结构。包括条件判断&#xff08;if语句&#xff09;、循环&#xff08;for循环和while循环&#xff09;、以及用于跳出或跳过循环的break和continue语句。 条件判断&#xff08;if语句&#xff09; if语句允许我们根据…

C++基础语法练习 - 求平均值

题目链接&#xff1a;https://www.starrycoding.com/problem/156 题目描述 在StarryCoding的语法班期末考试里&#xff0c; n n n名同学的成绩分别为 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1​,a2​,...,an​&#xff0c;请求出全班分数的平均值。 输入格式 第一行…

正则化回归

1. L1正则化 L1正则化是回归参数各个元素绝对值之和。 2. L2正则化 L2正则化是回归参数各个元素平方之和。 3.LOSS回归 线性回归加上L1正则化 4.岭回归 线性回归加上L2正则化 不断增大 L2 约束项参数 α&#xff0c;可以发现岭回归参数优化解不断靠近原点&#xff0c…

中职数字化校园网络建设

中职&#xff08;职校&#xff09;数字化校园的校园网建设立足于职业教育、职业学校的特点&#xff0c;充分注意到信息技术的飞速发展、通信成本的迅速降低的特点。在规划和建设校园网时&#xff0c;遵循以下原则&#xff1a; 采用通用和成熟的技术&#xff1a;采用通用的、成熟…

Android创建快捷方式到桌面

效果图 参考 https://blog.51cto.com/u_16175498/8811197https://blog.51cto.com/u_16175498/8811197 权限 <uses-permission android:name"com.android.launcher.permission.INSTALL_SHORTCUT" /> 实现 if (Build.VERSION.SDK_INT > Build.VERSION_C…

macOS 如何关闭文本编辑区的拼写检查?

macOS 如何关闭文本编辑区的拼写检查&#xff1f; 在使用 macOS 自带软件 Freeform 的时候&#xff0c;发现有些单词的拼写检查会一直显示红色下划线&#xff0c;很烦。 找了下&#xff0c;找到了如新关闭这种提示 之后就正常了&#xff1a;

软件测试经理工作日常随记【1】-测试用例

软件测试经理工作日常随记【1】-测试用例 1.测试用例 测试用例&#xff0c;好像是每个讲软测经验的文章的基本输出。各种测试用例的设计及白盒黑盒测试方法重复出现在收集者前面。so&#xff0c;不走寻常路的我&#xff0c;觉得从另外的角度去分享测试用例。日常工作中&#…

MYSQL数据目录结构上篇-表在文件系统中表示

前言感悟:我个人是比较不喜欢只会用,不太懂为什么的这么用,而且有的时候很多官方术 语让人难以读懂, 这里我会用比较大白话的方式,让我自己也能让网友们更加理解,如果书写哪里有误,欢迎大家指出((,,•ω•)ノ"(っω•&#xff40;。)) 从入门开始啦推荐一个学习mysql的视频…

Python urllib 爬虫入门(2)

本文为Python urllib类库爬虫更入门的一些操作和爬虫实例及源码。 目录 模拟浏览器请求 简单模拟 设置随机user-agent 请求超时 HTTP请求类型 Get请求 Post请求 抓取网页动态请求 封装ajax请求 调用 循环调用 抓取小说 封装请求函数 把html写入本地分析 调用 正…

Springboot+Vue项目-基于Java+MySQL的教学资料管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

bite阶段性测试_数据结构

解决问题之前我们要了解什么是度&#xff0c;特别是二叉树中的度&#xff0c;和图论中的度的定义是不同的 什么是度&#xff1a; 在图论中&#xff0c;一个节点&#xff08;或称为顶点&#xff09;的“度”是指与该节点直接相连的边的数量。度是用来衡量一个节点与其他节点连接…

CSS移动端弹性布局

一级标题 二倍图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>背景图片</title><styl…

一个单例模式中使用std::unique_ptr引起的莫名其妙的COFF损坏的问题(未解决)

使用static std::unique_ptr和static std::shared_ptr都不行struct IElementAgendaEvents {//! Called to allow listeners to modify the agenda by adding/removing entries before applying tool operation. Return true if entries added or invalidated.virtual bool …

【机器学习】视觉基础模型的三维意识:前沿探索与局限

视觉基础模型的三维意识&#xff1a;前沿探索与局限 一、引言二、视觉基础模型的三维意识三、当前模型的局限性四、实验与结果五、总结与展望 大规模预训练的进展已经产生了具有强大能力的视觉基础模型。最近的模型不仅可以推广到任意图像的训练任务&#xff0c;而且它们的中间…

spring boot 基础案例【3】构建RESTful API与单元测试

教程1 案例教程 案例仓库 在线编程 教程2 基础教程 教程仓库 在线编程 本案例所在的仓库 本案例所在的文档 进入正文 1.文件目录 1. Chapter21Application.java 地址&#xff1a;chapter2-1/src/main/java/com/didispace/chapter21/Chapter21Application.java package com.d…

CSS @keyframes 动画:颜色变化、背景旋转与放大缩小

在CSS中&#xff0c;keyframes 是一个强大的工具&#xff0c;它允许我们创建复杂的动画效果。今天&#xff0c;我们将一起探索如何使用 keyframes 来实现颜色变化、背景旋转以及放大缩小的动画效果。 动画会在 2 秒内循环播放&#xff0c;并在不同的时间点改变盒子的背景颜色和…

【JVM】简述类加载器及双亲委派机制

双亲委派模型&#xff0c;是加载class文件的一种机制。在介绍双亲委派模型之前&#xff0c;我需要先介绍几种类加载器&#xff08;Class Loader&#xff09;。 1&#xff0c;类加载器 Bootstrap&#xff0c;加载lib/rt.jar&#xff0c;charset.jar等中的核心类&#xff0c;由…

VS code 同步odata服务

在做UI5得开发过程中&#xff0c;经常会出现odata需要更新 那么已经加载过得项目如何去跟新odata服务呢 可以通过如下步骤 1.右键打开应用信息 2.找到manage service models 3.点击编辑 4.选中 刷新并保存