如何使用JavaScript实现在线Excel附件的上传与下载?
前言
在本地使用Excel时,经常会有需要在Excel中添加一些附件文件的需求,例如在Excel中附带一些Word,CAD图等等。同样的,类比到Web端,现在很多人用的在线Excel是否也可以像本地一样实现附件文件的操作呢?答案是肯定的,不过和本地不同的是,Web端不会直接打开附件,而是使用超链接单元格的形式来显示,今天小编将为大家介绍使用前端HTML+JS+CSS技术通过超链接单元格的形式实现在线Excel附件上传、下载和修改的操作。
使用JS实现附件上传
实现的方式分为四个步骤:
1.创建前端页面
2编写暂存附件信息的方法
3.编写附件文件清除的方法
4.编写文件保存和文件加载的方法
1.创建前端页面
核心代码:
<div style="margin-bottom: 8px"> <button id="uploadAttach">上传附件</button> <button id="removeAttach">清除附件</button> <button id="fileSaver">文件保存</button> <button id="loadSubmitFile">加载文件</button> <button id="loadPackage">打包下载</button> </div> <div id="fileOperate" style="visibility: hidden;position: absolute;top: 100px;left: 300px;z-index: 10; background-color: #eee;padding: 16px"> <label for="choseFile">选择文件\</label> <input type="file" id="choseFile" name="choseFile"/> <button id="submit">提交</button> <button id="cancel">取消</button> </div>
点击上传附件按钮可以把附件上传到对应的单元格,清除附件会清理掉所有已经上传过的附件信息,打包下载会对所有的附件进行统一下载。
2.暂存附件信息方法
这一步起始主要用来设置文件上传之后单元格超链接及tag信息。细心的同学会注意到,这里我注册了一个命令,超链接本身会有一个跳转的行为,写command之后,会阻止这个默认跳转,转去执行对应的命令。注册的命令主要就是用来做附件文件的下载。
核心代码:
function hasAttachFile(sheet,row,col,file){ \*\* \* 附件文件暂存 \* 这里由于没有服务端,所以我直接存了File对象,但File对象只有在实际使用时才会去获取实际的文件内容。在demo中可行 \* 在实际项目中,需要将file对象上传到文件服务器中 \* 上传完成后tag中的fileInfo应该代表的是文件的访问地址,而不能再是File对象。 \* sheet.setValue(row,col,file.name) sheet.setTag(row,col,{ type: hyerlinkType, fileInfo: file // 实际项目中fileInfo应该为上传完成文件的访问路径 }) sheet.setHyperlink(row, col, { url: file.name, linkColor: '#0066cc', visitedLinkColor: '#3399ff', drawUnderline: true, command:'downloadAttachFile', }, GC.Spread.Sheets.SheetArea.viewport); }
在这里,我引入了三方组件库FileSaver,在点击超链接单元格时,可以支持当前附件文件的下载。
// 下载文件 spread.commandManager().register("downloadAttachFile",{ canUndo: false, execute: function(context,options,isUndo){ let sheet = context.getActiveSheet() let row = sheet.getActiveRowIndex() let col = sheet.getActiveColumnIndex() let cellTag = sheet.getTag(row,col) console.log(sheet,row,col,cellTag) if(cellTag && cellTag.type==hyerlinkType){ \*\*\* \* 纯前端demo,文件存在于本地,fileInfo中存储的是File对象,可以直接获取到文件 \* 实际项目中,fileInfo应该是上传到文件服务器上的文件访问地址。 \* 因此这里需要发送请求,先获取文件blob,将获取的blob传递到saveAs的第二个参数中。 \* saveAs(cellTag.fileInfo,cellTag.fileInfo.name) } } })
- 附件文件清除
document.getElementById("removeAttach").onclick = function(){ \*\*\* \* 清除附件 \* 清除附件需要先删除远程文件服务器的文件,之后清除单元格的Tag信息。 \* 这里前端演示demo,只删除了tag。 \* 实际项目中tag中的fileInfo应该是文件上传后的路径 \* let sheet = spread.getActiveSheet() let row = sheet.getActiveRowIndex() let col = sheet.getActiveColumnIndex() spread.commandManager().execute({ cmd:"removeAttachFile", sheet,row,col }) }
- 文件保存/加载
将文件保存成为JSON结构:
document.getElementById("fileSaver").onclick = function(){ // 保存文件 submitFile = spread.toJSON() spread.clearSheets() spread.addSheet(0) } 加载已保存文件: document.getElementById("loadSubmitFile").onclick = function(){ // 加载已保存文件 spread.fromJSON(submitFile) }
实现功能和效果:
在需要在某个单元格中上传附件时,我们可以弹出一个模态框,在模态框中上传文件,点击提交之后,可以对文件做一个暂存,将文件信息存储在单元格的Tag中,点击单元格可以下载文件。
完整代码和在线Demo地址: https://jscodemine.grapecity.com/share/VHlpNyuP-0CIBNleP5jtyA/
扩展链接:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
开源的网络瑞士军刀「GitHub 热点速览」
上周的开源热搜项目可谓是精彩纷呈,主打的就一个方便快捷、开箱即用!这款无需安装、点开就用的网络瑞士军刀 CyberChef,试用后你就会感叹它的功能齐全和干净的界面。不喜欢 GitHub 的英文界面?GitHub 网站汉化插件 github-chinese,让英语不好的同学实现无障碍浏览 GitHub(网络障碍不包括在内)。 另外,支持 Docker 一键启动的 MiGPT 用 AI 升级你的智能音箱,让它变成更懂你的 AI 语音助手。用 Python 写前端已经不是新闻,但 Google 开源的 mesop 将快速构建 Web 应用原型做到了"极致",快的代价就是界面十分"朴素"。 最后,走轻快易用路线的分析型数据库 DuckDB,终于发布了 1.0 版本。它能够在强者如云的开源数据库之中脱颖而出,靠的就是小巧、轻量、够用,不跟你拼性能。 本文目录 开源热搜项目 1.1 网络瑞士军刀:CyberChef 1.2 进程内的分析型数据库:DuckDB 1.3 用 Python 愉快地写 WebUI:mesop 1.4 为小爱音响接入 LLM:mi-gpt 1.5 让静态图片开口"说话":...
- 下一篇
Databend 开源周报第 149 期
Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 What's On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 支持递归公共表表达式 Databend 现已支持递归公共表表达式(Recursive CTE)。递归公共表表达式,允许用户以递归的方式来执行查询,有助于增强对分层数据和层次结构的查询和处理。 语法如下: WITH RECURSIVE <cte_name> AS ( <initial_query> UNION ALL <recursive_query> ) SELECT ... 如果您想了解更多信息,欢迎联系 Databend 团队,或查看下面列出的资源。 PR #15675 | feat: support recursive cte Beyond the Code 一起来探索 Databend 社区和周边生态中的新鲜事。 Databend 正在计划从 icelake ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS关闭SELinux安全模块
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS8安装Docker,最新的服务器搭配容器使用