【工具】vue excel导出

vue+Java 实现前后端Excel导出 阅读详情

本文中的excel导出工具取自花裤衩的https://gitee.com/panjiachen/vue-element-admin

环境:

  • vue@2.6.12
  • element-ui@2.15.5

  • file-saver@2.0.4

  • xlsx@0.14.1

 工具方法:

//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}`);
}

使用:

<template>
  <el-row>
    <h1>测试导出功能</h1>
    <el-button type="primary" @click="handleExport">导出excel</el-button>
  </el-row>
</template>

<script>
export default {
  methods: {
    handleExport() {
      let list = [];
      for(let i=1; i<=1000; i++){
        list.push({id: i, title: '标题'+ i,num: 10 + i,symbol: '_', createTime: '2021-08-18 11:23:12' });
      }

      import("@/vendor/Export2Excel").then((excel) => {
        const tHeader = ["序号", "标题", "数字", "符号", "时间"];
        const filterVal = [
          "id",
          "title",
          "num",
          "symbol",
          "createTime",
        ];
        const data = this.formatJson(filterVal, list);
        excel.export_json_to_excel({
          header: tHeader,
          data,
          filename: '测试文件',
          autoWidth: true,
          bookType: 'xlsx',
        });
      });
    },
    formatJson(filterVal, jsonData) {
      return jsonData.map(v => filterVal.map(j => v[j]));
    }
  },
};
</script>

结果呈现:

 

 

Vue项目导出Excel功能必备工具库详解 s2ab全称为 “string to array buffer”,其职责是将一个“伪二进制字符串”转换为真正的二进制缓冲区。i!获取Unicode码点& 0xFF取低8位,防止超出单字节范围返回,可用于构造Blob该函数虽小,却是连接 JavaScript 字符串与二进制流的关键桥梁。 阅读详情

相关推荐

如何读懂CiteSpace图谱?科研小白必看的节点颜色/年轮/聚类解读手册

本文详细解析CiteSpace图谱的核心视觉元素,包括节点颜色、年轮和聚类标识,帮助科研人员准确解读数据分析结果。通过生物医学案例展示如何从图谱中识别关键文献和研究趋势,提供五步系统解读法和常见错误规避策略,助力科研小白快速掌握文献计量分析技巧。

weixin_29179311的博客 318

vue导出文件,用FileSaverJs就够了

FileSaver.js 是在客户端保存文件的解决方案,非常适合 在客户端上生成文件的 Web 应用。它是 HTML5 版本的 saveAs() FileSaver 实现,支持大多数主流的浏览器,其兼容性如下图所示:**

weixin_47146612的博客 5975

Type-C连接中的CC引脚:Rp与Rd电阻的识别与供电模式选择

本文深入解析Type-C接口中CC引脚的核心功能,包括Rp与Rd电阻的识别原理及供电模式选择机制。通过详细的分压计算和实战案例,揭示Type-C设备如何通过CC引脚实现方向检测、角色识别和供电协商,为硬件设计提供关键指导。

weixin_30616969的博客 343

Vue项目中实现文件下载到本地的功能

公司业务需求,我需要实现一个合同模板,自定义输入内容后生成合同随后导出下载合同。(自定义部分用到的是) 为了实现这个文件下载到本地的功能,真的是废了九牛二虎之力,以至于差点放弃(主要还是自己菜)。刚开始自己用到的是Window.open()的方法,发现这个方法只能将你的合同在新页面打开,并不能实现下载功能;然后就换了html5 Bolb方法,弄了些许时间后发现还是不能达到自己的需求,最后在不断的挣扎中找到了**FileSaver.js** 首先需要安装即:npm install file-saver --s

Jimyking的博客 6055

xctf攻防世界 MISC高手进阶区 low

1. 进入环境,下载附件 给出的一张bmp图片,没有其他信息 2. 问题分析 扔进binwalk中,没有发现有用信息 使用zsteg,没有有用信息 塞入StegSolve中,发现有点猫腻,如图: 有点二维码的感觉,emmm,需要像素处理,但不知道如何下手,参考网上的wp,发现是让使用lsb隐写,copy代码: from PIL import Image img = Image.open('./pic/low.bmp') img_tmp = img.copy() pix = img_tmp.load()

l8947943的博客 1万+

