使用Handsontable實現動態表格和下載表格

1.效果

2.實現代碼

首先要加載Handsontable,在示例中我是cdn的方式引入的,vue的話需要下載插件

      let hot = null;var exportPlugin = null;function showHandsontable(param) {const container = document.getElementById("hot-container");// 如果已有實例,先銷毀if (hot) {hot.destroy();}hot = new Handsontable(container, {data: [], // 初始為空colHeaders: true, // 動態列頭rowHeaders: true, // 動態行頭width: "100%",height: 800,licenseKey: "non-commercial-and-evaluation", // 免費版許可證contextMenu: true, // 啟用右鍵菜單manualColumnResize: true, // 允許調整列寬manualRowResize: true, // 允許調整行高filters: true, // 啟用篩選dropdownMenu: true, // 啟用下拉菜單columnSorting: true, // 啟用列排序stretchH: "all", // 列寬自適應afterChange: function (changes, source) {if (source === "edit") {console.log("數據已修改:", changes);}},});}showHandsontable();

點擊后開始加載數據,注意colHeaders,rowHeaders,是行和列的名稱,是數組格式

updateSettings:更新表格數據和表頭

loadData:重新加載數據

      document.getElementById("load-data").addEventListener("click", async function () {try {const response = await mockApiCall();console.log(response, "這時候弄-");// 更新表格數據和表頭hot.updateSettings({colHeaders: response.headers.columns,rowHeaders: response.headers.rows,});hot.loadData(response.data);exportPlugin = hot.getPlugin("exportFile");console.log("數據加載成功");} catch (error) {console.error("加載數據失敗:", error);}

3.下載表格

主要用到downloadFile和hot.getPlugin("exportFile")下載格式為csv,目前在Handsontable官網沒有看到可以下載xlsx格式的,可能需要xlsx插件

   button.addEventListener("click", () => {//下載表格的數據exportPlugin.downloadFile("csv", {bom: false,columnDelimiter: ",",columnHeaders: true,//顯示表頭exportHiddenColumns: true,exportHiddenRows: true,fileExtension: "csv",filename: "Handsontable-CSV-file_[YYYY]-[MM]-[DD]",mimeType: "text/csv",rowDelimiter: "\r\n",rowHeaders: true,});//改為下載報表接口數據});

4.完整代碼


<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>動態表格示例 - Handsontable</title><!-- <script src="./handsontable.full.min.js"></script><link rel="stylesheet" href="./handsontable.full.min.css" /> --><scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/handsontable/15.0.0/handsontable.full.min.js"integrity="sha512-3Os2SFklHFmIWzqQsBOmpA9fYBiar8ASBI4hqgeUKttdJ6lDWli7W+JmXyN8exab8NOpiYT441s6hfqX6Tx+WA=="crossorigin="anonymous"referrerpolicy="no-referrer"></script><linkrel="stylesheet"href="https://cdnjs.cloudflare.com/ajax/libs/handsontable/15.0.0/handsontable.full.min.css"integrity="sha512-reELraG6l/OUbRy0EnDh2RxkanfohOkWJX7afyUG1aGHv49SA9uqrAcJOMhyCNW6kcwbnhePc6JKcdUsQxmjvw=="crossorigin="anonymous"referrerpolicy="no-referrer"/><style>body {font-family: Arial, sans-serif;margin: 20px;}#hot-container {margin-top: 20px;}.controls {margin-bottom: 10px;}button {padding: 8px 12px;margin-right: 10px;cursor: pointer;}</style></head><body><h1>動態表格示例</h1><div class="controls"><button id="load-data">加載數據</button><button id="export-file">下載表格</button></div><div id="hot-container"></div><!-- <script src="app.js"></script> --><script type="text/javascript">let hot = null;var exportPlugin = null;function showHandsontable(param) {const container = document.getElementById("hot-container");// 如果已有實例,先銷毀if (hot) {hot.destroy();}hot = new Handsontable(container, {data: [], // 初始為空colHeaders: true, // 動態列頭rowHeaders: true, // 動態行頭width: "100%",height: 800,licenseKey: "non-commercial-and-evaluation", // 免費版許可證contextMenu: true, // 啟用右鍵菜單manualColumnResize: true, // 允許調整列寬manualRowResize: true, // 允許調整行高filters: true, // 啟用篩選dropdownMenu: true, // 啟用下拉菜單columnSorting: true, // 啟用列排序stretchH: "all", // 列寬自適應afterChange: function (changes, source) {if (source === "edit") {console.log("數據已修改:", changes);}},});}showHandsontable();// 加載數據按鈕事件document.getElementById("load-data").addEventListener("click", async function () {try {const response = await mockApiCall();console.log(response, "這時候弄-");// 更新表格數據和表頭hot.updateSettings({colHeaders: response.headers.columns,rowHeaders: response.headers.rows,});hot.loadData(response.data);exportPlugin = hot.getPlugin("exportFile");console.log("數據加載成功");} catch (error) {console.error("加載數據失敗:", error);}});function mockApiCall() {return new Promise((resolve) => {// 模擬網絡延遲setTimeout(() => {const mockData = {headers: {columns: ["ID", "姓名", "年齡", "部門", "薪資"],rows: Array.from({ length: 15 }, (_, i) => `員工${i + 1}`),},data: Array.from({ length: 15 }, (_, i) => [i + 1000,`員工${i + 1}`,Math.floor(Math.random() * 20) + 20,["研發部", "市場部", "人事部", "財務部"][Math.floor(Math.random() * 4)],(Math.random() * 10000 + 5000).toFixed(2),]),};resolve(mockData);}, 500);});}const button = document.querySelector("#export-file");button.addEventListener("click", () => {//下載表格的數據exportPlugin.downloadFile("csv", {bom: false,columnDelimiter: ",",columnHeaders: false,exportHiddenColumns: true,exportHiddenRows: true,fileExtension: "csv",filename: "Handsontable-CSV-file_[YYYY]-[MM]-[DD]",mimeType: "text/csv",rowDelimiter: "\r\n",rowHeaders: true,});//改為下載報表接口數據});</script></body>
</html>

文章到此結束,希望對你有所幫助~

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

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

相關文章

2.1 基于委托的異步編程方法

基于委托的異步編程模型是 .NET 早期版本中實現異步操作的一種方式&#xff0c;主要通過 BeginInvoke 和 EndInvoke 方法來實現。這種基于委托的異步模式已被 Task 和 async/await 模式取代&#xff0c;但在維護舊代碼時仍可能遇到這種模式。 委托的方法中&#xff1a;Invoke用…

【Bluedroid】藍牙 HID 設備信息加載與注冊機制及配置緩存系統源碼解析

本篇解析Android藍牙子系統加載配對HID設備的核心流程,通過btif_storage_load_bonded_hid_info實現從NVRAM讀取設備屬性、驗證綁定狀態、構造描述符并注冊到BTA_HH模塊。重點剖析基于ConfigCache的三層存儲架構(全局配置/持久設備/臨時設備),其通過動態持久化判定策略和LRU…

Linux 下的網絡管理(附加詳細實驗案例)

一、簡單了解 NM&#xff08;NetworkManager&#xff09; 在 Linux 中&#xff0c;NM 是 NetworkManager 的縮寫。它是一個用于管理網絡連接的守護進程和工具集。 在 RHEL9 上&#xff0c;使用 NM 進行網絡配置&#xff0c;ifcfg &#xff08;也稱為文件&#xff09;將不再…

長連接、短連接與WebSocket的基本知識

目錄 前言正文 前言 &#x1f91f; 找工作&#xff0c;來萬碼優才&#xff1a;&#x1f449; #小程序://萬碼優才/r6rqmzDaXpYkJZF 爬蟲神器&#xff0c;無代碼爬取&#xff0c;就來&#xff1a;bright.cn Java基本知識&#xff1a; java框架 零基礎從入門到精通的學習路線 附…

2026《數據結構》考研復習筆記四(緒論)

緒論 前言時間復雜度分析 前言 由于先前筆者花費約一周時間將王道《數據結構》知識點大致過了一遍&#xff0c;圈畫下來疑難知識點&#xff0c;有了大致的知識框架&#xff0c;現在的任務就是將知識點逐個理解透徹&#xff0c;并將leetcode刷題與課后刷題相結合。因此此后的過…

Vmware安裝centos7和Redis

2025最詳細vmware安裝centos 7 教程_嗶哩嗶哩_bilibili 1.上面是B站安裝Centos7參考視頻 2.安裝完成需要配置網絡 (新手教程)VMware安裝CentOS7_嗶哩嗶哩_bilibili 重啟網絡服務: ping www.baidu.com ip addr 查看ip地址 兩種重啟方式 3.關閉防火墻 依次執行如下三條命令 …

二進制部署Kubernetes1.32.4最新版本高可用集群及附加組件

一、前言 在云原生技術席卷全球的今天&#xff0c;Kubernetes&#xff08;K8s&#xff09;已成為容器編排領域的事實標準。當大家都習慣了kubeadm、kubeasz等自動化工具一鍵部署的便利時&#xff0c;選擇通過二進制方式手動搭建K8s集群更像是一場"知其然亦知其所以然&qu…

樹莓派系統中設置固定 IP

在基于 Ubuntu 的樹莓派系統中&#xff0c;設置固定 IP 地址主要有以下幾種方法&#xff1a; 方法一&#xff1a;使用 Netplan 配置&#xff08;Ubuntu 18.04 及以上版本默認使用 Netplan&#xff09; 查看網絡接口名稱 在終端輸入ip link或ip a命令&#xff0c;查看當前所使…

主流單片機與編程調試工具對應關系表梳理

單片機系列/型號 | 官方IDE/工具鏈 | 調試器/燒錄器 | 第三方支持工具 |調試接口協議 | 特點與適用場景| | STMicroelectronics (STM32) STM32全系列 STM32CubeIDE ST-LINK/V2/V3 - PlatformIO (VS Code插件) SWD/JTAG 官方集成開發環境&#xff0c;支持HAL庫&#xff0c;免費…

VulnHub-DarkHole_2靶機滲透教程

1.靶機部署 [Onepanda] Mik1ysomething 靶機下載&#xff1a;https://download.vulnhub.com/darkhole/darkhole_2.zip 直接使用VMware導入打開就行 注意&#xff1a;靶機的網絡連接模式必須和kali一樣&#xff0c;讓靶機跟kali處于同一網段&#xff0c;這樣kali才能掃出靶機…

USO服務器操作系統手動升級GCC 12.2.0版本

1. 從 GNU 官方 FTP 服務器下載 GCC 12.2.0 的源碼包&#xff0c;并解壓進入源碼目錄。 wget https://ftp.gnu.org/gnu/gcc/gcc-12.2.0/gcc-12.2.0.tar.gz tar -zxvf gcc-12.2.0.tar.gz cd gcc-12.2.0 2. 運行腳本下載并配置 GCC 編譯所需的依賴庫。此步驟會自動下載如 GMP…

設計模式基礎概念(行為模式):觀察者模式(Observer)

概述 我們可以發現這樣一個場景&#xff1a;如果你訂閱了一份雜志或報紙&#xff0c; 那就不需要再去報攤查詢新出版的刊物了。 出版社 &#xff08;即應用中的 “發布者&#xff08;publisher&#xff09;”&#xff09; 會在刊物出版后 &#xff08;甚至提前&#xff09; 直…

JavaFX實戰:從零到一實現一個功能豐富的“高級反應速度測試”游戲

大家好&#xff01;今天我們不搞簡單的“紅變綠就點”了&#xff0c;來點硬核的&#xff01;我們要用 JavaFX 從頭開始&#xff0c;構建一個更復雜、更有趣也更考驗能力的“高級反應速度測試”游戲。這個版本將引入選擇反應時 (Choice Reaction Time) 的概念——你需要在多個干…

CSS 選擇器介紹

CSS 選擇器介紹 1. 基本概念 CSS&#xff08;層疊樣式表&#xff09;是一種用于描述 HTML 或 XML 文檔外觀的語言。通過 CSS&#xff0c;可以控制網頁中元素的布局、顏色、字體等視覺效果。而 CSS 選擇器則是用來指定哪些 HTML 元素應該應用這些樣式的工具。 2. 基本選擇器 …

Vue3父子組件數據同步方法

在 Vue 3 中&#xff0c;當子組件需要修改父組件傳遞的數據副本并同步更新時&#xff0c;可以通過以下步驟實現&#xff1a; 方法 1&#xff1a;使用 v-model 和計算屬性&#xff08;實時同步&#xff09; 父組件&#xff1a; vue <template><ChildComponent v-mo…

el-table中el-input的autofocus無法自動聚焦的解決方案

需求 有一個表格展示了一些進度信息&#xff0c;進度信息可以修改&#xff0c;需要點擊進度信息旁邊的編輯按鈕時&#xff0c;把進度變為輸入框且自動聚焦&#xff0c;當鼠標失去焦點時自動請求更新接口。 注&#xff1a;本例以vue2 element UI為例 分析 這個需求看著挺簡單…

用高斯濺射技術跨越機器人模擬與現實的鴻溝:SplatSim 框架解析

在機器人領域&#xff0c;讓機器人在現實世界中精準執行任務是大家一直追求的目標。可模擬環境和現實世界之間存在著不小的差距&#xff0c;特別是基于 RGB 圖像的操作策略&#xff0c;從模擬轉移到現實時總是狀況百出。 今天咱們就來聊聊 SplatSim 框架&#xff0c;看看它是怎…

【自然語言處理與大模型】如何知道自己部署的模型的最大并行訪問數呢?

當你自己在服務器上部署好一個模型后&#xff0c;使用場景會有兩種。第一種就是你自己去玩&#xff0c;結合自有的數據做RAG等等&#xff0c;這種情況下一般是不會考慮并發的問題。第二種是將部署好的服務給到別人來使用&#xff0c;這時候就必須知道我的服務到底支持多大的訪問…

[FPGA基礎] UART篇

Xilinx FPGA UART 硬件接口使用指南 1. 引言 UART (通用異步收發器) 是一種廣泛使用的串行通信接口&#xff0c;因其簡單、可靠和易于實現而成為 Xilinx FPGA 設計中的常見硬件接口。UART 用于在 FPGA 與外部設備&#xff08;如 PC、微控制器、傳感器等&#xff09;之間進行數…

【Netty4核心原理】【全系列文章目錄】

文章目錄 一、前言二、目錄 一、前言 本系列雖說本意是作為 《Netty4 核心原理》一書的讀書筆記&#xff0c;但在實際閱讀記錄過程中加入了大量個人閱讀的理解和內容&#xff0c;因此對書中內容存在大量刪改。 本系列內容基于 Netty 4.1.73.Final 版本&#xff0c;如下&#xf…