傳統項目純前端實現導出excel之xlsx.bundle.js

傳統項目純前端實現導出excel之xlsx.js

?
????自從vue問世后,使得前端開發更加簡潔從容,極大的豐富組件樣式和頁面渲染效果,使得前端功能的可擴展性得到極大地加強。雖然vue的使用對于前后端分離的項目對于功能實現與擴展有了質的飛躍,但仍舊有些傳統的項目步履維艱,功能延伸性開發束手束腳,效率相對低下,就比如在某些mvc+jsp頁面要實現excel的導出功能,有時候會后端框架封裝的約束,這個時候直接在前端實現excel導出,就變的極為方便。本文介紹一款js插件——xlsx.bundle.js

一、簡介

xlsx.bundle.js 是一個與 xlsx 或 xlsx-js-style 等庫相關的 JavaScript 文件,通常用于在前端實現 Excel 文件的讀取、創建和導出等功能。

二、功能和用途

  1. 文件讀取與寫入:xlsx.bundle.js 提供了讀取和寫入 Excel 文件的功能,支持多種格式,如 .xlsx、.xls、.csv 等。
  2. 表格樣式設置:結合 xlsx-js-style,可以為表格設置樣式,例如字體、對齊方式、邊框、背景顏色等。
  3. 單元格合并:支持合并單元格操作,可以通過指定范圍來合并單元格。
  4. 數據處理:可以對表格中的數據進行處理,例如添加公式、數據驗證等。
  5. 前端導出:可以直接在前端將數據導出為 Excel 文件,無需后端支持

三、excel導出示例

3.1 xlsx.bundle.js 下載及引入

下載到本地后進行使用,從github上下載,然后把其中的文件xlsx.bundle.js 拷貝你的項目,在項目中引入即可使用。

<script src="dist/xlsx.bundle.js"></script>

3.2 xlsx.bundle.js 使用

1.獲取dom元素

const tree = mini.get("excel-dom");

2.展開數據
由于此處要導出的數據是一個樹形的列表,因此需要將數據進行展開為同一維度。如果使用的數據不是樹形列表,可以忽略此步驟。

    const nodes = tree.getData(true); // 獲取所有展開的節點// 展平數據const flatNodes = flattenTasks(nodes);

3、轉為二維數組并添加序號

  // 轉換為二維數組,并添加序號let data = [["易耗物資消耗匯總統計表", "", "", "", "", "", "", "", ""],["類型:", "", "", "", "部門:", "", "", "統計期:", ""],["序號", "編號", "名稱", "規格型號", "單位", "平均單價", "去年同期消耗數量", "本期消耗數量", "本期與去年同期比較"]];flatNodes.forEach(function (node, index) {data.push([index + 1, node.code, node.name, node.type, node.unit, node.price, node.lastCostNum, node.currentCostNum, node.differenceValue]);});

4.創建工作簿并調整列寬

 // 創建工作簿對象const workbook = XLSX.utils.book_new();// 將二維數組轉換為worksheetconst worksheet = XLSX.utils.aoa_to_sheet(data);// 自動調整列寬autoFitColumns(worksheet, data);

5.表頭合并

 // 定義表頭合并區域worksheet['!merges'] = [{s: {r: 0, c: 0}, e: {r: 0, c: 8}}, // 序號{s: {r: 1, c: 1}, e: {r: 1, c: 3}}, // 橫向合并(第一行的二三四列合并){s: {r: 1, c: 5}, e: {r: 1, c: 6}}, // 橫向合并 (第一行的六七兩列合并)];

s:表示開始,e:表示結束
r:表示行 (索引從0開始表示第一行) c:表示列(索引從0開始表示第一列)

6.excel行高設置

 // 動態設置行高let colWidths = worksheet['!cols'];worksheet['!rows'] = [];for (let i = 0; i < data.length; i++) {if (i == 0) {worksheet['!rows'].push({hpt: 35}); // 表頭行} else if (i == 1) {worksheet['!rows'].push({hpt: 20});  // 第2行行高設置} else {//動態計算行高let calculateLen = 1;for (let j = 0; j < data[i].length; j++) {const cellValue = data[i][j] === null ? '' : data[i][j];const cellLength = calculateCellWidth((cellValue + ""));const colWidth = colWidths[j] ? colWidths[j].wch : 10;const lines = Math.ceil(cellLength / colWidth);const maxLines = Math.max(1, lines);calculateLen = calculateLen > maxLines ? calculateLen : maxLines;}worksheet['!rows'].push({hpt: 18 * calculateLen}); // 設置行高}}

