将数组数据转为excel表导出

2023-11-09

安装xlsx依赖

npm install xlsx --save

npm install file-saver script-loader --save

使用vue-element-admin 中的src/vendor/export2Excel.js

/* eslint-disable */
import { saveAs } from 'file-saver'
import XLSX from 'xlsx'
 
function generateArray(table) {
  var out = [];
  var rows = table.querySelectorAll('tr');
  var ranges = [];
  for (var R = 0; R < rows.length; ++R) {
    var outRow = [];
    var row = rows[R];
    var columns = row.querySelectorAll('td');
    for (var C = 0; C < columns.length; ++C) {
      var cell = columns[C];
      var colspan = cell.getAttribute('colspan');
      var rowspan = cell.getAttribute('rowspan');
      var cellValue = cell.innerText;
      if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;
 
      //Skip ranges
      ranges.forEach(function (range) {
        if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
          for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
        }
      });
 
      //Handle Row Span
      if (rowspan || colspan) {
        rowspan = rowspan || 1;
        colspan = colspan || 1;
        ranges.push({
          s: {
            r: R,
            c: outRow.length
          },
          e: {
            r: R + rowspan - 1,
            c: outRow.length + colspan - 1
          }
        });
      };
 
      //Handle Value
      outRow.push(cellValue !== "" ? cellValue : null);
 
      //Handle Colspan
      if (colspan)
        for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
    }
    out.push(outRow);
  }
  return [out, ranges];
};
 
function datenum(v, date1904) {
  if (date1904) v += 1462;
  var epoch = Date.parse(v);
  return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
}
 
function sheet_from_array_of_arrays(data, opts) {
  var ws = {};
  var range = {
    s: {
      c: 10000000,
      r: 10000000
    },
    e: {
      c: 0,
      r: 0
    }
  };
  for (var R = 0; R != data.length; ++R) {
    for (var C = 0; C != data[R].length; ++C) {
      if (range.s.r > R) range.s.r = R;
      if (range.s.c > C) range.s.c = C;
      if (range.e.r < R) range.e.r = R;
      if (range.e.c < C) range.e.c = C;
      var cell = {
        v: data[R][C]
      };
      if (cell.v == null) continue;
      var cell_ref = XLSX.utils.encode_cell({
        c: C,
        r: R
      });
 
      if (typeof cell.v === 'number') cell.t = 'n';
      else if (typeof cell.v === 'boolean') cell.t = 'b';
      else if (cell.v instanceof Date) {
        cell.t = 'n';
        cell.z = XLSX.SSF._table[14];
        cell.v = datenum(cell.v);
      } else cell.t = 's';
 
      ws[cell_ref] = cell;
    }
  }
  if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
  return ws;
}
 
function Workbook() {
  if (!(this instanceof Workbook)) return new Workbook();
  this.SheetNames = [];
  this.Sheets = {};
}
 
function s2ab(s) {
  var buf = new ArrayBuffer(s.length);
  var view = new Uint8Array(buf);
  for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
  return buf;
}
 
export function export_table_to_excel(id) {
  var theTable = document.getElementById(id);
  var oo = generateArray(theTable);
  var ranges = oo[1];
 
  /* original data */
  var data = oo[0];
  var ws_name = "SheetJS";
 
  var wb = new Workbook(),
    ws = sheet_from_array_of_arrays(data);
 
  /* add ranges to worksheet */
  // ws['!cols'] = ['apple', 'banan'];
  ws['!merges'] = ranges;
 
  /* add worksheet to workbook */
  wb.SheetNames.push(ws_name);
  wb.Sheets[ws_name] = ws;
 
  var wbout = XLSX.write(wb, {
    bookType: 'xlsx',
    bookSST: false,
    type: 'binary'
  });
 
  saveAs(new Blob([s2ab(wbout)], {
    type: "application/octet-stream"
  }), "test.xlsx")
}
 
