当前位置: 首页 > news >正文

vxe-table导出excel插件,即exceljs导出多张图片的坑

使用vxe-table的vxe-img-group组件在单元格可以很好的在web页面渲染多张图片,但是如果使用推荐的第三方导出excel插件plugin-export-xlsx(基于exceljs)的话,则只能导出第一张图片.

搜索全网,没找到类似需求的解决方法,问deepseek,倒是给出了通过配置偏移量实现的方案,但是实际测试才发现坑很大

const exportToExcel = async () => {data.search.rows = 999999await getDataList()const $table = tableRef.valueif ($table) {// 配置exportConfig的sheetMethod方法给 excel单元格添加 多张图片,实际上就是操作exceljs的接口exportConfig.sheetMethod = async (params) =>{console.log('配置exportConfig的sheetMethod方法');const dataList = data.dataListconst imageList = dataList[0].beforeRectificationImgsListconsole.log('图片===',imageList)const { worksheet, workbook } = params// // 1. 调整目标单元格的行高和列宽,为多张图片预留空间// const targetRow = 4; // 例如,第二行// const targetCol = 9; // 例如,B列// worksheet.getRow(targetRow).height = 150; // 设置行高// worksheet.getColumn(targetCol).width = 30; // 设置列宽//
            // // 2. 将图片添加到工作簿// const imageId1 = workbook.addImage({//     filename: 'http://127.0.0.1:19000/donghai7s/CheckPhotos/2025/10/00_093351948.png', // 替换为你的图片路径//     extension: 'png',// });// const imageId2 = workbook.addImage({//     filename: 'http://127.0.0.1:19000/donghai7s/CheckPhotos/2025/10/00_093352238.png', // 替换为你的图片路径//     extension: 'png',// });// // ... 可以添加更多图片//
            // // 3. 将图片定位到同一个单元格内的不同位置// // 获取单元格的起始位置(左上角)// // 注意:ExcelJS 的坐标是从 (1, 1) 开始的// const cellStartPos = {//     col: targetCol,//     row: targetRow// };//
            // // 定义图片在单元格内的偏移量和尺寸// worksheet.addImage(imageId1, {//     tl: { col: cellStartPos.col, row: cellStartPos.row }, // 定位到单元格左上角//     ext: { width: 50, height: 50 } // 设置图片显示尺寸// });//
            // worksheet.addImage(imageId2, {//     tl: {//         col: cellStartPos.col + 0.3, // 在单元格内水平偏移(可理解为向右移动)//         row: cellStartPos.row + 0.3  // 在单元格内垂直偏移(可理解为向下移动)//     },//     ext: { width: 50, height: 50 }// });// 假设将4张图片排列成 2x2 的网格const imagesPerRow = 7; // 每行图片数const imageWidth = 60;const imageHeight = 30;// 获取单元格的起始位置(左上角)// 注意:ExcelJS 的坐标是从 (1, 1) 开始的const cellStartPos = {col: 8,row: 3};// 计算单元格总大小,并据此设置行高列宽// worksheet.getColumn(9).width = imageWidth * imagesPerRow;// 遍历所有图片,计算每个图片在网格中的位置for (const image of imageList) {const index = imageList.indexOf(image);console.log(index, image)// const buffer = await fetch(image).then(res => res.arrayBuffer())// // 2. 将图片添加到工作簿// const imageId = workbook.addImage({//     buffer, // 替换为你的图片路径//
                // });const buffer1 = await fetch('http://127.0.0.1:19000/donghai7s/CheckPhotos/2025/10/00_093352238.png').then(res => res.arrayBuffer())const imageId = workbook.addImage({buffer: buffer1,extension: 'png'})const rowOffset = Math.floor(index / imagesPerRow*100)/100; // 计算行偏移console.log('=计算行偏移====',rowOffset)worksheet.addImage(imageId, {tl: {col: cellStartPos.col+ rowOffset, // 水平方向偏移row: cellStartPos.row   // 垂直方向偏移
                    },ext: {width: imageWidth,height: imageHeight}});}}console.log('====开始导出');await $table.exportData({type: 'xlsx',useStyle: true})console.log('====导出完成');//高级导出// $table.openExport()
    }data.search.rows = 10await getDataList()
}

如上图配置exportConfig的sheetMethod方法,这个坑实际上是微软excel的坑,它的列宽是基于字符宽度,也就是不是一个固定的值(并且因为留白之类的还要再多一点,比如默认是8个字符宽度,实际查看是8.23),而exceljs在计算偏移量的时候是把它当做像素计算的(也有说是exceljs自己的一套,见下面参考文章),导致导出后,即使你换算的非常精确,结果却是所有图片挤在单元格左侧的大概三分之一的空间,剩下的都是空白,所以,这种方法是不可行的,只少用exceljs不行,后端导出有可能行吧,不过嫌麻烦没试,根据deepseek的推荐,使用曲线实现的方法:设置成每个单元格一张图片,再设置合并单元格

参考文章:

ExcelJS 导出列宽行高失真?深度解析与实战修复 - ByteZoneX社区

将EXCEL单元格的宽度单位转换为像素单位。 - 知乎

http://www.gsyq.cn/news/33489.html

相关文章:

  • 2025年专业的员工福利平台比较好
  • 2025年值得推荐的离婚财产分割律师排名
  • 2025年专业的郑州注册公司代理哪家权威
  • 2025 年裹树布防寒布,果树防寒布,绿化防寒布厂家最新推荐,技术实力与市场口碑深度解析
  • 互联网十年,从博客到知识库
  • 2025年靠谱的防砸防刺穿劳保鞋批发销售
  • 2025年靠谱的青年鸡生产厂家
  • 冲刺省队每日总结
  • 2025年口碑好的高端展厅设计展示空间创新设计榜
  • 2025年有实力注册公司办理公司哪家好
  • 2025年专业的短视频推广商业拍摄公司
  • NAS存储当IIS虚拟机目录
  • 2025年评价高的别墅装修施工联系方式
  • 2025年口碑好的奥尔良食品添加剂厂家最新TOP推荐榜
  • 2025年评价高的短视频拍摄口碑排行
  • 2025年靠谱的昆明旅行社排名前十
  • 2025年耐用的应届生云计算就业技能培训
  • 2025年综合型景区策划推荐
  • 2025年靠谱的装修材料企业
  • 详细介绍:再谈电子实验记录本的部署方式——本地私有、云私有、单租户及多租户SaaS
  • 2025年比较好的画册设计公司最新推荐榜单哪家靠谱
  • 2025年专业的板材品牌设计团队
  • 技术未来的真实图景:AI代理与人性化交互革命
  • 【GitHub每日速递 251029】23.5k star! OpenAudio S1来袭!零依赖、高精度多语言TTS模型登顶TTS-Arena2
  • 2025年评价高的政府活动策划承办方
  • 从零实现GB28181服务端与设备端:踩坑与突破
  • 2025年知名的校园智慧体育哪家好
  • 2025年靠谱的过期文件销毁合作
  • 2025年最佳购物网站谷歌优化品牌
  • 2025年评价高的OA系统费用排行