7、設置所有單元格的邊框樣式和對齊方式

    // 設置所有單元格的邊框樣式和對齊方式const range = XLSX.utils.decode_range(worksheet['!ref']);for (let R = range.s.r; R <= range.e.r; ++R) {for (let C = range.s.c; C <= range.e.c; ++C) {const cell_ref = XLSX.utils.encode_cell({r: R, c: C});if (!worksheet[cell_ref]) {continue;}// 設置單元格樣式worksheet[cell_ref].s = {border: {top: R >= 2 ? {style: "thin", color: {rgb: "000"}} : "",bottom: R >= 2 ? {style: "thin", color: {rgb: "000"}} : "",left: R >= 2 ? {style: "thin", color: {rgb: "000"}} : "",right: R >= 2 ? {style: "thin", color: {rgb: "000"}} : ""},alignment: {// horizontal: R === 0 || R === 2 || R === 3 ? 'center' : 'left', // 表頭居中,數據區域左對齊horizontal: (R === 0 || R === 2  || (cell_ref.startsWith('A') && cell_ref !== 'A2')) ? 'center' :(cell_ref === 'A2' || cell_ref === 'E2' ||  cell_ref === 'H2') ? 'right' : 'left',vertical: 'center', // 垂直對齊方式wrapText: true // 啟用自動換行},font: {name: R == 1 ? '宋體' : 'Calibri', //第二行使用宋體,其他行使用Calibrisz: R === 0 ? 16 : (R === 2 ) ? 14 : 12,bold: R === 0 ? true : (cell_ref === 'A2' || cell_ref === 'E2' ||  cell_ref === 'H2') ? true : false,color: {rgb: "000000"}},};}}

8、添加worksheet到workbook并輸出文件

 // 添加worksheet到workbookXLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');try {XLSX.writeFile(workbook, '易耗物資消耗匯總統計表.xlsx'); // 導出 workbook} catch (error) {console.error('Error writing Excel file:', error);}

9.其他相關函數


