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

前言

在本地使用Excel时,经常会有需要在Excel中添加一些附件文件的需求,例如在Excel中附带一些Word,CAD图等等。同样的,类比到Web端,现在很多人用的在线Excel是否也可以像本地一样实现附件文件的操作呢?答案是肯定的,不过和本地不同的是,Web端不会直接打开附件,而是使用超链接单元格的形式来显示,今天小编将为大家介绍使用前端HTML+JS+CSS技术通过超链接单元格的形式实现在线Excel附件上传、下载和修改的操作。

使用JS实现附件上传

实现的方式分为四个步骤:

1.创建前端页面

2编写暂存附件信息的方法

3.编写附件文件清除的方法

4.编写文件保存和文件加载的方法

1.创建前端页面

核心代码:

  1. <div style="margin-bottom: 8px">
  2. <button id="uploadAttach">上传附件</button>
  3. <button id="removeAttach">清除附件</button>
  4. <button id="fileSaver">文件保存</button>
  5. <button id="loadSubmitFile">加载文件</button>
  6. <button id="loadPackage">打包下载</button>
  7. </div>
  8. <div id="fileOperate" style="visibility: hidden;position: absolute;top: 100px;left: 300px;z-index: 10; background-color: #eee;padding: 16px">
  9. <label for="choseFile">选择文件\</label>
  10. <input type="file" id="choseFile" name="choseFile"/>
  11. <button id="submit">提交</button>
  12. <button id="cancel">取消</button>
  13. </div>

点击上传附件按钮可以把附件上传到对应的单元格,清除附件会清理掉所有已经上传过的附件信息,打包下载会对所有的附件进行统一下载。

2.暂存附件信息方法

这一步起始主要用来设置文件上传之后单元格超链接及tag信息。细心的同学会注意到,这里我注册了一个命令,超链接本身会有一个跳转的行为,写command之后,会阻止这个默认跳转,转去执行对应的命令。注册的命令主要就是用来做附件文件的下载。

核心代码:

  1. function hasAttachFile(sheet,row,col,file){
  2. \*\*
  3. \* 附件文件暂存
  4. \* 这里由于没有服务端,所以我直接存了File对象,但File对象只有在实际使用时才会去获取实际的文件内容。在demo中可行
  5. \* 在实际项目中,需要将file对象上传到文件服务器中
  6. \* 上传完成后tag中的fileInfo应该代表的是文件的访问地址,而不能再是File对象。
  7. \*
  8. sheet.setValue(row,col,file.name)
  9. sheet.setTag(row,col,{
  10. type: hyerlinkType,
  11. fileInfo: file // 实际项目中fileInfo应该为上传完成文件的访问路径
  12. })
  13. sheet.setHyperlink(row, col, {
  14. url: file.name,
  15. linkColor: '#0066cc',
  16. visitedLinkColor: '#3399ff',
  17. drawUnderline: true,
  18. command:'downloadAttachFile',
  19. }, GC.Spread.Sheets.SheetArea.viewport);
  20. }

在这里,我引入了三方组件库FileSaver,在点击超链接单元格时,可以支持当前附件文件的下载。

  1. // 下载文件
  2. spread.commandManager().register("downloadAttachFile",{
  3. canUndo: false,
  4. execute: function(context,options,isUndo){
  5. let sheet = context.getActiveSheet()
  6. let row = sheet.getActiveRowIndex()
  7. let col = sheet.getActiveColumnIndex()
  8. let cellTag = sheet.getTag(row,col)
  9. console.log(sheet,row,col,cellTag)
  10. if(cellTag && cellTag.type==hyerlinkType){
  11. \*\*\*
  12. \* 纯前端demo,文件存在于本地,fileInfo中存储的是File对象,可以直接获取到文件
  13. \* 实际项目中,fileInfo应该是上传到文件服务器上的文件访问地址。
  14. \* 因此这里需要发送请求,先获取文件blob,将获取的blob传递到saveAs的第二个参数中。
  15. \*
  16. saveAs(cellTag.fileInfo,cellTag.fileInfo.name)
  17. }
  18. }
  19. })

3. 附件文件清除

  1. document.getElementById("removeAttach").onclick = function(){
  2. \*\*\*
  3. \* 清除附件
  4. \* 清除附件需要先删除远程文件服务器的文件,之后清除单元格的Tag信息。
  5. \* 这里前端演示demo,只删除了tag
  6. \* 实际项目中tag中的fileInfo应该是文件上传后的路径
  7. \*
  8. let sheet = spread.getActiveSheet()
  9. let row = sheet.getActiveRowIndex()
  10. let col = sheet.getActiveColumnIndex()
  11. spread.commandManager().execute({
  12. cmd:"removeAttachFile",
  13. sheet,row,col
  14. })
  15. }

4. 文件保存/加载

将文件保存成为JSON结构:

  1. document.getElementById("fileSaver").onclick = function(){
  2. // 保存文件
  3. submitFile = spread.toJSON()
  4. spread.clearSheets()
  5. spread.addSheet(0)
  6. }
  7. 加载已保存文件:
  8. document.getElementById("loadSubmitFile").onclick = function(){
  9. // 加载已保存文件
  10. spread.fromJSON(submitFile)
  11. }

实现功能和效果:

在需要在某个单元格中上传附件时,我们可以弹出一个模态框,在模态框中上传文件,点击提交之后,可以对文件做一个暂存,将文件信息存储在单元格的Tag中,点击单元格可以下载文件。

完整代码和在线Demo地址:

https://jscodemine.grapecity.com/share/VHlpNyuP-0CIBNleP5jtyA/

扩展链接:

Spring Boot框架下实现Excel服务端导入导出