export function export_json_to_excel({
  multiHeader = [],
  header,
  data,
  filename,
  merges = [],
  autoWidth = true,
  bookType = 'xlsx'
} = {}) {
  /* original data */
  filename = filename || 'excel-list'
  data = [...data]
  data.unshift(header);
 
  for (let i = multiHeader.length - 1; i > -1; i--) {
    data.unshift(multiHeader[i])
  }
 
  var ws_name = "SheetJS";
  var wb = new Workbook(),
    ws = sheet_from_array_of_arrays(data);
 
  if (merges.length > 0) {
    if (!ws['!merges']) ws['!merges'] = [];
    merges.forEach(item => {
      ws['!merges'].push(XLSX.utils.decode_range(item))
    })
  }
 
  if (autoWidth) {
    /*设置worksheet每列的最大宽度*/
    const colWidth = data.map(row => row.map(val => {
      /*先判断是否为null/undefined*/
      if (val == null) {
        return {
          'wch': 10
        };
      }
      /*再判断是否为中文*/
      else if (val.toString().charCodeAt(0) > 255) {
        return {
          'wch': val.toString().length * 2
        };
      } else {
        return {
          'wch': val.toString().length
        };
      }
    }))
    /*以第一行为初始值*/
    let result = colWidth[0];
    for (let i = 1; i < colWidth.length; i++) {
      for (let j = 0; j < colWidth[i].length; j++) {
        if (result[j]['wch'] < colWidth[i][j]['wch']) {
          result[j]['wch'] = colWidth[i][j]['wch'];
        }
      }
    }
    ws['!cols'] = result;
  }
 
  /* add worksheet to workbook */
  wb.SheetNames.push(ws_name);
  wb.Sheets[ws_name] = ws;
 
  var wbout = XLSX.write(wb, {
    bookType: bookType,
    bookSST: false,
    type: 'binary'
  });
  saveAs(new Blob([s2ab(wbout)], {
    type: "application/octet-stream"
  }), `${filename}.${bookType}`);
}

 准备数据

// 处理表格数据,由于数组中对象的key多为英文格式,需要转换为中文标题
formatData(list) {
    const map = {
        '_id': '序号',
        'name': '名称',
        'mumber': '数量'
    };
    let header = [];
    let data = [];
    // 利用数组第一个对象的数据设置标题
    const one = list[0];
    if (!one) { // 当数组没有数据时,表格标题及内容都为空
        return {header, data};
    }
    header = Object.keys(one).map(key => {
        return map[key];
    });
    // data把list中每一个对象转成 对应的value数组
    data = list.map(obj => {
        return Object.values(obj);
    });
    return {header, data};
}

引入js文件,下载excel文件

import('@/utils/export2Excel').then(excel => {
    const {header, data} = this.formatData(list); // 此处list为要转换的数组数据
    // excel表示导入的模块对象
    excel.export_json_to_excel({
        header: header, // 表格头数据
        data: data, // 表格数据
        filename: '服务排名', // 文件名称
        autoWidth: true, // 宽度是否自适应
        bookType: 'xlsx' // 生成的文件类型
    });
});

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

