js 导出excel详解

2023-11-11

一、需要安装 npm install xlsx-style         Blob.js 和Export2Excel.js 在网上搜都可以找到的 ,而Export2Excel我做了修改,代码如下:带——————的都是我改动的地方

//Export2Excel.js
/* eslint-disable */
require('script-loader!file-saver');
require('script-loader!../toexcel/Blob');//转二进制用  这边要写你的blob的实际地址
require('script-loader!xlsx/dist/xlsx.core.min');
import XLSX from "xlsx-style" //必须要引入才可以,否则报错 


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';
            cell.s =  {
                border: {
                    //单元格外侧框线
                    top: {
                        style: "thin"
                    },
                    bottom: {
                        style: "thin"
                    },
                    left: {
                        style: "thin"
                    },
                    right: {
                        style: "thin"
                    }
                },
                alignment:{
                    vertical:'center' //设置上下剧中 yh
                }
            };
            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);
    console.log('a')
    var oo = generateArray(theTable);
    var ranges = oo[1];

    /* original data */
    var data = oo[0];
    var ws_name = "SheetJS";
    console.log(data);

    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")
}

function formatJson(jsonData) {
    console.log(jsonData)
}

export function export_json_to_excel(th, jsonData, defaultTitle,tSetting) {

    /* original data */
    const {merges,cols} = tSetting;
//cols = [{wpx: 250}, {wpx: 250}, {wpx: 100}, {wpx: 100}]; //设置宽度 这种格式就行
    var data = jsonData;
    data.unshift(th);
    var ws_name = "SheetJS";

    var wb = new Workbook(),
        ws = sheet_from_array_of_arrays(data);
    // ws['!merges'] = [{
    //   s: { 开始
    //   c: 0, 列
    //   r: 0  行
    //   },
    //   e: {c: 3, r: 0} 结束
    // },
    //   {
    //     s: {c: 0, r: 2},
    //     e: {c: 0, r: 3}
    //   }
    // ];
     ws['!merges'] = merges?merges:[];
     ws['!cols'] =  cols?cols:[];
    /* 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'
    });
    var title = defaultTitle || '列表'
    saveAs(new Blob([s2ab(wbout)], {
        type: "application/octet-stream"
    }), title + ".xlsx")
};

二 、配置config解决cpexcel.js报错问题:

在 module.exports里加上   externals:{ './cptable': 'var cptable' } //解决cpexcel.js报错问题

三、直接调用了

exportExcel(){
  let totalCount = [];
  this.tableData.forEach(i=>{
    i.params.forEach(s=>{
      let obj = {
        project:i.name,
        testName:s.label,
        value:''
      }
      totalCount.push(obj)
    })
  });


  let tSetting = {
    merges:[],
    cols:[]
  };
  let tHeader = ["项目名称", "实验名称", "测试值"];//上面设置Excel的表格第一行的标题
  let jsonData = [];
  let tp = '';
  let obj = {
    s:{},
    e:{}
  }
  totalCount.forEach((r, ind) => {
    if (r.project!=tp){
      if (ind===0){
        obj.s = {
          c: 0,
          r: ind+1
        }
      } else {
        obj.e = {
          c: 0,
          r: ind
        }
        tSetting.merges.push(JSON.parse(JSON.stringify(obj)));
          obj.s = {
            c: 0,
            r: ind+1
          }
      }
    }
    if(ind==totalCount.length-1){
      obj.e = {
        c: 0,
        r: ind+1
      }
      tSetting.merges.push(JSON.parse(JSON.stringify(obj)));
    }
    let tem = {
      "项目名称":r.project,
      "实验名称":r.testName,
      "测试值":r.value
    };
    tp = r.project;
    jsonData.push(tem);
  });
  tSetting.cols = [{wpx: 250}, {wpx: 250}, {wpx: 100}, {wpx: 100}]; //设置宽度
  const data = this.formatJson(tHeader, jsonData);
  this.$tools.exportExcel.export_json_to_excel(tHeader, data, "运行统计模版",tSetting);   //标题,数据,文件名
},
formatJson(filterVal, jsonData) {
  return jsonData.map(v => filterVal.map(j => v[j]));
},

 

 

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

js 导出excel详解 的相关文章

  • [Telegram X]旧版分享 突破被锁群组

    Telegram X的锁群是由于 App Store 审核时发现Telegram官方并不限制18 社会舆论等的讨论 在 版本 5 0 2 版本号825487096 时就已经封禁该类群组 注 可能由于新版审核时由于存在这些内容被禁止发布在Ap
  • 初识OceanBase

    OceanBase 是一款由阿里巴巴公司自主研发的高性能 分布式的关系型数据库 支持完整的 ACID 特性 高度兼容 MySQL 协议与语法 能够以最小的迁移成本使用高性能 可扩张 持续可用的分布式数据服务 OceanBase 实现了数千亿
  • Redis面试题(IO多路复用)

    目录 Redis是单线程的 但是为什么还那么快 阻塞IO 非阻塞IO IO多路复用 网络模型 面试回答 Redis是单线程的 但是为什么还那么快 答 Redis是纯内存操作 执行速度非常快 采用单线程 避免不必要的上下文切换可竞争条件 多线
  • 铜缆有哪些优点?

    铜缆包含由铜金属制成的电线 长期以来一直用于传输数据 这些电缆使用流经铜线的电脉冲将数据从始发端传输到接收端 铜电缆通常用于电信行业 汽车行业和供电系统 铜缆有哪些优点 优质的电导体 铜是非常好的电导体之一 非常适合使用电脉冲传输数据 易于
  • CSS图标与链接

    目录 如何添加图标 Font Awesome 图标 实例 Bootstrap 图标 实例 Google 图标 实例 为图标添加样式或颜色 设置链接样式 实例 实例 文本装饰 实例 背景色 实例 链接按钮 实例 更多实例 如何添加图标 向 H
  • 结构体强制类型转换

    在c语言中 结构体和int等类型一样 都是数据类型 其他类型怎么转换 结构体就怎么转换 没有特殊的地方 对于这个问题 可能想问的是这个吧 如果将一个结构体强制类型转换为另一个结构体 或者类型 那这个结构体的成员怎么样了 如果将一个结构体强制
  • 智能化的设备管理系统,为企业信息化建设添砖加瓦

    设备管理的智能化 数字化 可视化是企业信息化建设的三大趋势 也是智能智慧工厂建设的重要内容 因此引进成熟先进的设备管理系统 是每一个企业当下的重要工作 璞华大数据HawkEye设备智能维保平台分为两个维度协助企业进行设备管理 即设备资产管理
  • 11-10 格式化文本的输入输出

    1 scanf 和 printf scanf 和 printf 函数日常使用较多 此处不多介绍了 详细内容可参考 https zh cppreference com w c io fscanf 2 sscanf 和 sprintf ssca
  • JVM虚拟机技术原理与实现

    一 Java语言与Java虚拟机 1 Java语言简介 Java是Sun公司推出的Java语言和Java平台的总称 在操作系统中安装Java平台后Java应用程序即可直接运行 Java程序被编译成字节码解释执行 使Java程序与平台无关 J
  • es根据条件删除数据

    es根据条件删除数据 POST请求 http localhost 9200 indexName delete by query 请求参数 query match columnName 搜索列的条件
  • 哪些元器件在未来会有更广泛的应用?

    随着科技的发展和进步 电子技术已经成为现代社会的重要组成部分 元器件作为电子产品的基本构成单元 其发展和应用对于电子技术的进步和创新有着至关重要的作用 随着人工智能 物联网和智能制造等新兴技术的快速发展 一些元器件已经或者将在未来得到更广泛
  • 解决 mysql 自动增长的 id 不是从 1 开始 或 不连续

    原因 1 insert 失败后 id 已自动增加 会造成 id 不连续 2 delete 后 再重新插入数据后 id 会从删除前最后的 id 开始增加 造成 id 不是从1开始增加 注意 删除全部数据时 不要用 delete from ta
  • Random.Range()的范围问题

    Random Range 方法的是进行差生随机数的一个方法 int i Random Range min max 这里进行产生的随机数 当min max相等 产生的随机数返回的是min 因为min max 产生的最大的也就是max 当min
  • HTML-页面经3秒之后自动跳转,动态刷新秒数

    样图 div div
  • MATLAB复习

    目录 矩阵 定义矩阵 查找矩阵元素 特殊矩阵 矩阵运算 乘方与点乘 字符串数组 创建字符串 查找字符 字符串转换 创建字符串数组 元胞数组 元胞数组的创建 元胞数组的显示 celldisp 和 cellplot 元胞数组的扩充和收缩 元胞数
  • VMware中安装mysql

    文章目录 1 将windows下的安装包上传到Linux服务器 安装包移动并解压 3 卸载系统自带的mysql 4 安装mysql服务端 5 安装mysql客户端 6 登录mysql 6 1 查看root密码 6 2 启动mysql服务 6
  • 刷脸支付自主创业超低门槛等您来

    新兴的人工智能技术不断被应用到支付场景中 指纹支付 声纹支付到刷脸支付 新技术的蔓延总是能出乎我们的意料 迅速地渗透进生活的方方面面 行业监管趋严 智能应用不断迭代 双重作用下 支付行业正迎来一次革命性的转折 刷脸支付开始普及 中国有700
  • Excel:LOOKUP函数的经典用法

    1 逆向查询 下面这个表中 A C列是员工基础信息表 分别是部门 姓名和职务 现在要根据E5单元格中的员工姓名 在这个信息表中查询属于哪个部门 也就是咱们常说的逆向查询 就可以使用LOOKUP函数了 F5单元格输入以下公式 LOOKUP 1

随机推荐

  • 转:基于 Drone + Gogs 构建私有 CI/CD 平台

    前言 很久之前 部署方案选择了基于 Docker 的容器化落地方案 极简描述与总结于 gogs drone docker 但是随着微服务抽象定义的服务越来越多 团队规模越来越壮大时 单机部署的自动化持续部署平台在并行处理任务可能会出现大量排
  • 构造函数访问权限和基类构造函数,派生类的构造函数调用顺序

    include
  • MyBatis多条件查询、动态SQL、多表操作、注解开发详细教程

    一 多条件查询 二 动态SQL 1 if where 2 choose when ortherwise 3 foreach 三 多表操作 1 一对一 2 一对多 3 多对多 四 注解开发 MyBatis封装了JDBC通过Mapper代理的方
  • Flutter如何使widget始终保持在屏幕底部

    Flutter如何使widget始终保持在屏幕底部 问题描述 在登录或者注册页面 需要在底部展示一些隐私政策或者是隐私协议 就是用了一种Stack布局方式 但是使用这种方式在没有键盘弹出的时候看起来一起正常 但是只要有软键盘弹出就会把底部使
  • matlab中的导函数驻点,Matlab用导数作定性分析

    Matlab用导数作定性分析 5 1知识要点 函数作图 用导数定性描述函数 clf x linspace 8 8 30 f x 3 2 4 x 1 plot x f fplot x 3 2 4 x 1 8 8 clf x sym x f x
  • 软件工程开发模式:从传统到现代的演进

    引言 软件工程开发模式是指导软件开发过程的重要框架 旨在提高软件开发的效率和质量 随着技术的不断进步 软件工程开发模式也在不断发展演变 以适应不同的项目需求和开发环境 本文将介绍传统软件工程开发模式和现代敏捷 精益和DevOps软件工程开发
  • Docker进阶学习:docker-compose的体验

    安装好docker compose后 我们要体验一下了解基础的操作和命令 搞一个官方demo python应用 计数器 redis 我先来一个官方文档地址 基本很多都是按照文档来的 建议尽量去官方文档来产看最新的 我这个可能也只是主要内容搬
  • Jmeter(二十一) - 从入门到精通 - JMeter断言 - 上篇(详解教程)

    1 简介 最近由于在搭建自己的个人博客可能更新的有点慢 断言组件用来对服务器的响应数据做验证 常用的断言是响应断言 其支持正则表达式 虽然我们的通过响应断言能够完成绝大多数的结果验证工作 但是JMeter还是为我们提供了适合多个场景的断言元
  • python获取列表的任意行任意列

    import numpy as np a 1 12 13 14 2 22 23 24 3 32 33 34 4 42 43 44 a np array a print 获取列表的任意列 print a 3 2 1 0 0 print 获取列
  • 2021年网络安全省赛--服务器内部信息获取解析(中职组)

    2021年省赛服务器内部信息获取解析 一 竞赛时间 180分钟 共计3小时 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1 收集服务器场景中的服务信息 并获取服务器中开放的端口号信息 将服务器端口号作为flag提交 如果有多
  • linux内核历史版本及网址介绍

    官网 https www kernel org 最新版本4 12 rc4 Protocol Location HTTP https www kernel org pub GIT https git kernel org RSYNC rsyn
  • esBuild + SWC 构建 TS 项目

    1 esBuild 介绍 在 esbuild 的官方介绍中打包 threejs 只需要 0 37 秒 Esbuild 是一个非常新的模块打包工具 它提供了与 Webpack Rollup Parcel 等工具 相似 的资源打包能力 却有着高
  • 两个3*3的卷积核替代5*5(三个3*3卷积核替代7*7)分析

    文章目录 为什么一个5x5的卷积核可以用两个3x3的卷积核来替代 一个5 5卷积 两个3 3卷积核 为什么一个7x7的卷积核可以用三个个3x3的卷积核来替代 一个7 7卷积 三个3 3卷积核 优点总结 为什么一个5x5的卷积核可以用两个3x
  • 输入一个字符串,把一个字符串的字符逆序输出

    package com qf day4 import java util Scanner public class Test29 public static void main String args 把一个字符串的字符逆序输出 Scann
  • 可能是最详细的React组件库搭建总结

    可能是最详细的React组件库搭建总结 概览 本文包含以下内容 prepare 组件库前期开发准备工作 eslint commit lint typescript等等 dev 使用docz进行开发调试以及文档编写 build umd cjs
  • TeamViewer账号未激活问题

    出现如下问题 解决步骤 1 点击重新发送电子邮件 2 网页上登录 3 QQ邮箱里面添加设备信任 4 返回登录页面再重新 刷新重新输入登录信息登录 然后重新发送电子邮件到qq邮箱 5 点击激活 6 登录 gt gt gt 不要现在登录 gt
  • JAVA各种加密与解密方式

    之前有兴趣研究了一下java的加密与解密的方法 发现市面上有好多种加密解密方式 在这里整理了一下 目录 1 BASE64加密 解密 2 MD5 Message Digest Algorithm 加密 3 DES Data Encryptio
  • 将 pip 的默认源修改为阿里源(Windows 版)

    背景 由于 python 自带的源下载速度非常慢 特别是安装一些库的时候 甚至有时会失败 临时替换 临时替换直接使用以下命令即可 pip install 包名 i 源地址 例如 pip install numpy i http mirror
  • Visual Studio无法打开源文件错误

    在写用Visual Studio跨平台Linux项目的时候 遇到了无法打开源文件错误 主要原因是include目录里面没有这些文件 解决方法是 把Linux的 usr include目录压缩下载在本地 zip r usr include z
  • js 导出excel详解

    一 需要安装 npm install xlsx style Blob js 和Export2Excel js 在网上搜都可以找到的 而Export2Excel我做了修改 代码如下 带 的都是我改动的地方 Export2Excel js es