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

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

相关文章

Java根据模板动态生成Pdf(添加页码、文件加密、Spire免费版本10页之后无法显示问题、嵌入图片添加公章、转Base64)

Java根据模板动态生成Pdf&#xff1a;添加页码、文件加密、Spire免费版本10页之后无法显示问题、嵌入图片添加公章、转Base64 引言【Java根据模板动态生成Pdf资源地址】示例一&#xff1a;动态生成带页码的PDF报告示例二&#xff1a;加密PDF以保护敏感信息示例三&#xff1a;应…

基于Matlab使用深度学习的多曝光图像融合

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 在图像处理领域&#xff0c;多曝光图像融合技术是一种重要的技术&#xff0c;它可以将不同曝光条件下…

详解centos8 搭建使用Tor 创建匿名服务和匿名网站(.onion)

1 Tor运行原理&#xff1a; 请求方需要使用&#xff1a;洋葱浏览器&#xff08;Tor Browser&#xff09;或者Google浏览器来对暗&#xff0c;网网站进行访问 响应放需要使用&#xff1a;Tor协议的的Hidden_service 2 好戏来了 搭建步骤&#xff1a; 1.更新yum源 rpm -Uvh h…

代码随想录——双指针与滑动窗口(四)

一.1423. 可获得的最大点数 题目详情 解题思路 这里我们每次只能取最左或最右边的卡牌,第一反应其实是使用双指针&#xff0c;通过局部贪心来解决&#xff0c;但是如果两边相等的话用局部贪心无法来判断到底取哪一边&#xff0c;那我们不妨换一个思路&#xff1a; 我们首先任…

avl excite python二次开发1--python解释器需用内置解释器aws_cmd

avl excite python二次开发1--python解释器需用内置解释器aws_cmd 1、python解释器问题1.1、用外置python解释器&#xff0c;import WSInterface会失败(WSInterface.pyd)1.2、用内置解释器aws_cmd运行py脚本1.3 用内置解释器aws_python执行脚本三级目录 1、python解释器问题 1…

如何打包VUE3项目并且部署到tomcat服务器上运行

创作灵感 最近在学习vue时&#xff0c;发现一件非常尴尬的事情——那就是学了、写了这么久的vue项目&#xff0c;但好像还没有真正的将vue项目打包部署过。 然后在尝试打包并部署vue项目的时候&#xff0c;遇到了一些问题&#xff0c;所以我对这些问题进行了总结&#xff0c;…

【数据结构】为了节省空间,对于特殊矩阵我们可以这样做……

特殊矩阵的压缩存储 导读一、数组与矩阵1.1 数组1.2 数组与线性表1.3 数组的存储结构1.4 矩阵在数组中的存储1.4.1 行优先存储1.4.2 列优先存储 二、特殊矩阵及其压缩存储三、对称矩阵及其存储3.1 方阵与对称矩阵3.2 对称矩阵的存储3.3 压缩存储的手动实现3.3.1 行优先存储3.3.…

上传jar到github仓库,作为maven依赖存储库

记录上传maven依赖包到github仓库问题 利用GitHubPackages作为依赖的存储库踩坑1 仓库地址问题踩坑2 Personal access tokens正确姿势一、创建一个普通仓库&#xff0c;比如我这里是fork的腾讯Shadow到本地。地址是&#xff1a;https://github.com/dhs964057117/Shadow二、生成…

单片机通讯协议

参考&#xff1a;江科大单片机教程 STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili IIC通讯协议SPI通信协议UARTCANUSB速度100k-400khz4Mhz-线数2 CLK,DATA4CLK,ENB,IO,OI额外设备一主多从一主多从 一般不用自己写&#xff0c;都有相应的库或官方提供相应的&#…

学习 Rust 第 23 天:闭包

Rust 闭包提供了简洁、富有表现力的匿名函数来捕获周围的变量。它们简化了代码&#xff0c;提供了存储、参数传递和函数重构方面的灵活性。它们与泛型的交互增强了灵活性&#xff0c;而捕获模式则促进了有效的所有权和可变性管理。从本质上讲&#xff0c;闭包是 Rust 的基础&am…

