如何使用纯js导出Excel+export2Excel.js的图片导出(包教包会)

2023-11-18

需求背景

有一天突发奇想,如果把导出excel放到前端去做会不会更加的简单一些呢,这样对数据库的访问也会比较少,然后就开始前端导出excel的探索。后来发现,如果业务量大,需求变更频繁,兼容问题,好像前端处理并不合适,但是还是记录下来。

js导出文本Excel

这里主要使用csv后缀的简单业务实现

HTML代码

<a class="btn btn-success" href="#" ng-click="downLoadExcel(items)">Excel表格下载2</a>

JS代码 

$scope.downLoadExcel = function(item){
//这里循环主要是导出指定的字段,不需要的话就直接把集合扔进来用就行
var list=[];
$.each(item,function(i,obj){
var all={};
all["id"]=i+1;
all["createTime"]=obj.createTime;
list.push(all)
})	

//列标题,逗号隔开,每一个逗号就是隔开一个单元格
let str = `编号,创建时间\n`;
//增加\t为了不让表格显示科学计数法或者其他格式
for(let i = 0 ; i < list.length ; i++ ){//同上list,可直接传入后台的参数名
for(let item in list[i]){//同上list,可直接传入后台的参数名
str+=`${list[i][item] + '\t'},`; //同上list,可直接传入后台的参数名    
}
str+='\n';
}
//encodeURIComponent解决中文乱码
let uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent(str);
//通过创建a标签实现
var link = document.createElement("a");
link.href = uri;
//对下载的文件命名
link.download =  "导出.csv";
document.body.appendChild(link);
link.click();

								});

效果展示

 

点击下载按钮后然后会弹出下载

打开excel就可以发现我们的数据了

 背景需求

单纯的导出文字可能不满足业务需求,有时候可能会要求你导出图片,如果直接把链接导出,Js并不能帮你解析,最后还是只能得到一串Url路径。这时候三方Js他来啦,满足你当前要求。

export2Excel.js导出带图片excel

HTML代码

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>导出图片和数据到Excel</title>
</head>
<body>
</body>
<script src="js/export2Excel.js"></script>
<script>
    // tHeader和tbody的数据需要一一对应
    let tHeader = [
		'鲜花',
		'颜色',
		'照片'
	]
	let tbody = [
		{
			name: '玫瑰花',
			color: '红色',
			pic: 'https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2801998497,4036145562&fm=27&gp=0.jpg'
		},
		{
			name: '菊花',
			color: '黄色',
			pic: 'https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1506844670,1837003941&fm=200&gp=0.jpg'
		},
		{
			name: '牵牛花',
			color: '紫色',
			pic: 'https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3056120770,1115785765&fm=27&gp=0.jpg'
		},
		{
			name: '梅花',
			color: '白色',
			pic: 'https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2700343322,3431874915&fm=27&gp=0.jpg'
		},
		{
			name: '桃花花',
			color: '粉色',
			pic: 'https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=602076004,4209938077&fm=27&gp=0.jpg'
		}
	]
	export2Excel(tHeader, tbody, '我爱花朵')
</script>
</html>

export2Excel.js源码


/* eslint-disable */
let idTmr;
const getExplorer = () => {
  let explorer = window.navigator.userAgent;
  //ie
  if (explorer.indexOf("MSIE") >= 0) {
    return 'ie';
  }
  //firefox
 
  else if (explorer.indexOf("Firefox") >= 0) {
    return 'Firefox';
  }
  //Chrome
  else if (explorer.indexOf("Chrome") >= 0) {
    return 'Chrome';
  }
  //Opera
  else if (explorer.indexOf("Opera") >= 0) {
    return 'Opera';
  }
  //Safari
  else if (explorer.indexOf("Safari") >= 0) {
    return 'Safari';
  }
}
// 判断浏览器是否为IE
const exportToExcel = (data,name) => {
 
  // 判断是否为IE
  if (getExplorer() == 'ie') {
    tableToIE(data, name)
  } else {
    tableToNotIE(data,name)
  }
}
 
const Cleanup = () => {
  window.clearInterval(idTmr);
}
 
// ie浏览器下执行
const tableToIE = (data, name) => {
  let curTbl = data;
  let oXL = new ActiveXObject("Excel.Application");
 
  //创建AX对象excel
  let oWB = oXL.Workbooks.Add();
  //获取workbook对象
  let xlsheet = oWB.Worksheets(1);
  //激活当前sheet
  let sel = document.body.createTextRange();
  sel.moveToElementText(curTbl);
  //把表格中的内容移到TextRange中
  sel.select;
  //全选TextRange中内容
  sel.execCommand("Copy");
  //复制TextRange中内容
  xlsheet.Paste();
  //粘贴到活动的EXCEL中
 
  oXL.Visible = true;
  //设置excel可见属性
 
  try {
    let fname = oXL.Application.GetSaveAsFilename("Excel.xls", "Excel Spreadsheets (*.xls), *.xls");
  } catch (e) {
    print("Nested catch caught " + e);
  } finally {
    oWB.SaveAs(fname);
 
    oWB.Close(savechanges = false);
    //xls.visible = false;
    oXL.Quit();
    oXL = null;
    // 结束excel进程,退出完成
    window.setInterval("Cleanup();", 1);
    idTmr = window.setInterval("Cleanup();", 1);
  }
}
 