将数组数据转为excel表导出 的相关文章

  • 将 OoXml 插入单词抛出错误:未知

    我一直在尝试通过office js将OOXML插入到word文档的正文内容中insertOoXML 方法 我什至尝试过最简单的实现 认为我在尝试替换 XML 本身中的 fieldCodes 时做了一些不正确的事情 所有结果都是这样Error
  • jquery.find() 可以只选择直接子项吗?

    我应该向 jQuery find 提供什么参数来选择元素子元素而不选择其他元素 我不能用 gt 引导选择器 而用 将选择所有后代 而不仅仅是直接子代 我知道 jQuery children 但这是一个库 因此用户能够提供自己的选择器 并且我
  • 如何重置使用 JavaScript 更改的 CSS 属性?

    我的导航按钮的宽度从 100px 增加到 150px 当鼠标悬停在 nav li hover width 150px 但是使用 javascript 我已经做到了 无论选择哪个选项 宽度都将继续为 150px 当选择每个选项时 它会使其他选
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 标签获取 href 值

    我有以下 html div class threeimages a img alt Australia src Images Services 20button tcm7 9688 gif a div class text h2 a hre
  • JavaScript 重定向到新窗口

    我有以下代码 它根据下拉列表的值重定向到页面 我如何使其在新窗口中打开 function goto form var index form select selectedIndex if form select options index
  • 在requestAnimationFrame中使用clearRect不显示动画

    我正在尝试在 HTML5 画布上做一个简单的 javascript 动画 现在我的画布是分层的 这样当我收到鼠标事件时 背景层不会改变 但带有头像的顶层会移动 如果我使用 requestAnimationFrame 并且不清除屏幕 我会看到
  • 使用 KnockoutJs 映射插件进行递归模板化

    我正在尝试使用以下方法在树上进行递归模板化ko映射 插入 http knockoutjs com documentation plugins mapping html 但我无法渲染它 除非我定义separate每个级别的模板 在以下情况下
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 在javascript中解析json - 长数字被四舍五入

    我需要解析一个包含长数字的 json 在 java servlet 中生成 问题是长数字被四舍五入 当执行这段代码时 var s x 6855337641038665531 var obj JSON parse s alert obj x
  • Babel 7 Jest Core JS“TypeError:wks不是函数”

    将我的项目升级到 Babel 7 后 通过 Jest 运行测试会抛出以下错误 测试在 Babel 6 中运行没有任何问题 但在 Babel 7 中失败并出现以下错误 TypeError wks is not a function at Ob
  • Firefox 书签探索未超过 Javascript 的第一级

    我已经编写了一些代码来探索我的 Firefox 书签 但我只获得了第一级书签 即我没有获得文件夹中的链接 e g 搜索引擎 雅虎网站 谷歌网站 在此示例中 我只能访问 Search engines 和 google com 不能访问 yah
  • Electron - 为什么在关闭事件时将 BrowserWindow 实例设置为 null

    The 电子文档 https electronjs org docs api browser window 提供以下代码示例来创建新窗口 const BrowserWindow require electron let win new Br
  • Javascript 数组到 VBScript

    我有一个使用 Javascript 构建的对象数组 我需要使用 VBScript 读取它 如下例所示 我找不到在 VbScript 代码中循环遍历数组的方法myArray object 这个例子是我的问题的简化 我无法更改页面的默认语言 这
  • 为 illustrator 导出脚本以保存为 web jpg

    任何人都可以帮我为 illustrator CC2017 编写一个脚本 将文件以 JPG 格式导出到网络 旧版 然后保存文件并关闭 我有 700 个文件 每个文件有 2 个画板 单击 文件 gt 导出 gt 另存为 Web 旧版 然后右键文
  • 如何在类似控制台的环境中运行 JavaScript?

    我正在尝试遵循这里的示例 http eloquentjavascript net chapter2 html http eloquentjavascript net chapter2 html and print blah 在浏览器中运行时
  • 为什么我不能在 AngularJS 中使用 data-* 作为指令的属性名称?

    On the t他的笨蛋 http plnkr co edit l3KoY3 p preview您可以注意到属性名称模式的奇怪行为data 在指令中 电话 Test of data named attribute br
  • Javascript转换时区问题

    我在转换当前时区的日期时间时遇到问题 我从服务器收到此日期字符串 格式为 2015 10 09T08 00 00 这是中部时间 但是当我使用 GMT 5 中的 new Date strDate 转换此日期时间时 它返回给我的信息如下 这是不
  • Safari 支持 JavaScript window.onerror 吗?

    我有一个附加到 window onerror 的函数 window onerror function errorMsg url line window alert asdf 这在 firefox chrome 和 IE 中工作正常 但在 s
  • 导致回发到与弹出窗口不同的页面

    我有一个主页和一个详细信息页面 详细信息页面是从主页调用的 JavaScript 弹出窗口 当单击详细信息页面上的 保存 按钮时 我希望主页 刷新 是否有一种方法可以调用主页的回发 同时还可以从详细信息页面维护保存回发 Edit 使用win

