使用VUE+XLSX实现纯前端的导出Excel

Vue应用中使用xlsx实现Excel文件导出的完整指南 Vue使用xlsx库的详细教学,文章开头展示了一个实战例子帮助快速入手,接下来详细解释了Vue使用xlsx库的详细步骤帮助深入理解其内容 阅读详情

1. 安装需要的插件

npm i xlsx -S
npm i xlsx-style -S
npm i file-saver -S

安装完xlsx-style插件并引入后启动项目会报错
./cptable in ./node_modules/xlsx-style/dist.cpexcel.js
出现这个问题时,需要在vue.config.js中的configureWebpack配置项中添加如下配置即可:
externals:{
‘./cptable’:‘var cptable’
}

vue导入xlsx-style组件报错Can‘t resolve ‘./cptable‘ in ‘xxx\node_modules_xlsx

官方给出了解决方案,我们只需要修改一下配置
vue2x版本
就是有webpack配置
就是在webpack.base.conf.js中加入下面这段

module.exports = {
	externals: {
    	'./cptable': 'var cptable'
 	}
}

vue3x版本
在根目录下的vue.config.js(没有的话自己创建一个)
加入下面的代码

module.exports = {
	configureWebpack: {
    	externals: {
      		'./cptable': 'var cptable'
    	}
  	}
}

2、引入并使用

//引入相关插件
import XLSX from "xlsx";
import XLSXStyle from 'xlsx-style';
import XLSX_SAVE from 'file-saver';
	
//导出的源数据
let originData = [//每一个Object对应excel一行的内容
  {
    "表头1":'value1',
    "表头2":"value2",
    "表头3":"value3"
  },
  {
    "表头1":'value1',
    "表头2":"value2",
    "表头3":"value3"
  }
];

let wb = {
  SheetNames:['工作簿名称'],
  Sheets:{},
  Props:{}
};

let ws = XLSX.utils.json_to_sheet(originData);
	
//设置表格每列的宽度
ws['!cols'] = [200,200,200];
	
//设置单元格属性
Object.keys(ws).forEach(key => {
  if(key.indexOf('!') < 0) {//判断是否是每个单元格
    //获取单元格的序号
    let num = key.replace(/[^0-9]/ig,"");
    if(num.length === 1 && +num ===1){//判断是否为首行
      //设置首行样式
      ws[key].s = {
        alignment: {
          horizontal:'center',//水平居中
          vertical:'center',//垂直居中
          wrapText:true//是否自动换行
        },
        border: {//设置边框
          top:{style:'thin'},
          bottom:{style:'thin'},
          right:{style:'thin'}
        },
        fill:{
          fgColor:{rgb:ws[key].v.indexOf('必填') === -1 ? "E1F3D8" : "F56C6C"};//单元格背景色的填充
        }
      }
    } else {//非首行的单元格样式
      ws[key].s = {
        alignment: {
          horizontal:'center',
          vertical:'center',
          wrapText:true
        }
      }
    }
  }
})
						  
wb.Sheets[工作簿名称] = ws;
const wbout = XLSXStyle.write(wb,{
  type:"binary",
  bookType:"xlsx"
})
XLSX_SAVE.saveAs(new Blob([s2ab(wbout)],{type:'application/octet-stream'}),导出的excel文件名称);
						  
const s2ab = s => {
  let buf = new ArrayBuffer(s.length);
  let view = new Uint8Array(buf);
  for(let i = 0; i != s.length; i++) view[i] = s.charCodeAt(i) & 0xFF;
  return buf;
}


3、vue项目中的简单封装使用

单工作簿的导出,可直接复制调用

//导出excel方法
import XLSX from "xlsx";
import XLSXStyle from 'xlsx-style';
import XLSX_SAVE from 'file-saver';