// 非ie浏览器下执行
const tableToNotIE = (function() {
  // 编码要用utf-8不然默认gbk会出现中文乱码
  let uri = 'data:application/vnd.ms-excel;base64,',
    template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><meta charset="UTF-8"><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}</table></body></html>',
    base64 = function(s) {
      return window.btoa(unescape(encodeURIComponent(s)));
 
    },
 
    format = (s, c) => {
      return s.replace(/{(\w+)}/g,
        (m, p) => {
          return c[p];
        })
    }
  return (table, name) => {
    let ctx = {
      worksheet: name,
      table
    }
 
    //创建下载
    let link = document.createElement('a');
    link.setAttribute('href', uri + base64(format(template, ctx)));
 
    link.setAttribute('download', name);
 
 
    // window.location.href = uri + base64(format(template, ctx))
    link.click();
  }
})()

JS代码 

// 导出函数
const export2Excel = (theadData, tbodyData, dataname) => {
 
  let re = /http/ // 字符串中包含http,则默认为图片地址
  let th_len = theadData.length // 表头的长度
  let tb_len = tbodyData.length // 记录条数
  let width = 40 // 设置图片大小
  let height = 60
 
  // 添加表头信息
  let thead = '<thead><tr>'
  for (let i = 0; i < th_len; i++) {
    thead += '<th>' + theadData[i] + '</th>'
  }
  thead += '</tr></thead>'
 
  // 添加每一行数据
  let tbody = '<tbody>'
  for (let i = 0; i < tb_len; i++) {
    tbody += '<tr>'
    let row = tbodyData[i] // 获取每一行数据
 
    for (let key in row) {
      if (re.test(row[key])) { // 如果为图片,则需要加div包住图片
        // 
        tbody += '<td style="width:' + width + 'px; height:' + height + 'px; text-align: center; vertical-align: middle"><div style="display:inline"><img src=\'' + row[key] + '\' ' + ' ' + 'width=' + '\"' + width + '\"' + ' ' + 'height=' + '\"' + height + '\"' + '></div></td>'
      } else {
        tbody += '<td style="text-align:center">' + row[key] + '</td>'
      }
    }
    tbody += '</tr>'
  }
  tbody += '</tbody>'
 
  let table = thead + tbody
 
  // 导出表格
  exportToExcel(table, dataname)
}

 

展示效果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用纯js导出Excel+export2Excel.js的图片导出(包教包会) 的相关文章

  • JDK1.8的新特性(详细总结)

    目录 前言 一 jdk8简介 二 Lambda表达式语法 函数式接口 三 jdk8 内置四大核心函数接口 消费型接口 海王式接口 只知道索取 供给型接口 舔狗式接口 只知道付出 不索取回报的 函数型接口 双向奔赴 有输入有输出 断言型接口
  • C语言上机实验思路分享5

    实验内容 方法和步骤 1 编写一个函数 由实参传来一个整数n 将它各个位上的数字逆序输出 例如输入 123 输出为321 2 求方程ax 2 bx c O的根 用3个函数分别求当 b 2 4ac大于0 等于0和小于0时的根 并输出结果 从主
  • js使用AjaxFileupload插件实现文件上传

    最近做项目 需要上传表单元素中的文件POST到目标URL 并把得到的数据显示到本页面上 而不跳转到目标URL 那么 现在就要明确两件事 1 不能直接提交表单 因为一旦点击submit就会自动跳转到action界面 2 可以选择ajax进行异
  • Spring boot 整合 log4j2日志、程序异常,发送邮件通知

    官方文档 https logging apache org log4j 2 x 1 Maven修改如下
  • html 元素平滑滚动到某一位置

    在网上查了大半天 有人用高度算 然后setTimeout的 那个观感真的是差到家了 还有人说用 js动画库的 其实很简单 直接用window scrollTo 这个方法就完事了 回到顶部 window scrollTo top 0 beha