随机推荐

  • 【滤波器】1. 一阶RC滤波器

    文章目录 1 低通滤波器 2 高通滤波器 3 常用工具 1 低通滤波器 电容上的分压 U C U I
  • shell awk 入门

    awk 好用的数据处理工具 awk 也是一个非常棒的数据处理工具 sed 常常用于一整个行的处理 awk 则比较倾向于一行当中分成数个 栏位 或者称为一个域 也就是一列 来处理 因此 awk 相当的适合处理小型的数据数据处理呢 awk 通常
  • 在Linux系统中如何把文件拷贝到U盘

    Linux下把所有的都当成文件处理 如果在linux系统下需要拷贝文件 哪么你需要先把U盘挂载到系统中的某一个位置 然后再使用cp命令完成拷贝 工具原料 Linux操作系统一台 U盘一枚 方法 步骤 1 把U盘插入Linux电脑 确保U盘指
  • 用C语言编写的推箱子小游戏

    大一时候的期末大作业 一直没找到 在桌子缝里找到了优盘 现在才把内容放上来 希望能帮到你们 具体内容分为实验报告和程序具体代码 程序设计基础 期末大作业报告 实验设计 1 编写推箱子小游戏 2 使用C语言 3 使用Dev C 编程程序 4
  • 7. AES加密之base64编码

    整个加密的流程 编码算法 base64算法 与加密解密无关 只是对数据进行编码 方便在网络间进行传输 import org junit jupiter api Test import java nio charset StandardCha
  • SpringBoot+EasyCaptcha实现验证码功能

    一 EasyCaptcha简介 Java图形验证码 支持gif 中文 算术等类型 可用于Java Web JavaSE等项目 开源地址 https github com whvcse EasyCaptcha 二 SpringBoot项目如何
  • 华为OD机试真题-最多获得的短信条数【2023.Q1】

    题目内容 某云短信厂商 为庆祝国庆 推出充值优惠活动 现在给出客户预算 和优惠售价序列 求最多可获得的短信总条数 输入描述 第一行客户预算M 其中 0 M 10 6 第二行给出售价表 P1 P2 Pn 其中 1 n 100 Pi为充值 i
  • python3 在线解析jpg图片或解析本地jpg,判断jpg是否损坏

    一 JPEG图片格式详解 JPEG图片格式组成部分 SOI 文件头 APP0 图像识别信息 DQT 定义量化表 SOF0 图像基本信息 DHT 定义Huffman表 DRI 定义重新开始间隔 SOS 扫描行开始 EOI 文件尾 二 数据结构
  • SIEM的内容

    20200920 昨天看到了与SIEM相关的内容 但是除了一篇文章给我讲解了他们部分的SOC架构与方案 这个算是SIEM的升级版吧 其他的文章都没有给我非常好的反馈 这里来记录一下 文章列表 1 Security Correlation T
  • 反射与泛型

    文章目录 Class API demo reflect set action Class API getField getField String name 能获取 public 的字段 包括父类的 getDeclaredField Str
  • Linux E:Could not get lock /var/lib/dpkg/lock - open (11:Resource temorarily unavailable)

    1 错误提示如下图所示 2 解决方法 1 找到并杀掉所有的apt get和apt进程 运行命令 ps A grep apt 2 3 使用命令 sudo kill 9 进程号 或者 sudo kill SIGKILL 进程号 来关闭所有进程
  • 使用mysqldump命令导出指定数据库的数据+Java实现数据库的一键导出备份

    由于项目中需要用到在页面添加一个一键数据备份的功能 所以选择使用mysqldump命令的方法 用java的运行时类Java lang Runtime来使用后台窗口 记录下整个实现的过程 1 首先mysqldump命令需要在mysql的bin
  • linux管理控制面板--可视化管理linux

    市面上主要的网站主机分为三大类 具体差异简单说明 虚拟主机 也是大家口中说的 主机空间 可定制化低 适合纯小白和新手 完全不懂技术 说明白点 就是一台云服务器分割空间和内存形成的主机空间 可以用来搭建网站 但是管理权限受到主机厂商一些限制
  • 实现compose的五种思路

    好久没有更新了 最近学习的过程中一直在用联想的思维来去看问题 javascript是一门非常灵活的语言 集合了好多语言的特性和多种编程模式 对于compose的实现 就有非常多的思路 每一种思路都有自己的特点 实现之后 有种殊途同归的快感
  • 谷粒学院学习总结

    目录 项目模块说明 项目功能点 一 后台管理系统功能 1 登录注册功能 2 权限管理功能 3 讲师管理模块 4 课程分类模块 5 课程管理模块 6 统计分析模块 7 Canal数据同步 8 GateWay网关 9 首页Banner模块 待做
  • 统计学基础知识梳理(三)

    假设检验 定义 假设检验是用来判断样本与样本 样本与总体的差异是由抽样误差引起还是本质差别造成的统计推断方法 其基本原理是先对总体的特征作出某种假设 然后通过抽样研究的统计推理 对此假设应该被拒绝还是接受作出推断 假设检验与区间估计都是根据
  • mysql学习笔记(4)_TCL(Transaction Control Language)以及视图

    TCL Transaction Control Language 事务控制语言 事务简介 一个或一组sql语句组成一个执行单元 这个执行单元要么全部执行 要么全不执行 如果其中一条语句执行失败或产生错误 整个单元将会回滚 所有受到影响的数据
  • JSP 项目创建 idea完整版

    JSP 项目创建 idea完整版 打开IntelliJ IDEA 后 File gt new gt project 第二步 JAVA gt Web Application gt next 路径的存放 创建后的文件如图 配置web文件
  • 等保测评所需Linux操作命令

    等保测评所需Linux操作命令 主要测评命令 1 more etc passwd 文件中记录用户的属性信息 包括用户命 密码 用户标识 组标识等信息 2 more etc shadow 口令文件 用于保存包括个人口令在内的数据 不能被普通用
  • 将数组数据转为excel表导出

    安装xlsx依赖 npm install xlsx save npm install file saver script loader save 使用vue element admin 中的src vendor export2Excel j