Vue3 + Vite + TS,使用 ExcelJS導出excel文檔,生成水印,添加背景水印,dom轉圖片,插入圖片,全部代碼

Vue3 + Vite + TS,使用 ExcelJS導出excel文檔,生成水印,添加背景水印,dom轉圖片,插入圖片,全部代碼

  • ExcelJS
    • 生成文檔并導出
      • 導出表頭其他函數
    • 生成水印
    • 設置文檔的背景水印
    • dom 轉圖片
    • 插入圖片
    • 全部代碼

ExcelJS

讀取,操作并寫入電子表格數據和樣式到 XLSX 和 JSON 文件。
一個 Excel 電子表格文件逆向工程項目。
exceljs 中文API 傳送門

生成文檔并導出

import * as ExcelJS from "exceljs";// 創建文檔對象
const workbook = new ExcelJS.Workbook();
// 創建工作本
const worksheet = workbook.addWorksheet('Sheet 1');
// 凍結表頭
worksheet.views = [{state: 'frozen', // 可以設置為 'frozen' 來固定首行或首列,模擬滾動條效果xSplit: 0, // 從第二列開始凍結(模擬滾動條效果)ySplit: 9, // 從第二行開始凍結(模擬滾動條效果)topLeftCell: 'A1' // 設置起始位置為 B2,模擬滾動效果從第二行第二列開始
}];
// 1. 構建表頭結構
const headerDepth = buildHeaders(filterColumns,7);
// 遞歸生成表頭行
generateHeaderRows(worksheet,headerDepth,filterColumns,7);
// 2. 填充數據
// salesTable.value.tableData.forEach(item => {
//     worksheet.addRows(item);
// })
// 觸發下載
const buffer = await workbook.xlsx.writeBuffer();
const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = name+'.xlsx';
link.click();

導出表頭其他函數

