前端插件使用xlsx-populate,花樣配置excel內容,根據坐添加標替換excel內容,修改顏色,合并單元格...。

需求要求:業務人員有個非常復雜得excel表格,各種表頭等,但是模板是固定得。當然也可以實現在excel上搞出各種表格,但是不如直接用已有模板替換其中要動態得內容方便,這里我們用到CSDN得?xlsx-populate? 插件。

實列中我們使用node做一個服務

一、首先創建一個空白文件夾??my-xlsx-populate

1、創建index.html文件

這里得html主要用來點擊操作作用

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Excel 文件處理</title><style>body {font-family: Arial, sans-serif;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;background-color: #f4f4f9;}button {padding: 10px 20px;background-color: #007BFF;color: #fff;border: none;border-radius: 4px;cursor: pointer;}button:hover {background-color: #0056b3;}</style>
</head><body><button id="processButton">處理文件</button><script>const processButton = document.getElementById('processButton');processButton.addEventListener('click', async () => {try {const response = await fetch('/process', {method: 'POST',headers: {'Content-Type': 'application/json'}});if (response.ok) {const blob = await response.blob();const url = window.URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = '修改后.xlsx';a.click();window.URL.revokeObjectURL(url);} else {const errorText = await response.text();alert(`處理文件時出錯: ${errorText}`);}} catch (error) {alert(`網絡請求出錯: ${error.message}`);}});</script>
</body></html>

1、創建server.js文件

const express = require('express');
const XlsxPopulate = require('xlsx-populate');
const path = require('path');
const fs = require('fs');const app = express();// 檢查 uploads 目錄是否存在,不存在則創建
const uploadDir = path.join(__dirname, 'uploads');
if (!fs.existsSync(uploadDir)) {fs.mkdirSync(uploadDir);
}// 處理靜態文件,使得前端頁面可以被訪問
app.use(express.static(__dirname));// 處理文件處理請求
app.post('/process', async (req, res) => {try {// 獲取 uploads 目錄下的所有文件const files = fs.readdirSync(uploadDir);if (files.length === 0) {console.error('uploads 目錄中沒有文件');return res.status(400).send('uploads 目錄中沒有文件');}// 選擇第一個文件進行處理const selectedFile = path.join(uploadDir, files[0]);console.log('選定文件:', selectedFile);// 檢查文件擴展名const fileExtension = path.extname(selectedFile).toLowerCase();if (fileExtension !== '.xlsx') {console.error('文件擴展名不正確:', fileExtension);return res.status(400).send('僅支持 .xlsx 文件');}try {// 檢查文件是否可讀fs.accessSync(selectedFile, fs.constants.R_OK);// 讀取 Excel 文件const workbook = await XlsxPopulate.fromFileAsync(selectedFile);console.log('成功讀取文件:', selectedFile);const sheet = workbook.sheet(0);// 獲取第一行const firstRow = sheet.row(1);// 示例修改:在 A1 單元格寫入特定文本sheet.cell('B1').value('此文件已被處理');sheet.cell('F9').value(22.00);sheet.cell('C9').value('測試文件內容替換');// 生成修改后的文件路徑const outputPath = path.join(__dirname, 'output.xlsx');await workbook.toFileAsync(outputPath);// 檢查修改后的文件是否存在if (!fs.existsSync(outputPath)) {console.error('修改后的文件未生成:', outputPath);return res.status(500).send('修改后的文件未生成');}// 對文件名進行嚴格編碼const originalFileName = '修改后.xlsx';const encodedFileName = encodeURIComponent(originalFileName).replace(/'/g, '%27');// 設置響應頭res.setHeader('Content-Disposition', `attachment; filename="${encodedFileName}"`);res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');// 發送修改后的文件給客戶端下載res.download(outputPath, originalFileName, async (err) => {if (err) {console.error('下載文件時出錯:', err);res.status(500).send('下載文件時出錯');}try {// 刪除臨時文件if (fs.existsSync(selectedFile)) {fs.unlinkSync(selectedFile);}if (fs.existsSync(outputPath)) {fs.unlinkSync(outputPath);}} catch (unlinkErr) {console.error('刪除臨時文件時出錯:', unlinkErr);}});} catch (parseError) {console.error('解析 Excel 文件時出錯:', parseError.message);res.status(500).send(`解析 Excel 文件時出錯,請檢查文件是否損壞或格式是否正確: ${parseError.message}`);}} catch (error) {console.error('處理文件時出錯:', error.message);res.status(500).send(`處理文件時出錯: ${error.message}`);}
});// 啟動服務器
const port = 3000;
app.listen(port, () => {console.log(`服務器運行在端口 ${port}`);
});

3.my-xlsx-populate目錄中下創建uploads文件里面存放 .xlxs文件模板

3.my-xlsx-populate目錄中右鍵打開CMD

安裝依賴:

npm init -y
npm install express multer xlsx-populate
具體結構:

啟動服務器:運行?server.js?文件

node server.js

?打開頁面

在瀏覽器中訪問?http://localhost:3000

運行后下載文件打開:

server.js中代碼對應exce代碼中得坐標

下面我們會詳細介紹一下?xlsx-populate ,這做效果演示

下載修改完得excel文件

xlsx-populate介紹

xlsx-populate 主要是為 Node.js 環境設計的,因為它依賴于一些僅在 Node.js 環境中可用的功能和庫,比如文件系統訪問(fs 模塊)等。這意味著它不能直接在瀏覽器端的 JavaScript 中使用,因為瀏覽器環境缺乏對本地文件系統的直接訪問權限,并且存在安全限制。

生產環境中Linux中可以使用pm2來運行server.js文件保持node運行。

主要功能

  • 讀寫Excel文件:可以打開現有的 .xlsx 文件進行編輯或創建新的文件。
  • 數據處理:支持對單元格的數據進行各種操作,如設置值、公式計算等。
  • 格式調整:能夠修改單元格的樣式,包括字體大小、顏色、背景色等。
  • 圖片插入:支持在工作表中添加圖片。
  • 圖表支持:可以在工作表內生成圖表。

  1. 示例修改:在單元格寫入特定文本
            sheet.cell('B1').value('此文件已被處理');sheet.cell('F9').value(22.00);sheet.cell('C9').value('測試文件內容替換');   

??

? 2.?設置公式
sheet.cell('D1').formula('SUM(F9:F10)');
3.設置樣式
sheet.cell('B1').style({fontColor: 'FF0000', // 紅色bold: true,horizontalAlignment: 'center'
});

3.插入圖片
const fs = require('fs');
const imageBuffer = fs.readFileSync('path/to/image.png');sheet.addImage({image: imageBuffer,type: 'picture',position: {x: 5, // 列號y: 5, // 行號}
});

4.添加或刪除行/列
// 添加一行在第3行的位置
sheet.insertRow(3);// 刪除第4行
sheet.deleteRow(4);

5.設置列寬和行高
// 設置列寬
sheet.column('C').width(20);// 設置行高
sheet.row(9).height(30);

更多高級和實用的操作方法:

6.?數據驗證(Data Validation)

你可以為單元格添加數據驗證規則。

sheet.cell('A1').dataValidation({type: 'list',allowBlank: true,formula1: '"Apple,Banana,Cherry"'
});
7.條件格式(Conditional Formatting)

為單元格或范圍設置條件格式。

sheet.range('A1:A10').conditionalFormat({type: 'cellIs',operator: 'greaterThan',formula: 50,style: {fill: 'FFFF00' // 黃色背景}
});

8.添加圖表

可以在工作表中插入圖表。

sheet.addChart({type: 'column', // 圖表類型range: sheet.range('A1:B10'), // 數據范圍position: {x: 12, // 列號y: 12  // 行號},width: 400,height: 300
});
9.?復制和移動區域

可以復制或移動指定的區域。

// 復制 A1:B2 區域到 C3
sheet.range('A1:B2').copyTo(sheet.range('C3'));// 移動 A1:B2 區域到 D4
sheet.range('A1:B2').moveTo(sheet.range('D4'));
10.獲取單元格值和屬性

獲取特定單元格的值、公式或其他屬性。

const value = sheet.cell('A1').value(); // 獲取單元格值
const formula = sheet.cell('A1').formula(); // 獲取單元格公式
const style = sheet.cell('A1').style(); // 獲取單元格樣式
11.批量操作

使用批量操作可以提高性能,尤其是在處理大量數據時。

sheet.batch(() => {for (let i = 1; i <= 100; i++) {sheet.cell(`A${i}`).value(i);}
});
12.設置頁眉和頁腳、

可以為工作表設置頁眉和頁腳。

sheet.headerFooter({oddHeader: '&C&"Arial,Bold"Page &P of &N',oddFooter: '&L&"Arial,Italic"Confidential&R&D&T'
});
13.?設置打印區域

可以指定打印區域和打印標題行/列。

sheet.printArea('A1:D20'); // 設置打印區域
sheet.printTitles({rows: '1:1', // 設置第一行為標題行columns: 'A:A' // 設置第一列為標題列
});
14.保存到流(Stream)

可以將修改后的文件保存到一個流中,而不是直接保存到文件系統。

const fs = require('fs');
const writeStream = fs.createWriteStream('output.xlsx');workbook.toStream().pipe(writeStream);
15.凍結窗格

你可以設置工作表中的凍結窗格,方便查看大量數據時固定某些行或列。

sheet.freezePanes('B2'); // 凍結 B2 左上方的所有單元格
16.隱藏行列

可以隱藏指定的行或列。

// 隱藏第3行
sheet.row(3).hidden(true);// 隱藏第C列
sheet.column('C').hidden(true);
17.保護工作表

可以設置工作表的保護功能,防止未經授權的修改。

sheet.protect({password: 'your-password',selectLockedCells: false,selectUnlockedCells: true
});
18.?設置超鏈接

可以在單元格中插入超鏈接。

sheet.cell('A1').hyperlink('https://www.example.com');
sheet.cell('A1').value('點擊這里訪問 Example.com');
19.設置注釋

可以為單元格添加注釋。

sheet.cell('A1').comment({text: '這是一個示例注釋',author: '作者名字'
});
20.?批量設置樣式

可以通過 range 方法對多個單元格應用相同的樣式。

sheet.range('A1:C3').style({fontColor: '0000FF', // 藍色字體bold: true,horizontalAlignment: 'center'
});
21.設置單元格類型

可以設置單元格的數據類型(如日期、數字、文本等)。

sheet.cell('A1').type('date'); // 設置單元格為日期類型
sheet.cell('A1').value(new Date()); // 設置當前日期sheet.cell('B1').type('number'); // 設置單元格為數字類型
sheet.cell('B1').value(12345); // 設置數值
22.導入和導出 JSON 數據

可以從 JSON 數據導入到 Excel 文件,或者將 Excel 文件導出為 JSON 數據。

// 導入 JSON 數據到 A1 開始的區域
const jsonData = [{ "Name": "John", "Age": 30, "City": "New York" },{ "Name": "Anna", "Age": 22, "City": "London" }
];
sheet.importData(jsonData, 'A1');// 將 A1 開始的區域導出為 JSON 數據
const exportedData = sheet.exportData('A1:C3');
console.log(exportedData);

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

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

相關文章

未來AI方向落地場景:小語言模型,super_private_agent

未來AI方向落地場景:小語言模型,super_private_agent 目錄 未來AI方向落地場景:小語言模型,super_private_agent小語言模型super - private - agent(注重隱私的智能代理)碳基生命和硅基生命交互界面面向agent的專用交互協議和數據接口從web平臺經濟到網絡平臺舉例說明社交…

Coze扣子新功能詳解

今晚(2025-01-24)扣子再次進行更新 主要更新內容&#xff1a; 搭建小程序和 H5 用戶界面時&#xff0c;支持使用音頻組件播放音頻內容 數據庫操作體驗提升 界面優化&#xff1a;對數據庫詳情界面進行了重新設計&#xff0c;并將工作流運行數據庫的測試數據位置從原工作流底…

匯能感知的光譜相機/模塊產品有哪些?

CM020A 分辨率&#xff1a;1600H1200V 光譜范圍&#xff1a;350~950nm 光譜分辨率&#xff1a;1nm 接口&#xff1a;USB2.0 幀率&#xff1a;16001200 (6幀) 輸出格式&#xff1a;Raw 8bit FOV&#xff1a;D73.5H58.8V44.1 相機尺寸&#xff1a;505055mm VM02S10 分辨率…

Ollama 本地GUI客戶端:為DeepSeek用戶量身定制的智能模型管理與交互工具

Ollama 本地GUI客戶端&#xff1a;為DeepSeek用戶量身定制的智能模型管理與交互工具 相關資源文件已經打包成EXE文件&#xff0c;可雙擊直接運行程序&#xff0c;且文章末尾已附上相關源碼&#xff0c;以供大家學習交流&#xff0c;博主主頁還有更多Python相關程序案例&#xf…

OpenMv識別色塊通過串口發給STM32

硬件連接 1、Openmv端 這里OpenMV端僅作為數據的發送端,所以只需要共地,以及OpenMV的TX(P4)與開發板的RX端連接即可。 2、STM32端 將開發板連接STM芯片RX端與轉串口TX端的跳帽取下,再將OpenMV的TX端(P4)與STM的RX連接。如果使用USB轉TTL則將TTL的RX端與STM的TX端連接…

以太網交換基礎(涵蓋二層轉發原理和MAC表的學習)

在當今的網絡世界中&#xff0c;以太網交換技術是局域網&#xff08;LAN&#xff09;的核心組成部分。無論是企業網絡、學校網絡還是家庭網絡&#xff0c;以太網交換機都扮演著至關重要的角色。本文將詳細介紹以太網交換的基礎知識&#xff0c;包括以太網協議、幀格式、MAC地址…

菜鳥之路Day15一一IO流(一)

菜鳥之路Day15一一IO流&#xff08;一&#xff09; 作者&#xff1a;blue 時間&#xff1a;2025.2.8 文章目錄 菜鳥之路Day15一一IO流&#xff08;一&#xff09;0.概述1.初識IO流1.1.什么是IO流&#xff1f;1.2.IO流的作用1.3.IO流的分類 2.IO流的體系結構3.字節輸出流的基本…

汽車零部件開發應該具備哪些編程思維?

目錄 1、功能安全思維 2、實時性與確定性思維 3、可靠性和冗余思維 4、硬件軟件協同思維 5、CAN總線通信思維 6、故障診斷和自診斷思維 7、功耗優化思維 8、軟件更新和版本管理思維 9、用戶體驗與安全性思維 汽車零部件開發中&#xff0c;嵌入式軟件在車輛系統中的作用…

idea拉取合并后的分支

文章目錄 遠程拉取代碼.更新本地庫拉取后本地庫就有了合并后的代碼 遠程拉取代碼.更新本地庫 拉取后本地庫就有了合并后的代碼

1-18 GIT設置公鑰

1-1 GIT如何設置公鑰 1.0 注冊賬號 這個應該都是會的&#xff0c;就不做介紹了 2.0 設置公鑰 PWD的作用是查看文件的路徑 ssh-keygen -t ed25519 -C "Gitee SSH Key" 讀取公鑰文件&#xff1a; cat ~/.ssh/id_ed25519.pub 3.0 測試 查看綁定的用戶名和郵箱&#xff1…

【MySQL】 常見數據類型

MySQL常見數據類型 1.整數類型2.浮點數類型3.定點數類型4.bit類型5.字符串類型 5.1char和varchar類型5.2日期類型和時間類型5.3enum和set類型 1.整數類型 整數類型默認都是有符號整數 類型名稱 字節數 類型說明 tinyint 1 帶符號的范圍-128127&#xff0c;無符號范圍…

DeepSeek 部署中的常見問題及解決方案

DeepSeek 作為一款智能語義搜索框架&#xff0c;其本地化部署在實際操作中可能因環境配置、權限管理、硬件資源等因素遇到多種問題。本文結合當前市面上的實踐經驗&#xff0c;整合了部署中的常見問題及解決方案&#xff0c;幫助用戶高效排查和優化部署流程。 一、權限不足問題…

《機器學習數學基礎》補充資料:求解線性方程組的克拉默法則

《機器學習數學基礎》中并沒有將解線性方程組作為重點&#xff0c;只是在第2章2.4.2節做了比較完整的概述。這是因為&#xff0c;如果用程序求解線性方程組&#xff0c;相對于高等數學教材中強調的手工求解&#xff0c;要簡單得多了。 本文是關于線性方程組的拓展&#xff0c;供…

Jenkins介紹

什么是Jenkins Jenkins 是一個開源的自動化服務器&#xff0c;主要用于持續集成和持續交付&#xff08;CI/CD&#xff09;。它幫助開發團隊自動化構建、測試和部署軟件&#xff0c;從而提高開發效率和軟件質量。 如果一個系統是前后端分離的開發模式&#xff0c;在集成階段會需…

module ‘cv2.dnn‘ has no attribute ‘DictValue‘解決辦法

module ‘cv2.dnn‘ has no attribute ‘DictValue‘解決辦法 pip install opencv-python4.7.0.72 -i https://pypi.tuna.tsinghua.edu.cn/simple 測試&#xff1a; python -c"import cv2"

【全棧】SprintBoot+vue3迷你商城-細節解析(2):分頁

【全棧】SprintBootvue3迷你商城-細節解析&#xff08;2&#xff09;&#xff1a;分頁 往期的文章都在這里啦&#xff0c;大家有興趣可以看一下 后端部分&#xff1a; 【全棧】SprintBootvue3迷你商城&#xff08;1&#xff09; 【全棧】SprintBootvue3迷你商城&#xff08;…

kubeadm拉起的k8s集群證書過期的做法集群已奔潰也可以解決

kubeadm拉起的k8s集群證書過期的做法 這個是很久之前遇到的了&#xff0c;今天有空&#xff08;心血來潮&#xff09;就都回憶回憶寫在這里為愛發光&#xff0c;部分內容來自arch先生&#xff08;死黨&#xff09;的幫助。有時候有很多部門提了建k8s的需求&#xff0c;有些是臨…

Webpack 基礎入門

一、Webpack 是什么 Webpack 是一款現代 JavaScript 應用程序的靜態模塊打包工具。在 Web 開發中&#xff0c;我們的項目會包含各種類型的文件&#xff0c;如 JavaScript、CSS、圖片等。Webpack 可以將這些文件打包成一個或多個文件&#xff0c;以便在瀏覽器中高效加載。它就像…

torchsparse安裝過程的問題

1、項目要求torchsparse githttps://github.com/mit-han-lab/torchsparse.gitv1.4.0 2、torch1.8.1cu111 nvcc--version&#xff1a;11.1 這個版本的cuda匹配的gcc、g經常是7.5。設置為7.5. &#xff08;這個gcc、g版本修改不一定&#xff0c;可以先進行后面的&#xff0c…

嵌入式音視頻開發(二)ffmpeg音視頻同步

系列文章目錄 嵌入式音視頻開發&#xff08;零&#xff09;移植ffmpeg及推流測試 嵌入式音視頻開發&#xff08;一&#xff09;ffmpeg框架及內核解析 嵌入式音視頻開發&#xff08;二&#xff09;ffmpeg音視頻同步 嵌入式音視頻開發&#xff08;三&#xff09;直播協議及編碼器…