MS1030超声波流量计电路实战:如何用15ps精度优化水表设计(附配置代码)

本文深入探讨了如何利用MS1030超声波流量计芯片实现15ps高精度测量,以优化水表设计。文章从系统误差分配出发,详细解析了硬件电路设计要点、SPI通信配置及核心优化技巧,如利用可编程偏置电压和8回波累加功能来提升抗干扰能力与测量稳定性,并附有实用的配置代码示例。

svm4gardener的博客 340

vue导出Excel

vue导出Excel

m0_68937827的博客 359

Jenkins+docker 微服务实现自动化部署安装和部署过程

本文详细介绍了如何使用Docker部署Jenkins自动化服务器。主要内容包括:1)拉取Jenkins官方或BlueOcean镜像;2)创建容器并配置端口映射、数据卷挂载;3)设置防火墙规则;4)配置清华大学镜像加速;5)安装必要插件;6)SSH密钥配置;7)构建触发器设置;8)编写自动化构建脚本。通过Docker部署Jenkins可以简化安装流程,确保环境一致性,并利用容器特性实现快速启动和管理。文章提供了完整的配置步骤和注意事项,帮助用户快速搭建CI/CD环境。

qq_33665793的博客 1691

如何将Vue中表格数据,以Excel格式导出?报saveAs错误如何解决?

一、安装依赖 npm install file-saver --save npm install xlsx --save npm install script-loader --save-dev 二、下载两个所需的js文件Blob.js和Export2Excel.js 链接:https://pan.baidu.com/s/1CNcEncW-f...

qq_34825875的博客 5351

第7章: MMU notifier在AMD GPU驱动中的应用

AMD GPU驱动利用MMU Interval Notifier机制实现共享虚拟内存(SVM)和异构内存管理(HMM)。通过分析AMDGPU内存架构(VRAM、GTT、Userptr)和Buffer Object设计,重点探讨了Userptr零拷贝机制如何依赖MMU notifier保持CPU/GPU内存一致性。HMM框架进一步实现统一地址空间和透明页面迁移,AMDGPU通过amdgpu_hmm.c实现两种invalidate回调(GFX和HSA模式),处理不同场景下的内存失效同步问题。

图形/计算GPU的驱动与虚拟化技术分享园地 2473

Python爬虫实战:利用Playwright与反反爬技术抓取Crunchbase企业数据

在当今数据驱动的商业环境中,获取准确的企业信息对于市场分析、竞争情报和投资决策至关重要。Crunchbase作为全球领先的企业信息平台,包含了数百万家公司、投资者和关键人员的详细数据。本文将深入探讨如何使用Python最新爬虫技术Playwright,结合多种反反爬策略,高效抓取Crunchbase企业数据。我们将从爬虫基础概念讲起,逐步深入到高级技巧,并提供完整的代码实现,帮助读者掌握现代网络数据采集的核心技术。网络爬虫技术自互联网诞生以来经历了显著演变。

2201_76125261的博客 1833

vue导出excel

【代码】vue到出excel。

qq_34631220的博客 649

PyTorch实战:卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类

PyTorch可以说是三大主流框架中最适合初学者学习的了,相较于其他主流框架,PyTorch的简单易用性使其成为初学者们的首选。这样我想要强调的一点是,框架可以类比为编程语言,仅为我们实现项目效果的工具,也就是我们造车使用的轮子,我们重点需要的是理解如何使用Torch去实现功能而不要过度在意轮子是要怎么做出来的,那样会牵扯我们太多学习时间。以后就出一系列专门细解深度学习框架的文章,但是那是较后期我们对深度学习的理论知识和实践操作都比较熟悉才好开始学习,现阶段我们最需要的是学会如何使用这些工具。

master_hunter的博客 8935

Vue3 + Element Plus 表格导出Excel 通用工具文档

该工具基于 `xlsx` 库封装,提供 Vue3 + Element Plus 场景下 `el-table` 数据导出 Excel 的通用解决方案,支持「数组数据导出」(推荐)和「DOM 表格导出」(兼容分页/筛选场景)两种模式,具备参数可配置、错误处理、格式兼容等特性。

cypking的博客 924

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

vue工具组件 ——实现导入导出excel文件

vue项目–导入导出excel文件

咖啡壶的博客 688

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

vue中封装导出excel工具

