首页 > 其他分享 >表格JS实现在线Excel的附件上传与下载

表格JS实现在线Excel的附件上传与下载

时间:2023-08-16 09:03:17浏览次数:46  
标签:文件 sheet Excel JS 附件 上传 row

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

前言

在本地使用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)

}

}

})

3. 附件文件清除

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

})
}

4. 文件保存/加载

将文件保存成为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/

扩展链接:

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

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

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

标签:文件,sheet,Excel,JS,附件,上传,row
From: https://www.cnblogs.com/powertoolsteam/p/17631512.html

相关文章

  • 【技术积累】Vue.js中的CSS过渡【一】
    CSS过渡是什么在Vue中,可以使用<transition>组件来实现CSS过渡效果。CSS过渡是指在元素的状态发生改变时,通过添加或移除CSS类来实现平滑的过渡效果。<transition>组件可以包裹需要过渡的元素,并通过name属性指定过渡效果的名称。然后,可以使用CSS样式来定义过渡的效果。以下......
  • JS实现播放音乐时歌词同步展示
    效果如下:实现过程:监听音频播放时间,使用歌词的出现时间与其比较,展示对应时间歌词内容,代码如下<audioid="audio-player"src="每个眼神都只身荒野.m4a"controls></audio><divclass="lyrics-container"><divid="lyrics"></div></div&g......
  • JScript 操作文本文件 练习代码
     varTextStream=function(){this.handle=null;this.create=function(filename,overwrite){varfso=newActiveXObject("scripting.filesystemobject");this.handle=fso.CreateTextFile(filename,overwrite);}th......
  • next.js 源码解析 - getStaticProps、getStaticPaths 篇
    ......
  • 文件上传漏洞
    webshell一句话木马eval($_POST['muma']);system函数可以执行操作系统的命令代码短,只有一行代码。场景多,可以单独生成文件,也可以插入到图片中。安全性高,隐藏性强,可变形免杀小马体积小,功能少,只有文件上传功能,为大马做铺垫。大马体积大,功能全,能够管理数据库、文件管理、对......
  • @JsonComponent注解自定义JSON序列化与反序列化
    1.概述本篇教程将聚焦于如何使用SpringBoot中的@JsonComponent通过使用这个注解,我们不需要手动引用ObjectMapper对象就可以将一个类暴露为Jackson的serializer与deserializer。由于这是SpringBoot提供的功能,所以我们不需要添加额外的依赖,我们可以直接在SpringBoot程序中使用它......
  • vue.js框架的iframe页面计时器无法销毁的解决方法
    同学试过使用生命周期等方式都不能清除计时器;因而改用这个方法;1,首先vue页面上随便写个有高度的div如下:用refs获取高度<divclass="hub-fixed-box":style="{width:fixedWidth+'px'}"ref="fixedTop"></div>2.定时器定义在data内data:{timer:null,//计时器}3,初始......
  • JSCRIPT连接ado
    //JavaScriptsourcecode//JScriptsourcecodevarconsole={log:function(txt){WScript.Echo(txt);}}functionRecordset(h){this.commandText="";this.activeConnection=null;this.handle=h;this.open=fun......
  • 在Angular项目中如何读取json文件呢?
    直接进入主题,我们的最终目得是要读取文件,那么首先我们需要先创建文件,第一步:创建我们今天所需要在assets创建需要读取的文件Message.json,如下:[{"id":"E0001","msg":"{0}の取得に失敗しました。"},{"id":"E0002",&quo......
  • [LitCTF 2023]1zjs
    [LitCTF2023]1zjs题目来源:nssctf题目类型:web涉及考点:信息搜集1.题目给了一个魔方游戏,检查源代码:在/dist/index.umd.js里发现线索:直接访问看看:经查询发现是JSFuck编码,特征为[]+!(),对其解码得到:将[]去掉即可得到flag:NSSCTF{11c9e8fe-03f7-4bc1-bfed-b8277cd55964}......