关于下载上传的sheetjs

embedded/2024/9/23 7:30:33/

一、背景

需要讲后端返回来的表格数据通过前端设置导出其中某些字段,而且得是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.namelet 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.ppmy.cn/embedded/30300.html

相关文章

(详细整理!!!!)Tensorflow与Keras、Python版本对应关系!!!

小伙伴们大家好&#xff0c;不知道大家有没有被tensorflow框架困扰过 今天我就给大家整理一下tensorflow和keras、python版本的对应关系 大家这些都可以在官网找到&#xff0c;下面我把官网的连接给大家放在这里&#xff1a;在 Windows 环境中从源代码构建 | TensorFlow (g…

使用protoc-jar-maven-plugin生成grpc项目

在《使用protobuf-maven-plugin生成grpc项目》中我们使用protobuf-maven-plugin完成了grpc代码的翻译。本文我们将只是替换pom.xml中的部分内容&#xff0c;使用protoc-jar-maven-plugin来完成相同的功能。总体来说protoc-jar-maven-plugin方案更加简便。 环境 见《使用proto…

工厂模式和策略模式区别

工厂模式和策略模式都是面向对象设计模式&#xff0c;但它们的目的和应用场景有所不同。 工厂模式是一种创建型设计模式&#xff0c;旨在通过使用一个工厂类来创建对象&#xff0c;而不是直接使用new关键字来创建对象。这样做可以使系统更容易扩展和维护&#xff0c;因为新的对…

JavaScript中的Math对象方法、Date对象方法

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 &#x1f31f;Math对象方法&#x1f344;1 Math静态属性&#x1f344;2 Math…

Go语言基本语法(五)标识符、关键字、操作符、分隔符和字面量

在Go语言中&#xff0c;程序的基本构建块包括标识符、关键字、操作符、分隔符和字面量&#xff0c;它们共同构成了Go语言的语法基础。以下是这些元素的详细介绍&#xff1a; 标识符&#xff08;Identifier&#xff09; Go语言中的标识符是用来命名程序元素&#xff08;如变量…

【计算机毕业设计】基于SSM++jsp的社区管理与服务系统【源码+lw+部署文档+讲解】

目录 摘 要 Abstract 第一章 绪论 第二章 系统关键技术 第三章 系统分析 3.1.1技术可行性 3.1.2经济可行性 3.1.3运行可行性 3.1.4法律可行性 3.4.1注册流程 3.4.2登录流程 3.4.3活动报名流程 第四章 系统设计 4.3.1登录模块顺序图 4.3.2添加信息模块顺序图 4.4.1 数据库E-…

C#核心之面向对象-封装

面向对象-封装 文章目录 1、类和对象1、什么是类2、类的声明3、类声明语法4、类声明实例5、对象(类)6、实例化对象语法7、实例化对象 2、成员变量和访问修饰符1、成员变量2、访问修饰符3、成员变量的使用和初始值 3、成员方法1、成员方法声明2、成员方法的使用 4、构造函数和…

贪心算法在Python、JavaScript、Java、C++和C#中的多样化实现及其在钱币找零、分数骑士、活动选择、最小生成树与哈夫曼编码问题中的应用示例

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法策略。贪心算法在有最优子结构的问题中尤为有效。下面我将提供5种不同编程语言实现的贪心算法示例&#xff0c;包括活动选…