在src下新建vendor 文件夹新建Export2Excel.js文件 写入以下代码 在项目当中 安装依赖插件 : npm install file-saver script-loader 创建一个用来处理数据的函数 handleData(res){//处理后台数据导出表格需要的格式方法 constmirror={//映射模板 'timeOfEntry':'入职日期', 'formOfEmployment':'聘用形式'...

ninjia250的博客 307

Vue+element 前端导出Excel功能工具包

1.安装依赖 1, npm install -S file-saver xlsx 2,npm install -D script-loader 2.在Vue项目src文件夹下,新建vendor文件夹(名称随意)并放入Blob.js和Export2Excel.js文件,如下图(文字末尾含下载链接) 3.在需要的.vue文件中写入如下代码: // 点击导出按钮事件 exportData(){ const { export_json_to_excel } = require(’…/…/vendor/Export

happyyinlina的博客 495

Vue常用Excel导出工具SheetJS

如何使用SheetJS导入导出Excel?直接复制案例吧!

zwz1342的博客 1146

Vue+Springboot,通过EasyExcel工具实现Excel导出

(注意:调用后端接口时需指定{responseType:'blob'},否则导出的excel表格打不开)

Handsome__c的博客 831

vue 基于 exceljs 导出 excel实战示例

背景 在做一个小东西,需要导出excel,之前导出excel 的方式都是在服务器端,生成excel然后在浏览器端进行下载,这次想进行在前端进行导出,基于这个需求在网上找了一些工具,这里会做一些对比 工具对比 名称 优点 缺点 活跃度 js-xlsx 支持nodejs服务端和兼容大多数浏览器导出,读写支持完美 社区版本不支持样式定制 15867 exceljs 支持nodejs服...

资深架构师分享:深入剖析软件架构,探讨云计算、微服务、大数据等前沿技术。分享实践经验,促进技术交流,共同构建卓越系统。 7332

【工具】vue excel导入通用组件-模板导出组件

环境: vue@2.6.12 element-ui@2.15.5 1.excel导入 组件代码: //components/ExcelImport <template> <div class="component-upload-image"> <el-upload accept=".xls,.xlsx" :action="uploadImgUrl" :on-success="handleUploadSucc.

代码随想录 2997

从表结构设计到 Excel 字典一键导出:用Electron+Vue3 写PostgreSQL 9.6 + PostGIS 轻量设计工具

【摘要】针对PostgreSQL9.6+PostGIS开发痛点,作者开发了一款Electron+Vue3桌面工具,主要解决:1)自动生成分区表SQL(支持年/月/日分区策略);2)一键导出Excel数据字典;3)可视化表结构设计(拖拽调整字段顺序);4)原生支持PostGIS空间数据类型。该工具采用本地化存储,无需连接真实数据库,支持多项目管理,显著提升开发效率。适用于维护PG9.6老项目、GIS开发及需要快速生成数据库文档的工程师。现已开源发布。

qq_41211797的博客 902

springboot+vue+element+poi+hutool工具导出为Excel文件

前后端分离springboot+vue+poi+hutool工具导出为Excel文件

加油! 298

SpringBoot+vue实现导入导出excel,使用hutool工具进行太简单了吧也不过如此

⭐⭐⭐----------- 在实际应用场景中,我们常常需要迁移应用到另一个环境中。「应用的导入导出」功能可以便捷实现应用的迁移与重塑,甚至可以选择不同菜单,数据模型,与审批流程,业务事件,选择性导入,更高效便捷完成应用的迁移。其次,在导入

SYJ的博客 2273

xlsx插件,导入导出Excel (vue中导入导出表格)

- ## vue文件中直接写函数,完成的测试 1). 安装xlsx, yarn add xlsx 2). importExcel.vue(实现了 导入表格 ) <template> <div class="hello"> <el-upload class="upload-demo" ref="upload" accept=".xls,.x...

ddx2019的博客 2万+

spring Boot+vue做导出excel功能

最近在写后台管理系统,要实现后台数据导出excel这个功能,后台用的是spring boot,前台用的是vue+iview maven依赖: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifac...

weixin_43481793的博客 8584
上一篇: react-hooks学习
下一篇: 【工具】vue excel导入通用组件-模板导出组件
谭CV
博客等级 码龄9年 73粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值