/*
 *
 * originData => 导出的表格数据,最后传入的格式为:  ****必传****
 *  [
 *    {
 *      '表头1':'xxx1',
 *      '表头2':'yyy1',
 *      '表头3':'zzz1',
 *    },
 *    {
 *      '表头1':'xxx2',
 *      '表头2':'yyy2',
 *      '表头3':'zzz2',
 *    },
 *  ]
 *
 * sheetName => excel表格里的sheet名称  ****必传****
 *
 * excelName => excel表格的名称  ****必传****
 *
 * colWidth => 表格列宽  可传可不传
 *    ==> 不传默认为200
 *    ==> 可传数字,代表所有列宽均为此宽度
 *    ==> 可传数组,[200,300,400,500,...]按数组值依次设置列宽
 *
 */


export const exportExcel = (originData,sheetName,excelName,colWidth) =>{
  let sheet  = sheetName ? sheetName : '导出的excel';
  let excel  = excelName ? excelName : '导出的excel';
  let columnWidth = [];
  if (colWidth){
    if (typeof colWidth === "number"){//只传了列宽的值,表明所有列宽均为此值
      if (originData.length) {
        Object.keys(originData[0]).forEach(item=>{
          columnWidth.push({wpx:colWidth})
        })
      }
    }else if (colWidth instanceof Array) {//传进来的是数组,按顺序依次赋值
      colWidth.forEach(item=>{
        columnWidth.push({wpx:item});
      })
    }
  }else {
    if (originData.length) {
      Object.keys(originData[0]).forEach(item=>{
        columnWidth.push({wpx:200})
      })
    }
  }
  var wb = {
    SheetNames: [sheet],
    Sheets: {},
    Props: {},
  }
  var ws = XLSX.utils.json_to_sheet(originData);
  ws['!cols'] = columnWidth;
  Object.keys(ws).forEach((key) => {//设置单元格属性
    if (key.indexOf('!') < 0) {
      //获取单元格的数字
      let num =  key.replace(/[^0-9]/ig,"");
      if (num.length === 1 && +num === 1){
        ws[key].s = {
          alignment: {
            horizontal: 'center',
            vertical: 'center',
            wrapText: true,
          },
          border: {  //单元格外侧框线
            top: {
              style: 'thin'
            },
            bottom: {
              style: 'thin'
            },
            right: {
              style: 'thin'
            }
          },
          fill:{
            fgColor: { rgb: ws[key].v.indexOf('必填') === -1 ? "E1F3D8" : 'F56C6C' },
          }
        }
      }else {
        ws[key].s = {
          alignment: {
            horizontal: 'center',
            vertical: 'center',
            wrapText: true,
          },
        }
      }
    }
  })

  wb.Sheets[sheet] = ws
  const wbout = XLSXStyle.write(wb, {
    type: 'binary',
    bookType: 'xlsx',
  })
  XLSX_SAVE.saveAs(new Blob([s2ab(wbout)], {type: 'application/octet-stream',}), `${excel}.xlsx`);
}

const 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;
}


多工作簿的导出,可直接复制调用

//导出excel方法
import XLSX from "xlsx";
import XLSXStyle from 'xlsx-style';
import XLSX_SAVE from 'file-saver';

/*
 *
 * originArr => 导出的表格数据,最后传入的格式为:  ****必传****
 *  [
 *    {
 *       originData:[
 *        {
 *          '表头1':'xxx1',
 *          '表头2':'yyy1',
 *          '表头3':'zzz1',
 *        },
 *        {
 *          '表头1':'xxx2',
 *          '表头2':'yyy2',
 *          '表头3':'zzz2',
 *        },
 *      ],
 *      sheetName:"xxxx",
 *      colWidth:200
 *    }
 *  ]
 *
 *
 * excelName => excel表格的名称  ****必传****
 *
 *
 */