/*** 將嵌套的數組轉換為平面列表* 該函數通過遞歸遍歷每個任務及其子任務(如果存在),并將它們的信息提取到一個新的數組中* @param {Array} tasks - 嵌套的任務對象數組,每個任務對象可能包含一個子任務數組* @returns {Array} - 包含所有任務信息的平面列表數組,不包含任何嵌套結構*/
function flattenTasks(tasks) {let flatList = [];tasks.forEach(task => {// 將當前任務的相關屬性提取到一個新對象中,并添加到展平列表中flatList.push({id: task.id,code: task.code,name: task.name,type: task.type,unit: task.unit,price: task.price,lastCostNum: task.lastCostNum,currentCostNum: task.currentCostNum,differenceValue: task.differenceValue,});// 如果當前任務有子任務,則遞歸調用flattenTasks,并將結果合并到展平列表中if (task.children && task.children.length > 0) {flatList = flatList.concat(flattenTasks(task.children));}});return flatList;
}/*** 自動調整列寬* @param ws 工作表* @param data 數據*/
function autoFitColumns(ws, data) {const colWidths = data[0].map((_, i) => {return data.reduce((max, row) => {const cellValue = row[i] === null ? '' : row[i];const cellLength = calculateCellWidth(cellValue + "");return Math.max(max, cellLength);}, 10); // Minimum width of 10 characters});//自定義列寬if(colWidths){colWidths[0] = 12;colWidths[1] = 15;colWidths[5] = 13;colWidths[6] = 24;colWidths[7] = 18;colWidths[8] = 24;}ws['!cols'] = colWidths.map(width => ({wch: width}));
}/*** 計算單元格寬度* @param value 值* @returns {number} 列寬(磅)*/
function calculateCellWidth(value) {// 判斷是否為null或undefinedif (value == null) {return 10;} else if (/.*[\u4e00-\u9fa5]+.*$/.test(value)) {// 中文的長度const chineseLength = value.match(/[\u4e00-\u9fa5]/g).length;// 其他不是中文的長度const otherLength = value.length - chineseLength;return chineseLength * 2.1 + otherLength * 1.1;} else {return value.toString().length * 1.1;}
}

導出效果如下
在這里插入圖片描述

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

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

相關文章

2025.04.10-拼多多春招筆試第四題

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍OJ 04. 優惠券最優分配問題 問題描述 LYA是一家電商平臺的運營經理,負責促銷活動的策劃。現在平臺上有 n n n

基于 Spring Boot 瑞吉外賣系統開發(三)

基于 Spring Boot 瑞吉外賣系統開發&#xff08;三&#xff09; 分類列表 靜態頁面 實現功能所需要的接口 定義Mapper接口 Mapper public interface CategoryMapper extends BaseMapper<Category> {}定義Service接口 public interface CategoryService extends ISe…

FlinkSQL的常用語言

FlinkSQL 常用語言指南 FlinkSQL 是 Apache Flink 提供的 SQL 接口&#xff0c;允許用戶使用標準 SQL 或擴展的 SQL 語法來處理流式和批式數據。以下是 FlinkSQL 的常用語言元素和操作&#xff1a; 基本查詢 -- 選擇查詢 SELECT * FROM table_name;-- 帶條件的查詢 SELECT c…

spring mvc異步請求 sse 大文件下載 斷點續傳下載Range

學習連接 異步Servlet3.0 Spring Boot 處理異步請求&#xff08;DeferredResult 基礎案例、DeferredResult 超時案例、DeferredResult 擴展案例、DeferredResult 方法匯總&#xff09; spring.io mvc Asynchronous Requests 官網文檔 spring.io webflux&webclient官網文…

一問看懂——支持向量機SVM(Support Vector Machine)

目錄 蕪湖~~~支持向量機&#xff08;SVM&#xff09; 1. 引言 2. 基本思想 3. 數學模型 3.1 超平面定義 3.2 分類間隔與目標函數 3.3 軟間隔與松弛變量 4. 核函數方法&#xff08;Kernel Trick&#xff09; 4.1 核函數定義 4.2 常用核函數 5. SVM 的幾種類型 6. SV…

藍橋杯 拼數(字符串大小比較)

題目描述 設有 n 個正整數 a1?…an?&#xff0c;將它們聯接成一排&#xff0c;相鄰數字首尾相接&#xff0c;組成一個最大的整數。 輸入格式 第一行有一個整數&#xff0c;表示數字個數 n。 第二行有 n 個整數&#xff0c;表示給出的 n 個整數 ai?。 輸出格式 一個正整…

Elasticsearch 系列專題 - 第三篇:搜索與查詢

搜索是 Elasticsearch 的核心功能之一。本篇將介紹如何構建高效的查詢、優化搜索結果,以及調整相關性評分,幫助你充分發揮 Elasticsearch 的搜索能力。 1. 基礎查詢 1.1 Match Query 與 Term Query 的區別 Match Query:用于全文搜索,會對查詢詞進行分詞。 GET /my_index/_…

本地電腦使用sshuttle命令將網絡流量代理到ssh連接的電腦去實現訪問受限網絡

本地電腦使用sshuttle命令將網絡流量代理到ssh連接的電腦去實現訪問受限網絡 安裝使用 工作過程中, 經常會遇到, 需要訪問客戶內網環境的問題, 一般都需要安轉各式各樣的VPN客戶端到本地電腦上, 軟件多了也會造成困擾, 所有, 找了一款還不錯的命令工具去解決這個痛點 安裝 官方…

雙相機結合halcon的條碼檢測

以下是針對提供的C#代碼的詳細注釋和解釋&#xff0c;結合Halcon庫的功能和代碼結構進行說明&#xff1a; --- ### **代碼整體結構** 該代碼是一個基于Halcon庫的條碼掃描類GeneralBarcodeScan&#xff0c;支持單臺或雙臺相機的條碼檢測&#xff0c;并通過回調接口返回結果。…

python基礎語法12-迭代器與生成器

Python 生成器與迭代器詳解 在 Python 中&#xff0c;生成器和迭代器是處理大量數據時的強大工具。它們能夠幫助我們節省內存&#xff0c;避免一次性加載過多數據。生成器通過 yield 關鍵字實現&#xff0c;允許我們逐步產生數據&#xff0c;而迭代器通過實現特定的接口&#…

公司內部建立pypi源

有一篇建立apt源的文章在這里&#xff0c;需要的可以查看&#xff1a;公司內部建立apt源-CSDN博客 server: pip install pypiserver mkdir -d pypi/packages cp test.whl pypi/packages pypi-server run --port 8080 /home/xu/pypi/packages & 網頁訪問&#xff1a;http:…

VMware Workstation/Player 的詳細安裝使用指南

以下是 VMware Workstation/Player 的完整下載、安裝指南&#xff0c;包含詳細步驟、常見問題及解決方法&#xff0c;以及進階使用技巧&#xff0c;適用于 Windows 和 macOS 用戶。 VMware Workstation/Player 的詳細安裝使用指南—目錄 一、下載與安裝詳細指南1. 系統要求2. 下…

藍橋杯python組考前準備

1.保留k位小數 round(10/3, 2) # 第二個參數表示保留幾位小數 2.輸入代替方案&#xff08;加速讀取&#xff09; import sys n int(sys.stdin.readline()) # 讀取整數&#xff08;不加int就是字符串&#xff09; a, b map(int, sys.stdin.readline().split()) # 一行讀取多個…

【JSON2WEB】16 login.html 登錄密碼加密傳輸

【JSON2WEB】系列目錄 【JSON2WEB】01 WEB管理信息系統架構設計 【JSON2WEB】02 JSON2WEB初步UI設計 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代碼前端框架介紹 【JSON2WEB】05 前端開發三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…

計算機網絡起源

互聯網的起源和發展是一個充滿創新、突破和變革的歷程&#xff0c;從20世紀60年代到1989年&#xff0c;這段時期為互聯網的誕生和普及奠定了堅實的基礎。讓我們詳細回顧這一段激動人心的歷史。 計算機的發展與ARPANET的建立&#xff08;20世紀60年代&#xff09; 互聯網的誕生…

洛谷P1824進擊的奶牛簡單二分

題目如下 代碼如下 謝謝觀看

如何建立高效的會議機制

建立高效的會議機制需做到&#xff1a;明確會議目標、制定并提前分發議程、控制會議時長、確保有效溝通與反饋、及時跟進執行情況。其中&#xff0c;明確會議目標是核心關鍵&#xff0c;它直接決定了會議的方向與效率。只有明確目標&#xff0c;會議才不會偏離初衷&#xff0c;…

開源AI大模型AI智能名片S2B2C商城小程序:科技浪潮下的商業新引擎

摘要&#xff1a; 本文聚焦于科技迅猛發展背景下&#xff0c;開源AI大模型、AI智能名片與S2B2C商城小程序的融合應用。通過分析元宇宙、人工智能、區塊鏈、5G等前沿科技帶來的商業變革&#xff0c;闡述開源AI大模型AI智能名片S2B2C商城小程序在整合資源、優化服務、提升用戶體驗…

基于大模型構建金融客服的技術調研

OpenAI-SB api接口 https://openai-sb.com/ ChatGPT與Knowledge Graph (知識圖譜)分享交流 https://www.bilibili.com/video/BV1bo4y1w72m/?spm_id_from333.337.search-card.all.click&vd_source569ef4f891360f2119ace98abae09f3f 《要研究的方向和準備》 https://ww…

WSA(Windows Subsystem for Android)安裝LSPosed和應用教程

windows安卓子系統WSA的Lsposed和shamiko的安裝教程 WSA(Windows Subsystem for Android)安裝LSPosed和應用教程 一、環境準備 在開始之前,請確保: 已經安裝好WSA(Windows Subsystem for Android)已經安裝好ADB工具下載好LSPosed和Shamiko框架安裝包 二、連接WSA 首先需要…