vue实现读取本地或网络xlsx文件内容

9 篇文章 0 订阅

前段时间项目有个需求,老板要求在项目后台做个静态表格数据页面,里面需要包含有多条数据
一开始想法是做就做吧,反正就是个静态页面,做一些假数据就好了,结果做好了之后,老板那边却发了个xlsx表格过来,让咱将表格的数据导进去。
我的天,一打开文件,里面几十条数据,没办法,作为一名高端程序猿,能偷懒的情况下,怎能不偷一下懒呢。
于是在网上打到这么一个插件‘xlsx.js’。
在这之前,先看下表格数据吧,自己另起了一份文件
在这里插入图片描述
表格数据有了,接下来就是安装插件

npm i xlsx -s

插件安装好之后,就是写代码了,直接上代码:

import axios from 'axios';
const XLSX = require('xlsx')
import transformSheets from './read_xlsx';    //导入转制函数

created() {
  var url = "/task_list.xlsx"  //放在public目录下可以直接访问
  //读取二进制excel文件,参考https://github.com/SheetJS/js-xlsx#utility-functions
  axios.get(url, {responseType:'arraybuffer'}).then((res) => {
    var data = new Uint8Array(res.data);
    var wb = XLSX.read(data, {type:"array"}, '-j');
    var sheets = wb.Sheets;
    var content = transformSheets(sheets); // 整理xlsx返回的数据
    console.log('content:');
    console.log(content);
    var list = [];
    var arr = content.slice(1);
    for (var i = 0; i < arr.length; i++) {
      var obj = {};
      arr[i].forEach((item, index) => {
        obj['data'+(index+1)] = item;
        if(index + 1 == 9){
          obj['data'+(index+1)] = this.formatExcelDate(item);
        }
      })
      list.push(obj);
    }
    console.log('list:');
    console.log(list);
    this.tableCfg.tableData = list;
  }).catch( err =>{
    this.err = err;
  })
},
methods:{
  // 处理表格中的日期时间
  formatExcelDate (numb, format = "-") {
    // 如果numb为空则返回空字符串
    if (!numb) {
        return "";
    }
    let time = new Date(new Date("1900-1-1").getTime() + (numb - 1) * 3600*24*1000);
    const year = time.getFullYear() + '';
    const month = time.getMonth() + 1 + '';
    const date = time.getDate();
    if (format && format.length === 1) {
        return year + format + (month < 10 ? '0' + month : month) + format + (date < 10 ? '0' + date : date)
    }
    return year + (month < 10 ? '0' + month : month) + (date < 10 ? '0' + date : date)
  }
}

以下为read_xlsx.js文件的代码:

const XLSX = require('xlsx')
//将行,列转换
function transformSheets(sheets) {
  var content  = []
  var content1 = []
  var tmplist = []
  for (let key in sheets){
    //读出来的workbook数据很难读,转换为json格式,参考https://github.com/SheetJS/js-xlsx#utility-functions
    tmplist.push(XLSX.utils.sheet_to_json(sheets[key]).length)
    content1.push(XLSX.utils.sheet_to_json(sheets[key]))
  }
  var maxLength = Math.max.apply(Math, tmplist)
  //进行行列转换
  for (let y in [...Array(maxLength)]){
    content.push([])
    for (let x in [...Array(tmplist.length)]) {
      try {
        for (let z in content1[x][y]){
          content[y].push(content1[x][y][z])
        }
      } catch (error) {
        content[y].push(' ')
      }
    }
  }
  content.unshift([])
  for (let key in sheets){
    content[0].push(key)
  }
  return content
}
export {transformSheets as default}

最后运行起来后返回的内容:
在这里插入图片描述
以上大功告成!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值