export const exportMoreExcel = (originArr,excelName) =>{
  let sheetName = [];
  let excel  = excelName ? excelName : '导出的excel';
  originArr.forEach(item=>{
    sheetName.push(item.sheetName);
  })
  var wb = {
    SheetNames: sheetName,
    Sheets: {},
    Props: {},
  }
  originArr.forEach(originItem=>{
    let {originData,sheetName,colWidth} = originItem;
    let columnWidth = [];
    if (colWidth){
      if (typeof colWidth === "number"){//只传了列宽的值,表明所有列宽均为此值
        if (originData.length) {
          Object.keys(originData[0]).forEach(item=>{
            columnWidth.push({wpx:colWidth})
          })
        }
      }else if (colWidth instanceof Array) {//传进来的是数组,按顺序依次赋值
        colWidth.forEach(item=>{
          columnWidth.push({wpx:item});
        })
      }
    }else {
      if (originData.length) {
        Object.keys(originData[0]).forEach(item=>{
          columnWidth.push({wpx:200})
        })
      }
    }

    var ws = XLSX.utils.json_to_sheet(originData);
    ws['!cols'] = columnWidth;
    Object.keys(ws).forEach((key) => {//设置单元格属性
      if (key.indexOf('!') < 0) {
        //获取单元格的数字
        let num =  key.replace(/[^0-9]/ig,"");
        if (num.length === 1 && +num === 1){
          ws[key].s = {
            alignment: {
              horizontal: 'center',
              vertical: 'center',
              wrapText: true,
            },
            border: {  //单元格外侧框线
              top: {
                style: 'thin'
              },
              bottom: {
                style: 'thin'
              },
              right: {
                style: 'thin'
              }
            },
            fill:{
              fgColor: { rgb: ws[key].v.indexOf('必填') === -1 ? "E1F3D8" : 'F56C6C' },
            }
          }
        }else {
          ws[key].s = {
            alignment: {
              horizontal: 'center',
              vertical: 'center',
              wrapText: true,
            },
          }
        }
      }
    })

    wb.Sheets[sheetName] = ws
  })

  const wbout = XLSXStyle.write(wb, {
    type: 'binary',
    bookType: 'xlsx',
  })
  XLSX_SAVE.saveAs(new Blob([s2ab(wbout)], {type: 'application/octet-stream',}), `${excel}.xlsx`);
}

const 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;
}


4.vue安装xlsx

npm install xlsx --save
npm install file-saver --save

package.json

