zzpda 2023-04-01 21:27 采纳率: 70.6%
浏览 15
已结题

js中导出到excel图片不显示

vue el-table中能够正确显示后台sqlserve数据库中存入的Base64格式的图片,将其图片数据导入到excel中,图片栏不能正常显示图片.显示内容为

img

将图片导入到EXCEL采用了file-saver与xlsx.以下是我的代码

img

img

  • 写回答

1条回答 默认 最新

  • writeBig 2023-04-01 21:39
    关注

    在Vue的el-table中显示后台SQL Server数据库中存储的Base64格式的图片,可以使用el-table中的自定义列模板功能,将图片以标签的形式显示出来。具体做法如下

    1. 定义一个自定义列模板
    <el-table-column label="图片">
      <template slot-scope="scope">
        <img :src="'data:image/png;base64,' + scope.row.image" width="100" height="100">
      </template>
    </el-table-column>
    

    其中,scope.row.image为当前行的图片数据,使用data URI格式将其转换为图片。

    1. 导出Excel时,需要将图片数据转换为Blob对象,并将其作为Excel中图片栏的值,具体做法如下:
    // 将Base64图片数据转换为Blob对象
    function dataURLtoBlob(dataurl) {
      var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
      while(n--){
        u8arr[n] = bstr.charCodeAt(n);
      }
      return new Blob([u8arr], {type:mime});
    }
    
    // 导出Excel
    function exportExcel() {
      const data = []; // 表格数据
      const headers = [{ // 表格头部    text: '图片',    value: 'image'  }];
      const worksheet = XLSX.utils.json_to_sheet(data, { header: headers });
      const range = { s: { c: 0, r: 0 }, e: { c: headers.length - 1, r: data.length } };
      const wscols = headers.map((header) => ({ width: 20 }));
      worksheet['!cols'] = wscols;
      for (let i = 0; i < data.length; i++) {
        const row = data[i];
        if (row.image) {
          const imgBlob = dataURLtoBlob('data:image/png;base64,' + row.image);
          const img = new Image();
          img.onload = function() {
            const dimensions = XLSX.utils.pixels_to_rowcol_width_height(img.width, img.height, 20);
            const cellRef = XLSX.utils.encode_cell({ r: i + 1, c: headers.findIndex(header => header.value === 'image') });
            worksheet[cellRef] = { t: 's', v: '', s: { patternType: 'solid', fgColor: { rgb: 'FFFFFF' } } };
            XLSX.utils.sheet_add_image(worksheet, `B${i + 2}`, { filename: 'image.png', imageFile: imgBlob, ...dimensions });
          };
          img.src = 'data:image/png;base64,' + row.image;
        }
      }
      const workbook = XLSX.utils.book_new();
      XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
      XLSX.writeFile(workbook, 'data.xlsx');
    }
    

    在导出Excel时,需要将Base64格式的图片数据转换为Blob对象,并使用XLSX.utils.sheet_add_image()方法将图片插入到Excel中。注意,需要在图片加载完成后再进行导出Excel的操作,否则可能会导致图片无法正确显示。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月20日
  • 已采纳回答 9月12日
  • 创建了问题 4月1日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改