// 遞歸生成表頭行
export const generateHeaderRows = (worksheet:Worksheet,headerDepth:number,cols:tableColumn[], currentRow = 0, startCol = 0) => {cols.forEach(col => {const cell = {header: col.label,key: col.dataIndex,width: col.minWidth?parseInt(col.minWidth)/8 : 20,colSpan: col.childrens ? col.childrens.length : 1,rowSpan: col.childrens ? 1 : headerDepth - currentRow + 1};const tempCell = worksheet.getCell(currentRow + 1, startCol + 1);// 設置單元格文案tempCell.value = col.label;// 設置單元格字體與大小tempCell.font = { name: 'Arial', size: 10 }// 設置列寬度worksheet.getColumn(startCol+1).width = cell.width;// 設置行高worksheet.getRow(currentRow+1).height = 20;// 合并單元格worksheet.mergeCells(currentRow + 1,startCol + 1,currentRow + (cell.rowSpan || currentRow+1), startCol + (cell.colSpan || 1));// 有子級遞歸if (col.childrens) {generateHeaderRows(worksheet,headerDepth,col.childrens, currentRow + 1, startCol);}startCol += cell.colSpan;});
}// 遞歸處理表頭層級
export const buildHeaders = (columns:tableColumn[], depth = 0, parentSpan = 0) => {let maxDepth = depth;columns.forEach((col:tableColumn) => {if (col.childrens) {const childDepth = buildHeaders(col.childrens, depth + 1, parentSpan + (col.colSpan|| 0));maxDepth = Math.max(maxDepth, childDepth);}});return maxDepth;
};

生成水印

export const createWatermark = () => {// 創建 Canvas 元素并繪制水印const canvas = document.createElement('canvas');const context:CanvasRenderingContext2D | null  = canvas.getContext('2d');canvas.width = 500;canvas.height = 200;context?context.font = '14px Arial':'';// 旋轉角度context?context.rotate(-25 * Math.PI / 180):'';// 設置文本內容的當前對齊方式context?context.textAlign = 'center':'';context?context.fillStyle = 'rgba(0, 0, 0, 0.1)':''; // 半透明水印context?context.fillText('midea', canvas.width / 2 - 100, canvas.height / 2):'';// 將 Canvas 轉換為圖片數據 URLreturn canvas.toDataURL('image/png');
}

設置文檔的背景水印

// 將 Canvas 水印 轉換為圖片數據 URL
const imageDataUrl = createWatermark();
// 添加圖片到工作簿中
const imageId = workbook.addImage({base64: imageDataUrl.replace(/^data:image\/[a-z]+;base64,/, ''),extension: 'png',
});
// 設置文檔水印
worksheet.addBackgroundImage(imageId)

dom 轉圖片

import domToImage from 'dom-to-image';// 把查詢條件轉為圖片
domToImage.toPng(captureRef.value).then(async (dataUrl) => {const image = new Image();image.src = dataUrl;})
.catch(function (error) {console.error('Failed to generate image:', error);
});

插入圖片

const imageId2 = workbook.addImage({ base64: dataUrl, extension: 'png' });
// 工作本插入查詢條件圖片
worksheet.addImage(imageId2, {tl: { col: 0, row: 0 },ext: { width: 1900 / 1.3, height: 800 / 6 }
});

全部代碼


// 遞歸生成表頭行
export const generateHeaderRows = (worksheet:Worksheet,headerDepth:number,cols:tableColumn[], currentRow = 0, startCol = 0) => {cols.forEach(col => {const cell = {header: col.label,key: col.dataIndex,width: col.minWidth?parseInt(col.minWidth)/8 : 20,colSpan: col.childrens ? col.childrens.length : 1,rowSpan: col.childrens ? 1 : headerDepth - currentRow + 1};const tempCell = worksheet.getCell(currentRow + 1, startCol + 1);// 設置單元格文案tempCell.value = col.label;// 設置單元格字體與大小tempCell.font = { name: 'Arial', size: 10 }// 設置列寬度worksheet.getColumn(startCol+1).width = cell.width;// 設置行高worksheet.getRow(currentRow+1).height = 20;// 合并單元格worksheet.mergeCells(currentRow + 1,startCol + 1,currentRow + (cell.rowSpan || currentRow+1), startCol + (cell.colSpan || 1));// 有子級遞歸if (col.childrens) {generateHeaderRows(worksheet,headerDepth,col.childrens, currentRow + 1, startCol);}startCol += cell.colSpan;});
}// 遞歸處理表頭層級
export const buildHeaders = (columns:tableColumn[], depth = 0, parentSpan = 0) => {let maxDepth = depth;columns.forEach((col:tableColumn) => {if (col.childrens) {const childDepth = buildHeaders(col.childrens, depth + 1, parentSpan + (col.colSpan|| 0));maxDepth = Math.max(maxDepth, childDepth);}});return maxDepth;
};
export const createWatermark = () => {// 創建 Canvas 元素并繪制水印const canvas = document.createElement('canvas');const context:CanvasRenderingContext2D | null  = canvas.getContext('2d');canvas.width = 500;canvas.height = 200;context?context.font = '14px Arial':'';// 旋轉角度context?context.rotate(-25 * Math.PI / 180):'';// 設置文本內容的當前對齊方式context?context.textAlign = 'center':'';context?context.fillStyle = 'rgba(0, 0, 0, 0.1)':''; // 半透明水印context?context.fillText('midea', canvas.width / 2 - 100, canvas.height / 2):'';// 將 Canvas 轉換為圖片數據 URLreturn canvas.toDataURL('image/png');
}// 點擊下載const downLoadList = () => {// 創建文檔對象const workbook = new ExcelJS.Workbook();// 創建工作本const worksheet = workbook.addWorksheet('Sheet 1');// 凍結表頭worksheet.views = [{state: 'frozen', // 可以設置為 'frozen' 來固定首行或首列,模擬滾動條效果xSplit: 0, // 從第二列開始凍結(模擬滾動條效果)ySplit: 9, // 從第二行開始凍結(模擬滾動條效果)topLeftCell: 'A1' // 設置起始位置為 B2,模擬滾動效果從第二行第二列開始}];// 1. 構建表頭結構const headerDepth = buildHeaders(filterColumns,7);// 遞歸生成表頭行generateHeaderRows(worksheet,headerDepth,filterColumns,7);emit('downLoadList',workbook,worksheet);}const downLoadListFn = async (workbook:Workbook,worksheet:Worksheet,name:string) => {// 把查詢條件轉為圖片domToImage.toPng(captureRef.value).then(async (dataUrl) => {const image = new Image();image.src = dataUrl;const imageId2 = workbook.addImage({ base64: dataUrl, extension: 'png' });// 工作本插入查詢條件圖片worksheet.addImage(imageId2, {tl: { col: 0, row: 0 },ext: { width: 1900 / 1.3, height: 800 / 6 }});// 2. 填充數據// salesTable.value.tableData.forEach(item => {//     worksheet.addRows(item);// })// 將 Canvas 水印 轉換為圖片數據 URLconst imageDataUrl = createWatermark();// 添加圖片到工作簿中const imageId = workbook.addImage({base64: imageDataUrl.replace(/^data:image\/[a-z]+;base64,/, ''),extension: 'png',});// 設置文檔水印worksheet.addBackgroundImage(imageId)// 觸發下載const buffer = await workbook.xlsx.writeBuffer();const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });const link = document.createElement('a');link.href = URL.createObjectURL(blob);link.download = name+'.xlsx';link.click();}).catch(function (error) {console.error('Failed to generate image:', error);});}

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

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

相關文章

devops自動化容器化部署

devops 一、簡單案例體驗gitlabrunner部署靜態文件二、devops企業級部署方案1、流程圖2、依賴工具3、流程圖4、主機規劃5、安裝工具軟件1、安裝git2、安裝gitlab3、安裝jenkins-server4、安裝harbor5、安裝web-server,也就是部署服務的機子,需要安裝dock…

高級 SQL 技巧:提升數據處理能力的實用方法

在數據驅動的時代,SQL 作為操作和管理關系型數據庫的標準語言,其重要性不言而喻。基礎的 SQL 語句能滿足日常的數據查詢需求,但在處理復雜業務邏輯、進行數據分析和優化數據庫性能時,就需要掌握一些高級 SQL 技巧。這些技巧不僅能提高查詢效率,還能實現復雜的數據處理任務…

21.disql命令登錄達夢數據庫,查詢并操作數據庫

目錄 1.連接達夢數據庫 1.1 windows或linux系統 步驟(1):打開終端窗口 步驟(2):進入夢數據庫安裝目錄下的 bin 文件夾 步驟(3):用disql命令進行登錄 1.2 docker部署…

N8N MACOS本地部署流程避坑指南

最近n8n很火,就想在本地部署一個,嘗嘗鮮,看說明n8n是開源軟件,可以在本地部署,于是就嘗試部署了下,大概用了1個多小時,把相關的過程記錄一下: 1、基礎軟件包 abcXu-MacBook-m2-Air…

qt之開發大恒usb3.0相機一

1.在大恒相機給的sample里沒有看見qt開發的demo. 第一步先運行c sdk中中的demo,看了下代碼,大恒使用的UI框架是MFC.然后 vs2022編譯。運行結果 第一步,先用qt進行坐下頁面布局,如下圖(保存圖片的地方做了些更改&#…

leetcode-枚舉

枚舉 3200. 三角形的最大高度 題目 給你兩個整數 red 和 blue,分別表示紅色球和藍色球的數量。你需要使用這些球來組成一個三角形,滿足第 1 行有 1 個球,第 2 行有 2 個球,第 3 行有 3 個球,依此類推。 每一行的球必…

DeepSeek智能時空數據分析(三):專業級地理數據可視化賞析-《杭州市國土空間總體規劃(2021-2035年)》

序言:時空數據分析很有用,但是GIS/時空數據庫技術門檻太高 時空數據分析在優化業務運營中至關重要,然而,三大挑戰仍制約其發展:技術門檻高,需融合GIS理論、SQL開發與時空數據庫等多領域知識;空…

如何用WordPress AI插件自動生成SEO文章,提升網站流量?

1. 為什么你需要一個WordPress AI文章生成插件? 每天手動寫文章太耗時?SEO優化總是不達標?WordPress AI插件能幫你24小時自動生成原創內容,從關鍵詞挖掘到智能排版,全程無需人工干預。 痛點:手動寫作效率低…

鼠標指定范圍內隨機點擊

鼠標指定范圍內隨機點擊 點贊神器 將鼠標移動到相應位置后按F5 F6鍵,設置點擊范圍, F8開始,ESC中止。 有些直播有點贊限制,例如某音,每小時限制3千次,可以設置1200毫秒,3000次。 軟件截圖&#…

數據庫設置外鍵的作用

數據庫外鍵(Foreign Key)是關系型數據庫中用于建立表與表之間關聯關系的重要約束,其核心作用是確保數據的一致性、完整性和關聯性。以下是外鍵的主要作用及相關說明: 1. 建立表間關聯關系 外鍵通過引用另一張表的主鍵&#xff0…

發幣流程是什么,需要多少成本?

這是一個專注于Web3相關開發的賬號,具體會講解步驟以及開發方案 偶爾會有科普,有興趣的可以點右上角關注一下 發幣(發行數字貨幣)的流程通常涉及技術實現、法律合規、經濟模型設計等多個環節,以下是關鍵步驟的簡要說明…

測試常用的Linux系統指令詳解

為什么測試工程師需要掌握Linux命令? 在現代軟件測試領域,約75%的服務端應用運行在Linux環境中,能夠熟練使用Linux命令的測試工程師,其工作效率比僅依賴GUI工具的測試人員高出40%以上。本文將系統介紹測試工作中最實用的Linux命令…

Java學習手冊:Web 安全基礎

一、常見 Web 安全威脅 在 Web 開發中,安全問題至關重要。以下是一些常見的 Web 安全威脅: 1. SQL 注入 SQL 注入是一種攻擊方式,攻擊者通過在輸入字段中插入惡意的 SQL 代碼,從而操縱數據庫。例如,假設有一個登錄表…

游戲引擎學習第246天:將 Worker 上下文移到主線程創建

回顧并為今天的工作做準備 關于GPU驅動bug的問題,目前本地機器上沒有復現。如果有問題,昨天的測試就應該已經暴露出來了。當前演示的是游戲的過場動畫,運行正常,使用的是硬件渲染。 之前使用軟件渲染時沒有遇到太多問題&#xff…

2025.4.26總結

今天把馬良老師的《職場十二法則》看完后,感觸極大,這們課程就是一場職場啟蒙課。 雖然看過不少關于職場的書籍,但大多數是關于職場進階,方法方面的。并沒有解答“面對未來二三十年的職場生涯,我該怎么去看待自己的工…

路由器轉發規則設置方法步驟,內網服務器端口怎么讓異地連接訪問的實現

在路由器上設置端口轉發(Port Forwarding)可以將外部網絡流量引導到特定的局域網設備,這對于需要遠程訪問服務器、攝像頭、游戲主機等設備非常有用。 登錄路由器管理界面,添加端口轉發規則讓外網訪問內網的實現教程分享。以下是設…

Linux基礎命令總結

Linux系統命令 1. systemctl 1. 基本語法 systemctl start | stop | restart | status 服務名 2. 經驗技巧查看服務的方法:/usr/lib/systemd/system 3. 案例實操 (1)查看防火墻服務的狀態 systemctl status firewalld (2)停止防火墻服務 systemctl stop firewalld (…

【PVCodeNet】《Palm Vein Recognition Network Combining Transformer and CNN》

[1]吳凱,沈文忠,賈丁丁,等.融合Transformer和CNN的手掌靜脈識別網絡[J].計算機工程與應用,2023,59(24):98-109. 文章目錄 1、Background and Motivation2、Related Work3、Advantages / Contributions4、Method5、Experiments5.1、Datasets and Metrics5.2、Hyper-parameters5.…

《企業級 Java EE 架構設計精深實踐》內容詳解

《企業級 Java EE 架構設計精深實踐》內容詳解 1. 書籍核心主題 《企業級 Java EE 架構設計精深實踐》是一本深入探討Java EE 企業級架構設計的實戰指南,涵蓋分層架構、設計模式、分布式系統、微服務、性能優化、安全與監控等核心內容,結合 Java EE 技術…

Ragflow新建的知識庫完成后刷新卻沒有顯示,報錯MethodNotAllowed: 405 Method Not Allowed:

環境: Ragflow17.2 debian12.8 問題描述: Ragflow新建的知識庫完成后刷新卻沒有顯示,報錯MethodNotAllowed: 405 Method Not Allowed: The method is not allowed for the requested URL. 后臺日志: 2025-04-25 13:54:25,988 ERROR 235204 405 Method Not Allowed:…