如何在前端应用中合并多个 Excel 工作簿

news2024/12/22 19:40:55

本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。

前言 | 问题背景

​ SpreadJS是纯前端的电子表格控件,可以轻松加载 Excel 工作簿中的数据并将它们呈现在前端浏览器应用的网页上。
在某些情况下,您可能需要将来自多个工作簿的数据(例如,来自不同部门的月度销售报告)合并到一个工作簿中,实现此目的的一种方法是使用多个隐藏的 SpreadJS 实例来加载所有工作簿,然后将它们合并到一个电子表格中。
此文将向您展示如何合并多个 Excel 工作簿并将它们作为单个电子表格显示在您的前端浏览器应用中。

设置项目

​ 要加载 SpreadJS,我们需要添加主要的 JavaScript 库和 CSS 文件。由于还要加载 Excel 文件,因此我们需要添加 ExcelIO JavaScript 库。这可以通过导航到 HTML 文件的位置并使用 NPM 安装 SpreadJS 文件来完成:

npm i @grapecity/spread-sheets @grapecity/spread-excelio

然后在 HTML 代码中引用这些文件:

\<!DOCTYPE html\>

\<html xmlns="http://www.w3.org/1999/xhtml"\>

\<head\>

\<meta charset="utf-8" /\>

\<title\>Multiple Sheet Merging\</title\>

\<link href="./node_modules/@grapecity/spread-sheets/styles/gc.spread.sheets.excel2013white.css" rel="stylesheet" type="text/css" /\>

\<script type="text/javascript" src="./node_modules/@grapecity/spread-sheets/dist/gc.spread.sheets.all.min.js"\>\</script\>

\<script type="text/javascript" src="./node_modules/@grapecity/spread-excelio/dist/gc.spread.excelio.min.js"\>\</script\>

\</head\>

\</html\>

紧接着我们将添加一个 DIV 元素来承载 SpreadJS 实例。

\<body\>

\<div id="ss" style="width: 800px; height: 700px; border: 1px solid gray"\>\</div\>

\</body\>

我们要添加一些代码来初始化 Spread 实例、ExcelIO 和一个数组来保存隐藏的 Spread 实例,我们将在合并之前使用它来加载所有 Excel 文件:

var hiddenWorkbooks, hiddenSpreadIndex, excelIO, spread;

window.onload = function () {

hiddenSpreadIndex = -1;

hiddenWorkbooks = new Array();

excelIO = new GC.Spread.Excel.IO();

spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"));

}

在前端应用中加载 Excel 文件

在这里插入图片描述

​ 对于这个页面,我们将添加代码让用户加载任意数量的工作簿,然后单击一个按钮将它们合并为一个并在 SpreadJS 中显示它们。为此,我们可以添加以下 HTML 代码:

\<input type="file" name="files[]" id="fileDemo" accept=".xlsx,.xls" /\>

\<input type="button" id="addWorkbook" value="Add Workbook" onclick="CreateNewSpreadDiv()" /\>

\<div id="workbookListBlock" style="display:none"\>

\<p\>Workbooks to merge:\</p\>

\<ul id="workbookList"\>\</ul\>

\<input type="button" id="mergeWorkbooks" value="Merge Workbooks" onclick="MergeWorkbooks()" /\>

\</div\>

​ 用户点击文件输入选择一个文件,然后点击“添加工作簿”按钮。这将创建一个新的隐藏 DIV 元素来保存将用于临时加载 Excel 文件的 SpreadJS 实例,并将它们添加到隐藏工作簿列表中:

function CreateNewSpreadDiv() {

hiddenSpreadIndex++;

var newDiv = document.createElement("div");

newDiv.style.cssText = "display:none; width: 800px; height: 600px; border: 1px solid gray";

newDiv.id = "hiddenWorkbook" + hiddenSpreadIndex;

document.body.appendChild(newDiv);

var hiddenWorkbook = new GC.Spread.Sheets.Workbook(document.getElementById(newDiv.id));

hiddenWorkbooks.push(hiddenWorkbook);

AddWorkbookToImportList();

}

然后,该函数使用 ExcelIO 代码调用另一个函数将 Excel 文件加载到隐藏的 Spread 实例中:

function AddWorkbookToImportList() {

var excelFile = document.getElementById("fileDemo").files[0];

excelIO.open(excelFile, function (json) {

var workbookObj = json;

hiddenWorkbooks[hiddenSpreadIndex].fromJSON(workbookObj);

AddWorkbookNameElement(document.getElementById("fileDemo").files[0].name);

document.getElementById("fileDemo").value = "";

}, function (e) {

console.log(e);

});

}

为了向用户提供反馈,我们将显示他们将要合并的文件列表,此处显示为“AddWorkbookNameElement”函数:

function AddWorkbookNameElement(workbookName) {

if (document.getElementById("workbookListBlock").style.display == "none") {

document.getElementById("workbookListBlock").style.display = "block";

}

var newDiv = document.createElement("LI");

var textNode = document.createTextNode(workbookName);

newDiv.appendChild(textNode);

document.getElementById("workbookList").appendChild(newDiv);

}