c#数据库: 9.删除和添加新字段/数据更新

先把原来数据表的sexy字段删除,然后重新在添加字段sexy,如果添加成功,sexy列的随机内容会更新.原数据表如下: using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Data.SqlClient; using System.Linq; using System.…

安全免费的远程软件有哪些?

远程访问软件&#xff0c;又称远程协助软件或远程控制软件&#xff0c;正在迅速走红。这类软件无论您身处何地&#xff0c;都能轻松实现远程访问和计算机控制。对于个人而言&#xff0c;远程控制工具使工作更加灵活、便捷&#xff1b;而对企业而言&#xff0c;远程访问软件也是…

jenkins转载文本

基于Docker容器DevOps应用方案 企业业务代码发布系统 一、企业业务代码发布方式 1.1 传统方式 以物理机或虚拟机为颗粒度部署部署环境比较复杂&#xff0c;需要有先进的自动化运维手段出现问题后重新部署成本大&#xff0c;一般采用集群方式部署部署后以静态方式展现 1.2 容…

【linuxC语言】进程概念与fork

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、进程的概念二、进程基本函数2.1 fork函数2.2 getpid与getppid函数 三、示例代码总结 前言 在 Linux 系统编程中&#xff0c;进程是计算机中正在执行的程序…

ip ssl证书无限端口网站

IP SSL证书是由CA认证机构颁发的一种特殊数字证书。大部分SSL数字证书都需要用户使用域名进行申请&#xff0c;想要对公网IP地址加密实现https访问就需要申请IP SSL证书。IP SSL证书采用了强大的加密算法&#xff0c;可以有效地防止数据在传输过程中被窃取或篡改&#xff0c;具…

使用 Python 和 DirectShow 从相机捕获图像

在 Python 中使用 OpenCV 是视觉应用程序原型的一个非常好的解决方案,它允许您快速起草和测试算法。处理从文件中读取的图像非常容易,如果要处理从相机捕获的图像,则不那么容易。OpenCV 提供了一些基本方法来访问链接到 PC 的相机(通过对象),但大多数时候,即使对于简单的…

html表格导出为word文档,导出的部分表格内无法填写文字

导出技术实现&#xff1a;fileSaver.jshtml-docx-js 1.npm安装 npm install --save html-docx-js npm install --save file-saver 2.页面引入 import htmlDocx from html-docx-js/dist/html-docx; import saveAs from file-saver;components: {htmlDocx,saverFile, }, 3.页…

【Paddle】PCA线性代数基础 + 领域应用:人脸识别算法(1.1w字超详细:附公式、代码)

【Paddle】PCA线性代数基础及领域应用 写在最前面一、PCA线性代数基础1. PCA的算法原理2. PCA的线性代数基础2.1 标准差 Standard Deviation2.2 方差 Variance2.3 协方差 Covariance2.4 协方差矩阵 The Covariance Matrix2.5 paddle代码demo①&#xff1a;计算协方差矩阵2.6 特…

【记录】Python3| 将 PDF 转换成 HTML/XML(✅⭐⭐⭐⭐pdf2htmlEX)

本文将会被汇总至 【记录】Python3&#xff5c;2024年 PDF 转 XML 或 HTML 的第三方库的使用方式、测评过程以及对比结果&#xff08;汇总&#xff09;&#xff0c;更多其他工具请访问该文章查看。 文章目录 pdf2htmlEX 使用体验与评估1 安装指南2 测试代码3 测试结果3.1 转 HT…

美国言语听力学会(ASHA)关于非处方 (OTC) 助听器的媒体声明(翻译稿)

美国国会于 2021 年 4 月 13 日批准美国听力学会积极提供建议&#xff0c;并一直积极参与制定FDA关于非处方助听器销售的拟议法规。根据2017年通过的立法授权。学院积极参与帮助塑造授权立法&#xff0c;并就即将出台的条例分享了建议。 根据美国卫生与公众服务部NIH / NIDCD的…