Vue3中使用exceljs和file-saver实现Excel导出(含图片导出)功能完整方案_vue.js

支持多图片列导出✅ 自动识别Base64和DataURL格式✅ 精确控制图片位置✅ 异常处理与性能优化

// utils/excelExport.jsimport ExcelJS from 'exceljs';import { saveAs } from 'file-saver';/** * * @param headers 表头,[表头1,表头2,...] 必填 * @param tableData 内容 [data1,data2,...] 必填 * @param imageIndex 图片下标列 [0, 1, 2 , ...], 非必填 * @returns {Promise} */export const exportToExcel = async (headers, tableData, imageIndex = []) => { const workbook = new ExcelJS.Workbook(); const worksheet = workbook.addWorksheet('Sheet1'); // 添加表头 const headerRow = worksheet.addRow(headers); // 设置表头样式 headerRow.eachCell((cell) => { cell.font = { bold: true, color: { argb: 'FFFFFFFF' }, size: 12 }; cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FF007BFF' } }; cell.alignment = { horizontal: 'center', vertical: 'middle' }; }); // 设置列宽 headers.forEach((_, colIndex) => { let width = 20; // 默认列宽 if (imageIndex.includes(colIndex)) { width = 30; // 图片列更宽 } worksheet.getColumn(colIndex + 1).width = width; }); // 处理数据行(修改为异步) for (let rowIdx = 0; rowIdx < tableData.length; rowIdx++) { const row = tableData[rowIdx]; const dataRow = worksheet.addRow(row); if (imageIndex.length > 0) { // 使用Promise.all处理多列图片 await Promise.all(imageIndex.map(async (colIdx) => { const imgUrl = row[colIdx]; if (!imgUrl) return; try { const parsed = await parseImageData(imgUrl); if (!parsed) return; const imageId = workbook.addImage({ base64: parsed.base64, extension: parsed.extension, }); const colLetter = getExcelColumnLetter(colIdx); const excelRow = rowIdx + 2; worksheet.addImage(imageId, { tl: { col: colIdx, row: excelRow - 1 }, br: { col: colIdx + 1, row: excelRow }, editAs: 'oneCell' // 更稳定的定位方式 }); } catch (error) { console.error(`图片处理失败(行${rowIdx + 1}列${colIdx + 1}):`, error); } })); } } // 生成文件 const buffer = await workbook.xlsx.writeBuffer(); saveAs(new Blob([buffer]), `数据导出_${new Date().getTime()}.xlsx`);};// 列索引转Excel字母(如:0 -> A, 1 -> B)const getExcelColumnLetter = (column) => { let letter = ''; let col = column + 1; while (col > 0) { const remainder = (col - 1) % 26; letter = String.fromCharCode(65 + remainder) + letter; col = Math.floor((col - 1) / 26); } return letter;};// 新增:将图片URL转换为base64const urlToBase64 = async (url) => { try { const response = await fetch(url); const blob = await response.blob(); return new Promise((resolve) => { const reader = new fileReader(); reader.onloadend = () => resolve(reader.result); reader.readAsDataURL(blob); }); } catch (error) { console.error('图片转换失败:', error); return null; }};// 修改后的解析函数const parseImageData = async (imgData) => { if (!imgData) return null; // 处理URL情况 if (imgData.startsWith('http')) { const dataURL = await urlToBase64(imgData); if (!dataURL) return null; const [header, base64] = dataURL.split(';base64,'); const extension = header.split('/')[1]; return { base64, extension }; } // 原有处理dataURL的逻辑 if (imgData.startsWith('data:image')) { const [header, base64] = imgData.split(';base64,'); if (!header || !base64) return null; const extension = header.split('/')[1]; return { base64, extension }; } return null;};

headers.forEach((_, colIndex) => { let width = 20; // 默认列宽 if (imageIndex.includes(colIndex)) { width = 30; // 图片列更宽 } worksheet.getColumn(colIndex + 1).width = width; });

坐标转换 通过getExcelColumnLetter函数将数字索引转换为Excel字母坐标

// tl: 左上角定位(top-left)// br: 右下角定位(bottom-right){ tl: { col: 0, row: 0 }, // A1单元格 br: { col: 1, row: 1 } // B2单元格}

建议根据实际业务需求调整图片定位参数和样式配置,对于复杂报表建议结合后端生成方案。

到此这篇关于Vue3中使用exceljs和file-saver实现Excel导出(含图片导出)功能的文章就介绍到这了,更多相关Vue3导出Excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!


本文地址: https://www.earthnavs.com/jishuwz/54a9083e3e53f8fcfd2a.html
全局中部横幅
网易号

该站点未添加描述description...

虎扑社区

虎扑是以体育赛事和男性兴趣生活为主的社区网站。专注于NBA赛程、NBA录像、NBA直播、NBA资讯、球员交易、足球、英超、电竞、LPL等全部篮球足球电竞赛事,并提供虎扑步行街社区服务。

ARISTA456:

ARISTA456adalahsitusslotyanglagingeri,dimanadalam1xspinpemainbisalangsungWD12jutarasakankeseruandankeuntunganluarbiasahanyadiARISTA456.

魔镜洞察

魔镜CMI基于国内外电商数据,消费者评论,社媒文本洞察消费市场,让你领先对手6个月,发现新机会;镜界AI专为消费市场研究而生,高增长发现,创新概念验证,品类调研,就用境界AI

豆瓣电影

豆瓣电影提供最新的电影介绍及评论包括上映影片的影讯查询及购票服务。你可以记录想看、在看和看过的电影电视剧,顺便打分、写影评。根据你的口味,豆瓣电影会推荐好电影给你。

【汽车论坛】汽车社区

汽车之家论坛,全球最大汽车论坛,助力全球车友交流提车经历,用车感受,车友会活动,维修保养经验,自驾游等,更有媳妇当车模,美人生活秀,论坛红人馆等专题,精彩汽车内容尽在汽车之家

硅云

硅云,全球领先的出海IaaS云计算基础设施服务提供商,为数百万中小微企业和开发者降低全球化上云成本,提供香港云服务器、云虚拟主机、域名注册、免备案海外服务器、外贸网站服务器、VPS空间租用等产品和服务。

大厂图床

该站点未添加描述description...

绿色资源网

绿色资源网免费提供电脑常用软件,安卓手机app,手机游戏,苹果应用,mac软件等,励志打造全网最好最全的软件下载站.

云搜站导航

云搜站导航(yunsouzhan.cn)专注为职场人士提供高效办公解决方案,聚合PPT模板、Excel工具、在线协作平台、行政管理系统等实用资源,严选全网可商用、免版权素材,每日人工更新验证,网址大全,助力提升工作效率。即点即用,无广告干扰!