在前端应用中合并 Excel 文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0U6AlMpb-1685089090317)(media/4946fef31b3121def89b28d676508f6d.png)]

当用户准备好最终将所有工作簿合并为一个时,他们可以单击“合并工作簿”按钮,将每个工作簿中的每个工作表复制到页面上可见的 SpreadJS 实例:

function MergeWorkbooks() {

for (var w = 0; w \< hiddenWorkbooks.length; w++) {

if (GC.Spread.Sheets.LicenseKey == null) {

for (var s = 1; s \< hiddenWorkbooks[w].getSheetCount(); s++) {

CopySheet(w, s);

}

} else {

for (var s = 0; s \< hiddenWorkbooks[w].getSheetCount(); s++) {

CopySheet(w, s);

}

}

}

spread.removeSheet(0);

}

function CopySheet(workbookIndex, sheetIndex) {

spread.addSheet();

var sheetJson = JSON.stringify(hiddenWorkbooks[workbookIndex].getSheet(sheetIndex).toJSON());

spread.suspendPaint();

hiddenWorkbooks[workbookIndex].getNamedStyles().forEach(function (namedStyle) {

spread.addNamedStyle(namedStyle);

});

spread.getSheet(spread.getSheetCount()-1).fromJSON(JSON.parse(sheetJson));

spread.resumePaint();

}

​ 需要注意的一件事:如果您的工作簿正在使用命名样式,则需要将此样式添加到可见的 SpreadJS实例中,否则它将无法正确显示,因为我们正在复制单个工作表。这显示在上面的函数中,可以添加到“spread.addNamedStyle()”。

​ 添加该代码后,您现在可以加载多个 Excel 工作簿并使用 SpreadJS 将它们合并为一个。想要尝试该功能或查看 SpreadJS 的其他惊人功能,可前往葡萄城官网立即下载试用版!

>>>>>>扩展阅读:

盘点Excel中的那些有趣的“bug”

SpreadJS:一款类Excel开发工具,功能涵盖Excel的 95% 以上

SpreadJS在服务器端导入导出Excel

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

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

相关文章

Hack The Box - 关卡Dancing

SMB(全称是Server Message Block)是一个协议名&#xff0c;可用于在计算机间共享文件、打印机、串口等&#xff0c;电脑上的网上邻居就是靠它实现的。 SMB 是一种客户机/服务器、请求/响应协议。通过 SMB 协议&#xff0c;客户端应用程序可以在各种网络环境下读、写服务器上的…

干货|7种提高客户推荐率的方法,让你的客户成为你的推广大使!

大家都知道“客户推荐”是一种非常有效的业务推广方式。通过口碑传播&#xff0c;可以吸引更多的潜在客户&#xff0c;建立长期稳定的合作关系。 可以说&#xff0c;这种开发客户的方法:耗时少&#xff0c;成功率高&#xff0c;成本低&#xff0c;客户更好&#xff0c;堪称世界…

山西电力市场日前价格预测【2023-05-30】

日前价格预测 预测明日&#xff08;2023-05-30&#xff09;山西电力市场全天平均日前电价为350.71元/MWh。其中&#xff0c;最高日前价格为424.56元/MWh&#xff0c;预计出现在19: 30。最低日前电价为239.37元/MWh&#xff0c;预计出现在13: 00。 以上预测仅供学习参考&#xf…

律师使用ChatGPT 进行法律文献检索提交了错误信息;李开复表示,威力强大的大模型将彻底变革人工智能

&#x1f680; 一名律师使用ChatGPT 进行法律文献检索提交了错误信息 近日&#xff0c;一名律师在法庭案件中使用聊天机器人 ChatGPT 进行法律文献检索&#xff0c;结果提交了错误信息&#xff0c; 揭示了人工智能在法律领域的潜在风险&#xff0c;包括误传错误信息。 该事件…

数据分析师的基本职责(合集)

算法工程师的职责表述 算法工程师的职责表述1 职责 1、维护、扩展的大数据处理分析平台; 2、负责将先进的工业大数据分析技术转化为标准化的分析工具与模块; 3、规范并优化算法&#xff0c;提高可靠性; 4、帮助建立标准化的数据分析路线图&#xff0c;能够提取、转换并加强数据…

音视频技术开发周刊 | 295

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 微软炸通Windows与ChatGPT全家桶&#xff01;人手一个Copilot&#xff0c;AI宇宙降临 三位OpenAI掌舵人亲自撰文&#xff1a;我们应该如何治理超级智能&#xff1f; OpenA…

《Opencv3编程入门》学习笔记—第一章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第一章 邂逅opencv 参考推荐软件版本&#xff1a;visual studio2010 opencv2.4.9 visual studio安装教程: https://blog.csdn.net/qq_45768871/article/details/1081788…

LeetCode链表题(中等)剖析

