【excel解析并展示在table列表】

技术为vue2.x ,UI框架为ant design vue1.x

场景:导入excel并解析展示在table列表

效果图:
在这里插入图片描述
在这里插入图片描述
使用插件为:

//lodash插件
yarn add lodash@4.17.21
//xlsx插件
yarn add xlsx@0.18.5

以及一个汉字转拼音的vue-py.js文件(用于给字段生成字段英文名)
vue-py.js文件下载

template标签代码

<template>
	<div>
		 <a-upload-dragger
                accept=".xls,.XLS,.xlsx,.XLSX"
                :before-upload="
                  (file) =>
                    beforeUploadFile({ file }, '.xls,.XLS,.xlsx,.XLSX', '2MB', '上传格式不正确,请上传xls或者xlsx格式')
                "
                :fileList="fileList"
                @change="handleChange"
                :customRequest="customRequest"
              >
                <p class="ant-upload-drag-icon">
                  <a-icon type="inbox" />
                </p>
                <p class="ant-upload-text">选择或拖拽上传文件,2MB以内</p>
                <p class="ant-upload-hint">请上传.xls,.xlsx标准格式文件</p>
              </a-upload-dragger>
               <a-table
		          :columns="tableExcelCodeColumns"
		          :data-source="tableExcelNewList"
		          bordered
		          :scroll="{ y: 350, x: true }"
		          :pagination="false"
		        >
		          <template v-for="item in tableExcelCodeColumns" :slot="item.dataIndex"
		            ><div v-if="item.key != 'field_name'" :key="item.key" class="templatetitle">
		              <a-tooltip>
		                <template slot="title"> {{ item.name }} </template>
		                <span class="txtOmit">{{ item.name }}</span>
		              </a-tooltip>
		            </div>
		          </template>
        	</a-table>
	</div>
</template>

script标签代码

<script>
import vPinyin from '@/pages/setting/components/vue-py.js'
import Lodash from 'lodash'
import { read, utils, writeFile } from 'xlsx' //execl解析npm包
export default {
	data(){
		return{
			 //导入excel的
     		 fileList: [],
     		 //table excel字段
	        tableExcelCodeColumns: [],
             //给预览页展示的数据,只展示20条
            tableExcelNewList: [],
		}
	},
	methods:{
	    //处理时间用的封装方法
	    dateFilter: function (input) {
	      console.log(input)
	      var d = new Date(input)
	      var year = d.getFullYear()
	      var month = d.getMonth() < 9 ? '0' + (d.getMonth() + 1) : '' + (d.getMonth() + 1)
	      var day = d.getDate() < 10 ? '0' + d.getDate() : '' + d.getDate()
	      var hour = d.getHours() < 10 ? '0' + d.getHours() : '' + d.getHours()
	      var minutes = d.getMinutes() < 10 ? '0' + d.getMinutes() : '' + d.getMinutes()
	      var seconds = d.getSeconds() < 10 ? '0' + d.getSeconds() : '' + d.getSeconds()
	      return year + '-' + month + '-' + day + ' ' + hour + ':' + minutes + ':' + seconds
	    },
		 //上传excel的文件解析
	    customRequest(data) {
	      this.file = data.file
	    },
        //上传Excel
	    handleChange(file) {
	      if (!/\.(xls|XLS|xlsx|XLSX)$/.test(file.file.name.toLowerCase())) {
	        // 格式根据自己需求定义

	        return false
	      }
	      if (file.file.size / 1024 / 1024 > 2) {
	        // this.$message.success('上传文件过大,只允许上传2MB!')
	        // 格式根据自己需求定义
	        return false
	      }
	      var file = file.file // 文件信息
	      const fileReader = new FileReader()
	      fileReader.onload = (e) => {
	        try {
	          if (e.target) {
	          //cellDates: true单元格内存储的为日期时,可以将读取到的值直接转化为Date对象
	            var workbook = read(e.target.result, { type: 'binary', cellDates: true })
	
	            //只读取第一个Sheet
	            if (!workbook.SheetNames.length) {
	              this.$message.error('Excel表格中sheet为空')
	              return false
	            }
	            //只取了excel表中第一个工作表
	            var SheetName = workbook.SheetNames[0]
	            //判断处理日期
	            for (const i in workbook.Sheets[SheetName]) {
	              if (
	                workbook.Sheets[SheetName][i]['v'] !== null &&
	                workbook.Sheets[SheetName][i]['v'] !== undefined &&
	                workbook.Sheets[SheetName][i]['t'] == 'd'
	              ) {
	                workbook.Sheets[SheetName][i]['v'] = this.dateFilter(new Date(workbook.Sheets[SheetName][i]['w']))
	              }
	            }
	            this.sheetName = SheetName
	            var sheetInfos = workbook.Sheets[SheetName]
	            //这里会把重名列自动更名
	            var outdata = utils.sheet_to_json(sheetInfos, {
	              defval: '',//允许显示空值,defval可以为'-',这样空值会显示-
	            })
	            if (!outdata.length) {
	              this.$message.warning('当前Excel无数据')
	              return false
	            }
	
	            var fileColumns = []
	            outdata.forEach((item, index) => {
	              //只预览20行
	              if (index < 20) {
	                var obj = {}
	                const that = this
	                Lodash.forOwn(item, function (value, fieldKey) {
	                  const pinYinfile = vPinyin.chineseToPinYin(fieldKey)
	                  //截取字段名
	                  if (index == 0 && fieldKey.indexOf('__EMPTY') === -1) {
	                    fileColumns.push({
	                      name: fieldKey,
	                      dataIndex: pinYinfile,
	                      key: pinYinfile,
	                      //增加是否导入
	                      isImport: true,
	                      sort: index + 1,
	                      scopedSlots: { title: pinYinfile },
	                      valueType: 0,
	                      width: 120,
	                    })
	                  }
	                  //截取数据
	                  Lodash.set(obj, pinYinfile, value)
	                  //增加序号
	                  Lodash.set(obj, 'field_name', index + 1)
	                })
	                if (JSON.stringify(obj) != '{}' && index <= 20) {
	                  this.tableExcelNewList.push(obj)
	                }
	              }
	            })
	            //添加序号
	            var obj = [
	              {
	                name: '字段名称',
	                typeName: '字段类型',
	                dataIndex: 'field_name',
	                key: 'field_name',
	                scopedSlots: { title: 'field_name' },
	                width: 107,
	                sort: 0,
	              },
	            ]
	            this.tableExcelCodeColumns = Lodash.concat(obj, fileColumns)
	          }
	        } catch (e) {
	          this.$message.error('Excel上传错误:' + e)
	          return false
	        }
	      }
	      fileReader.readAsBinaryString(file.originFileObj)
	    },
	}
}
</script>

注意点:
1.cellDates: true单元格内存储的为日期时,可以将读取到的值直接转化为Date对象
2.可以把日期格式化为yyyy-MM-dd HH-mm-ss

this.dateFilter(new Date(workbook.Sheets[SheetName][i]['w'])) 

3.可以自由控制是否显示空值,以及空值显示的样式

utils.sheet_to_json(sheetInfos, {
	              defval: '',//允许显示空值,defval可以为'-',这样空值会显示-
})

如果需要完整的源码:请点击下载

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值