项目实战:在线报价采购系统(React +SpreadJS+Echarts)

Svelte 框架结合 SpreadJS 实现纯前端类 Excel 在线报表设计

表格JS实现在线Excel的附件上传与下载的更多相关文章

  1. EBS开发附件上传和下载功能(转)

    原文地址: EBS开发附件上传和下载功能 上传 Oracle ERP二次开发中使用的方式有两种,一是通过标准功能,在系统管理员中定义即可,不用写代码,就可以使几乎任何Form具有附件功能,具体参考系统 ...

  2. vue实现Excel文件的上传与下载

    一.前言项目中使用到比较多的关于Excel的前端上传与下载,整理出来,以便后续使用或分析他人. 1.前端vue:模板下载与导入Excel 导入Excel封装了子组件,点击导入按钮可调用子组件,打开文件 ...

  3. java 附件上传、下载前后端代码

    前言:业务需要:附件上传,需要同时满足浏览器上传,和APP上传附件,并且浏览器端不可使用form表单提交,因为表单提交无法直接获取返回值,除非刷新页面才可显示上传的附件.所以此处使用ajaxfileu ...

  4. 图片,word,Excel等附件上传

    @ResponseBody @RequestMapping("/upload") public String upload(HttpServletRequest request, ...

  5. sap中Excel的模版上传和下载

    一:事物码smw0 二:上传步骤 注:"包"为项目的包的名称. 三:下载代码 l_filename = 'XX.xls'. l_muban = 'z123'. *&---下 ...

  6. EBS开发附件上传和下载功能

    上传 Oracle ERP二次开发中使用的方式有两种,一是通过标准功能,在系统管理员中定义即可,不用写代码,就可以使几乎任何Form具有附件功能,具体参考系统管理员文档:二是通过PL/SQL Gate ...

  7. 基于SpringMVC的文件(增删改查)上传、下载、更新、删除

    一.项目背景 摘要:最近一直在忙着项目的事,3个项目过去了,发现有一个共同的业务,那就是附件的处理,附件包括各种文档,当然还有图片等特殊文件,由于时间的关系,每次都是匆匆忙忙的搞定上线,称这项目的空档 ...

  8. 百度在线编辑器UEditor(v1.3.6) .net环境下详细配置教程之更改图片和附件上传路径

    本文是接上一篇博客,如果有疑问请先阅读上一篇:百度在线编辑器UEditor(v1.3.6) .net环境下详细配置教程 默认UEditor上传图片的路径是,编辑器包目录里面的net目录下 下面就演示如 ...

  9. java对excel表格的上传和下载处理

    Excel表格文件的上传和下载,java中涉及到文件肯定会有io流的知识. 而excel文件就要涉及到poi技术,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为 ...

  10. C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi

    C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...

随机推荐

  1. 2022-01-04:一个无序数组长度为n,所有数字都不一样,并且值都在[0...n-1]范围上。 返回让这个无序数组变成有序数组的最小交换次数。 来自小红书。

    2022-01-04:一个无序数组长度为n,所有数字都不一样,并且值都在[0-n-1]范围上. 返回让这个无序数组变成有序数组的最小交换次数. 来自小红书. 答案2022-01-04: 下标循环怼. ...

  2. Selenium - 元素等待(2) - 显式等待/EC等待

    Selenium - 元素等待 显式等待 显式等待是一种灵活的等待方式,需要声明等待的结束条件,当满足条件时会自动结束等待: 需要引入WebDriverWait包以及exception_conditi ...

  3. 时间函数strftime和strptime的差别

    strftime是转换为特定格式输出, strptime是将一个时间字符串解析为时间类型对象. strftime是按照想要的格式,去转换.重点是格式! strptime不管什么格式,只要把特定的时间字 ...

  4. Redis使用lua脚本实现库存扣减

    为什么使用Lua脚本为什么能合并多个原子操作? Redis官方文档:https://redis.io/docs/manual/programmability/eval-intro/ Redis 保证脚 ...

  5. vue 中render执行流程梳理

    用了多年vue 今天对自己了解的render 做一个梳理 一.使用template模板 先从vue 初始化开始: 众所周知项目的main.js中定义了 var app = new Vue({})这vu ...

  6. ubuntu18 安装单机k8s v1.18.2

    背景 当我们需要对k8s进行二次开发时,k8s环境是必须的,那么在ubuntu上部署单机k8s是最方便的,便于开发调试 系统准备 本人用的是Ubuntu18,以下以此为例 部署之前,最好切换至root ...

  7. Windows常用的 CMD 命令合集

    常用的 CMD 命令合集: 基础命令 dir:列出当前目录中的文件和子目录. cd:更改当前目录.例如,cd Documents 将当前目录更改为 Documents 文件夹. md 或 mkdir: ...

  8. C++面试八股文:struct、class和union有哪些区别?

    某日小二参加XXX科技公司的C++工程师开发岗位5面: 面试官:struct和class有什么区别? 小二:在C++中,struct和class的唯一区别是默认的访问控制.struct默认的成员是pu ...

  9. 手把手教你如何在 Linux 上源码安装最新版本 R

    如果你使用的 Linux 系统 GCC 版本太低,又没有 root 权限(即使有 root 权限又担心升级 GCC 带来的风险):同时你又不想额外多安装多一个 Anaconda 或者 Minicond ...

  10. RALB负载均衡算法的应用

    一.背景 搜索推荐算法架构为京东集团所有的搜索推荐业务提供服务,实时返回处理结果给上游.部门各子系统已经实现了基于CPU的自适应限流,但是Client端对Server端的调用依然是RR轮询的方式,没有 ...