文章目录 &#x1f490;文章导读&#x1f490;1.合并零之间的结点解题思路 &#x1f490;2.链表中最大孪生和解题思路 &#x1f490;3.链表的随机节点解题思路 &#x1f490;4.复杂链表的复制解题思路 &#x1f490;5.两辆交换两表中的节点解题思路 &#x1f490;文章导读 &…

【深圳触觉智能技术分享】RK3568 RK809电量计电池调试

本文基于IDO-SBC3568主板介绍说明PMIC RK809电量计的调试方法。 IDO-SBC3568-V1是一款基于RK3568的工控主板&#xff0c;采用22nm先进工艺制程&#xff0c;四核A55 CPU&#xff0c;主频高达2.0GHz&#xff0c;支持高达8GB高速LPDDR4&#xff0c;1T算力NPU &#xff0c;4K H.26…

如何在Allegro软件中快速复制走线和过孔?

在PCB设计过程中&#xff0c;快速而准确复制走线和过孔是提高设计效率和减少重复工作的关键所在&#xff0c;因此很多工程师会选择使用Allegro来复制走线和过孔&#xff0c;因为Allegro是一款功能强大且灵活的PCB设计软件&#xff0c;提供了多种工具和功能&#xff0c;自然包括…

springboot+java汽车配件销售业绩管理系统 J2EE平台技术

汽车配件销售类企业近年来得到长足发展,在市场份额不断扩大同时,如何更好地管理企业现有销售项目资源成为摆在该类企业面前的重要课题之一。本次打算开发的springboot汽车配件销售业绩管理系统的开发过程引用 J2EE平台技术,该平台中所包含的JDBC、JNDI等组件,规定访问数据库的形…

swagger页面 doc.html出不来,swagger-ui/index.html能出来

swagger页面 doc.html出不来&#xff0c;swagger-ui/index.html能出来。前前后后折腾了很久&#xff0c;jar包冲突&#xff0c;jar包版本&#xff0c;添加路径啥的都弄了&#xff0c;就是出不来。 后来全局搜索“doc.html”页面发现能出来的项目能搜到这个页面&#xff1a; 定…

大数据测试基础概念和工具

下方查看历史精选文章 重磅发布 - 自动化框架基础指南pdfv1.1大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 大数据已经成为当今的热门话题&#xff0c…

提高客户转介绍率的7个方法,让你的客户成为你的推广大使!

都知道“客户转介绍”&#xff0c;是一种非常有效的商业推广方式。通过客户的口碑传播&#xff0c;我们能够吸引更多潜在客户&#xff0c;并建立起长久稳固的合作关系。 可以说&#xff0c;这种开拓客户的方法&#xff1a;耗时少、成功率高、成本低、客户较优质&#xff0c;称…

掌握Lazada、Shopee店铺运营的黄金法则:测评自养号技巧

在Lazada、Shopee这个东南亚最大的电商平台上&#xff0c;要想成功运营你的店铺并不容易。然而&#xff0c;如果你掌握了以下这些黄金法则&#xff0c;并有效地运用测评自养号的策略&#xff0c;你的店铺就有可能大幅提升销售并在竞争中脱颖而出。 1. 理解你的市场 首先&…

九耶丨阁瑞钛伦特-springmvc(三)

SpringMVC作为一种流行的Java Web框架&#xff0c;是基于Spring之上的。它提供了强大的MVC&#xff08;Model-View-Controller&#xff09;架构&#xff0c;能够快速地实现Java Web开发&#xff0c;高效地与数据交互。如何使用SpringMVC成为开发人员的首要问题。要了解SpringMV…

边缘计算盒子都有哪些规格?一文带你了解边缘计算云服务器 ECS

上一次我们详细讲述了&#xff0c;在日常生活中我们能够随时随地看到的“白色盒子”是边缘服务器 ECS&#xff0c;包括边缘服务器 ECS 具体的用途是什么&#xff0c;也为大家逐一进行了科普。 感兴趣的小伙伴欢迎阅读以往文章&#xff1a; 什么是边缘计算盒子&#xff1f;边缘计…

用代码拔高你对整型提升与unsigned,signed的理解

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C语言》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c;希望可以…

Linux下通过 rm -f 删除大量文件时报错:Argument list too long

Linux下通过 rm -f 删除大量的小文件时出现类似如下错误信息&#xff1a; -bash: /bin/rm: Argument list too long 如下图所示&#xff1a; 问题原因 如果待删除文件中包含的小文件数量过多&#xff0c;通常是由于受到 shell 参数个数限制所致。 这个是Linux系统存在的限制&…

若依源码解析:代码生成ruoyi-generator

文章目录 摘要代码生成器的使用数据库连接配置数据库表设计代码生成器配置修改mybatis别名配置&#xff0c;增加对com.cyl包名的识别修改mybatis的mapper扫描包路径 代码生成代码输出模板配置 代码生成器原理模板引擎&#xff1a;Velocity使用Velocity模板引擎的一般流程模板语…