"file-saver": "^2.0.5",
"xlsx": "^0.18.3"`

版本不兼容导致"export default (imported as ‘XLSX’) was not found in ‘xlsx’

先卸载:npm uninstall xlsx

之后重新安装低版本:npm install xlsx@0.17.0 --save

XLSX + VUE获取表格内容,实现下载模板、导入表格、导出表格功能 vue xlsx读取excel文件 阅读详情

相关推荐

前端导出Excel详细过程(包含按列导出+表格带样式+表格合并+表格嵌套表格+中英文两个sheet)

vue项目前端导出Excel,数据结构数组中包含数组,实现按所需的列导出Excel,运用到xlsx-populate插件,导出Excel文件:带边框、首列合并、表格嵌套表格、分别生成chinese和english两个工作表。

weixin_43259189的博客 8989

Vuexlsx使用

Vuexlsx使用

qq_43548590的博客 1万+

前端实现导入Excel进行数据展示、导出

一个 excel 文档 需要对文档里面的数据进行筛选拆分重组 由于数据量巨大 后端又抽不出来手 于是使用前端解决方案。

weixin_46607967的博客 2730

vue读取本地xlsx文件

vue读取本地xlsx文件

努力努力再努力的博客 9073

Vue项目使用XLSX展示、下载和读写Excel文件

前端开发工作中需要展示一些复杂表格在页面上,不用在去处理复杂的样式,使用xlsx工具直接将复杂表格内容转成前端可直接使用的HTML代码。

daguo504的博客 3357

vue xlsx 导入导出_前端实现excel表格导入导出

代码实现(全)accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"/>导入导出{{errorMsg}}确认// 引入xlsxvar XLSX = require('xlsx')export default {name: 'Index',data ...

weixin_39906358的博客 677

vue+js+xlsx实现前端导出到入excel表格

vue+js+xlsx实现前端导出到入excel表格 1、js-xlsx安装 1. npm:npm install xlsx 2.bower: bowerinstall js-xlsx 3. 下载相关js,页面中直接引用(点击下载) 2、到入excel,解析excel文件成为json格式,调用数据上传接口保存数据。 直接...

weixin_44488046的博客 868

vue3 + antd vue 前端 基于xlsx 实现导入exceljson,将json数据转换XLSX导出(模版下载)

vue3 + antd vue 前端 基于xlsx 实现导入exceljson,将json数据转换XLSX并下载(下载模版)

小得盈满! 1032

前端vue如何实现10万+数据分批导出excel表格到一个xlsx文件方法(含详细代码)【收藏】

最近在做一个项目二次开发,有40万的用户数据需要导出excel里,如果数据有,如何导出excel表格呢,这么大的数据如果一次导出对于服务器或者网络都是一个及大的考验,不太可能一性导出,要么资源被用完,要么网络超时,因为导出的数据excel文件可能有大几M或上百M,对于后端来说大量数据查询读取,特别是10万数据里如果涉及到其他表二次查询,基本上是卡死超时。先说说后端PHP实现导出excel方式:无非用PhpOffice\PhpSpreadsheet组件来导出,但是对于大数据来说一次导出也是吃力。

天天打码-16年老码农 4062

VUE项目:前端利用 xlsx-js-style 实现 Excel 文件导出功能示例

一般我们拿到的数据都是从接口中请求到的对象数组,在使用数据的时候,是需要转成二维数组。直接复制完整Demo代码即可查看效果,点击下载按钮会直接下载Excel表到本地。数据必须是这种格式,如果不是需要自己处理一下。

2202_75324165的博客 651

vue前端实现json导出excel文件(xlsx.full.min.js)

废话不多说,能实现导出excel的库也不少,这次我用的是xlsx.full.min.js(git地址:https://github.com/SheetJS/sheetjs) 在utils里简单封装一下 import * as XLSX from 'xlsx' /** * 字符串转字符流 */ const s2ab = (s: string = '') => { //字符串转字符流 let buf = new ArrayBuffer(s.length) let view = new U

charlie_y的博客 1887

vue 中 element ui 导出excel前端导出

前端导出excel 结合element ui

qq_53519425的博客 3780

js导出excel列格宽度_VUE项目,前端实现导出EXCEL功能

Excel 导出Excel 的导入导出都是依赖于js-xlsx实现的。在js-xlsx的基础上又封装了Export2Excel.js来方便导出数据。使用由于Export2Excel不仅依赖js-xlsx还依赖file-saver和script-loader。所以你先需要安装如下命令:npm install xlsx file-saver -Snpm install script-l...

weixin_30055951的博客 3088

前端vue+js-xlsx实现导入导出功能

前端vue+js-xlsx实现导入导出功能

Hanyinh的博客 1149

vue导出excel加一个进度条_Vue 前端导出Excel

Vue 前端导出Excel实际开发,遇到要求只在前端进行导出Excel文件的需求,而非调用接口形式。1.使用npm下载插件npm 命令行如下:npm install xlsx file-saver -Snpm install script-loader -S -D也可以使用 cnpm :cnpm install xlsx file-saver -Scnpm install script-load...

weixin_39752215的博客 594

vue导入导出Excelvue简单实现导出和导入复杂表头excel表格功能【前端版本和配合后端版本】

vue导入导出Excelvue简单实现导出和导入复杂表头excel表格功能【前端版本和配合后端版本】

聆听 1万+

前端vue2中的excel导出功能-file-saver,xlsx,xlsx-style的使用

* ./cptable in ./node_modules/xlsx-style/dist/cpexcel.js

qq_33449702的博客 2017

Vue 3 前端实现导出excel功能

使用 xlsx-oc 的 exportExcel(header, list, fileName) 方法实现(header 表头数据,list 表格数据,fileName 文件名)

weixin_51878863的博客 366
上一篇: html字符串 添加点击事件 传递参数
笨笨的幸福1230
博客等级 码龄8年 263粉丝 · 41原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值