随机推荐

  • 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)

    快速导航 1 稳定性 2 插入排序 3 希尔排序 4 选择排序 5 堆排序 6 冒泡排序 1 稳定性 两个相等的数据 如果经过排序后 排序算法能保证其相对位置不发生变化 则我们称该算法是具备稳定性的排序算法 图中排序后a仍然在b前面 此时这
  • Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    代理模式 代理模式的英文叫做Proxy或Surrogate 中文都可译为 代理 所谓代理 就是一个人或者一个机构代表另一个人或者另一个机构采取行动 在一些情况下 一个客户不想或者不能够直接引用一个对象 而代理对象可以在客户端和目标对象之间起
  • Dalvik虚拟机简要介绍和学习计划

    通过修改 android framework base core jni AndroidRuntime cpp 中的 property get dalvik vm heapsize heapsizeOptsBuf 4 16m 来修改 dal
  • 电脑连接蓝牙耳机还是外放,输出设备只有扬声器怎么解决?

    1 问题描述 电脑连接蓝牙耳机耳机后 声音依然外放 输出设备只有扬声器 添加输出设备也找不到蓝牙耳机 2 排查问题 如果大家遇到的问题与我不同 还请查阅其他文章 右键计算机图标 gt 管理 gt 设备管理器 gt 声音 视频和游戏控制器 发
  • 神经网络应用: 手写数字识别(MNIST数据集)

    1 前言 本文使用 tensorflow 2 10 0 版本构建神经网络模型并进行训练 不同版本之间的 API 可能会有不同 请选择合适的版本学习 2 MNIST 数据集介绍 MNIST数据集 Mixed National Institut
  • 高性能计算(HPC)和智能计算理解

    1 现代终端设备一般都跟云端服务器相连 但只要可能 我们都希望计算可以在本地终端解决 这样做的好处是多方面的 既可以减小网络带宽的压力 又可以避免网络传输产生的时延 还可以让用户的数据更安全 现代终端设备一般用一个片上系统 SoC 做计算
  • Docker安装MinIO详细步骤

    本篇博客主要记录在Docker当中安装MinIO 目录 一 查看docker环境是否正常 二 下载minIO的镜像 三 创建minIO容器 四 访问地址 五 安装遇到问题 1 问题一 2 问题二 3 问题三 一 查看docker环境是否正常
  • Ubuntu18 04安装QQ

    Ubuntu18 04安装QQ Created time December 20 2022 5 12 PM Last edited time December 20 2022 6 15 PM Tags QQ Ubuntu18 04 截图工具
  • Flutter 第三方SDK集成(友盟统计,极光推送,百度地图)

    友盟统计 Flutter SDK集成 首先创建一个项目 接着去友盟工作台添加应用 添加成功后会得到AppKey 集成友盟 Flutter SDK 下载Demo Demo地址 https developer umeng com api sdk
  • Java实现多线程下载

    思路 1 基本思路是将文件分段切割 分段传输 分段保存 2 分段切割用到HttpUrlConnection对象的setRequestProperty Range bytes start end 方法 3 分段传输用到HttpUrlConne
  • 《面试准备》C++链表操作3(合并两个有序链表)

    include
  • Unity Shader入门精要第七章 基础纹理 单张纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一 7 1单张纹理 参考 前言 纹理最初的目的就是使用一张图片来控制模型的外观 使用纹理映射 texture mapping 技 术 我们可以把一张图 黏 在模型表面 逐纹素
  • PID的积分抗饱和

    目录 1 什么是积分饱和 2 实际的例子 3 负面影响 4 如何防止积分饱和 5 PID算法 抗饱和 1 什么是积分饱和 积分饱和 Integral windup或integrator windup 是指PID控制器或是其他有积分器的控制器
  • linux中KVM桥接网卡br0

    在redhat Eenterprise 6或者CentOS 6以上版本在使用KVM虚拟化的时 会需要配置到桥接网卡 下面就非常简单的讲一下桥接的方法 真的很简单 查看eth0的现有状态 root localhost cd etc sysco
  • Spring Boot开发时Java对象和Json对象互转

    作者简介 练习时长两年半的Java up主 个人主页 程序员老茶 ps 点赞 是免费的 却可以让写博客的作者开兴好久好久 系列专栏 Java全栈 计算机系列 火速更新中 格言 种一棵树最好的时间是十年前 其次是现在 动动小手 点个关注不迷路
  • 安卓手机玩游戏卡顿怎么解决_安卓手机卡顿,都是在桌面上卸载软件,这样是没用的!...

    现在的时代手机对我们来说已经是必不可少的了可以说是情人一样走哪都带着 智能手机尤其是这几年 随着国产手机的迅猛发展 其实我们可以看到无论男女老少 基本上都有自己的手机 现在学生都用手机了 我记得我上学那会没家长没给买手机我初3才买手机的 现
  • Composer自动加载(一)

    我的个人博客 逐步前行STEP Composer是PHP的基于项目的依赖管理工具 它本身集成一个autoloader 支持PSR 4 PSR 0 classmap files 四种自动加载方式 首先介绍一下PSR 4与PSR 0 介绍这两种
  • Qt中csv文件的导入与导出

    CSV 1 简介 全称 Comma Separated Values 是 逗号分隔值 的英文缩写 通常是纯文本文件 一般用wordWPS或是记事本打开 2 规则 1 开头不留空 以行为单位 2 可含或不含列名 含列名则居文件第一行 3 一行
  • Lombok插件注解详解

    Lombok主要常用的注解 Data注解 在JavaBean或类JavaBean中使用 这个注解包含范围最广 它包含getter setter NoArgsConstructor注解 即当使用当前注解时 会自动生成包含的所有方法 Gette
  • 如何使用纯js导出Excel+export2Excel.js的图片导出(包教包会)

    需求背景 有一天突发奇想 如果把导出excel放到前端去做会不会更加的简单一些呢 这样对数据库的访问也会比较少 然后就开始前端导出excel的探索 后来发现 如果业务量大 需求变更频繁 兼容问题 好像前端处理并不合适 但是还是记录下来 js