关于下载上传的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.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.hqwc.cn/news/660640.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Postgresql源码(127)投影ExecProject的表达式执行分析

无论是投影还是别的计算&#xff0c;表达式执行的入口和计算逻辑都是统一的&#xff0c;这里已投影为分析表达式执行的流程。 1 投影函数 用例 create table t1(i int primary key, j int, k int); insert into t1 select i, i % 10, i % 100 from generate_series(1,1000000…

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

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

数据挖掘之基于Lightgbm等多模型消融实验的信用欺诈检测实现

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 在当前的金融环境中&#xff0c;信用欺诈行为日益增多&#xff0c;给金融机构和消费者带来了巨大的损…

基于语音识别的智能电子病历(一)

引子 A&#xff1a;“上周开年会了&#xff01;” 俺&#xff1a;“有啥新的动向&#xff1f;” A&#xff1a;“今年计划开发基于语音识别的智能电子病历。老板说这个算是国内首创&#xff01;” 俺&#xff1a;“嗯&#xff0c;俺做这个20多年了。” A&#xff1a;“语言…

电脑装了两个Win10系统,怎么修改其名称方便识别?

前言 有小伙伴在上一期的双系统教程上留言说怎么修改双系统引导时候显示的名称 不然看起来两个系统好像都没啥分别&#xff0c;如果是Windows10Windows11的方案还好说&#xff0c;但如果是两个Windows10或者是两个Windows11&#xff0c;有时候还真的很不好分辨。 万一想要启动…

从MySQL+MyCAT架构升级为分布式数据库,百丽应用OceanBase 4.2的感受分享

本文来自OceanBase的客户&#xff0c;百丽时尚的使用和测试分享 业务背景 百丽时尚集团&#xff0c;作为国内大型时尚鞋服集团&#xff0c;在中国超过300个城市设有直营门店&#xff0c;数量超过9,000家。集团构建了以消费者需求为核心的垂直一体化业务模式&#xff0c;涵盖了…

C++11:shared_ptr循环引用问题

一、shared_ptr的弊端 struct Listnode {int _val;std::shared_ptr<Listnode> _prev;std::shared_ptr<Listnode> _next;Listnode(int val ):_val(val),_prev(nullptr),_next(nullptr){}~Listnode(){cout << "~Listnode()" << endl;} }; in…

Macos M3 FastGpt部署实现文档问答

前言 经过 Macos安装OrbStack-CSDN博客 Centos8安装docker-compose-CSDN博客 两篇文章的铺垫&#xff0c;可以正式在mac m芯片系列的电脑上使用docker安装项目了 什么是FastGpt FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(七)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 14 节&#xff09; P14《13.ArkUI组件-自定义组件》 将可变部分封装成组件的成员变量&#xff1a; 1、首先给标题添加两个图标&am…

计算机网络4——网络层4内部路由选择协议

文章目录 一、有关路由选择协议的几个基本概念1、理想的路由算法2、分层次的路由选择协议 二、内部网关协议 RIP1、协议 RIP 的工作原理2、特点3、距离向量算法4、坏消息传播慢 三、内部网关协议 OSPF1、基本特点2、OSPF 的五种分组类型 本节将讨论几种常用的路由选择协议&…

chrome和drive安装包路径

Chrome for Testing availability (googlechromelabs.github.io) 下载Stable下面的包哈

Mysql从入门到精通——Mysql知识点总结(基础篇)

参考视频 黑马程序员 MySQL数据库入门到精通i 题单推荐 入门 进阶 SQL语句类型 DDL:数据定义语言&#xff0c;用来定义数据库对象(数据库&#xff0c;表&#xff0c;字段)DML:数据操作语言&#xff0c;对数据库表中的数据进行增删改DQL:数据查询语言,用来查询数据库中表的…