Vue导出模板、使用前端js办法导出表格数据、导入表格前端读取表格数据、导入表格发送后端读取数据

以下是几种用的较多的函数方法,可以参考使用。

// 導出1
    myExport() {
      // post請求文件寫法1
      const url = ‘http://XXXX/XXXX/XXXX/XXXX‘
      const formData = new FormData()
      formData.append(‘file‘, ‘123‘)
      this.axios({
        method: ‘post‘,
        url: url,
        data: formData,
        responseType: ‘blob‘ // 表明返回服務器返回的數據類型
      }).then(_ => {
        const content = _
        const blob = new Blob([content])
        const fileName = ‘測試表格.xls‘
        if (‘download‘ in document.createElement(‘a‘)) {
          // 非IE下载
          const aLink = document.createElement(‘a‘)
          aLink.download = fileName
          aLink.style.display = ‘none‘
          aLink.href = URL.createObjectURL(blob)
          aLink.setAttribute(‘target‘, ‘_blank‘)
          document.body.appendChild(aLink)
          aLink.click()
          URL.revokeObjectURL(aLink.href) // 释放URL 对象
          document.body.removeChild(aLink)
        } else {
          // IE10+下载
          navigator.msSaveBlob(blob, fileName)
        }
      })
      // post請求文件寫法2
    },
<template>
  <div>通用函數頁面</div>
</template>
<script>
// 導出表格數據1
import toExcel from ‘../common.js‘
// 導出表格數據2
export default {
  methods: {
    // 導出表格數據1
    formatJson(filterVal, jsonData) {
      return jsonData.map(v => filterVal.map(j => v[j]))
    },
    myGetDate() {
      // 这段每个都加了数据处理成的格式备注,很容易明白
      const th = [‘參數1‘, ‘參數2‘, ‘參數3‘, ‘參數4‘]
      const filterVal = [‘name‘, ‘age‘, ‘grade‘, ‘score‘]
      const dataSource = [
        { name: ‘值1‘, age: ‘值2‘, grade: ‘值3‘, score: ‘值4‘ },
        { name: ‘值1‘, age: ‘值2‘, grade: ‘值3‘, score: ‘值4‘ }
      ]
      var data = this.formatJson(filterVal, dataSource)
      // data得到的值为[["小绵羊","12","六年级","100"],["小猪猪,"23","五年级","98"]]
      // 注意:二维数组里的每一个元素都应是字符串类型,否则导出的表格对应单元格为空
      toExcel({ th, data, fileName: ‘设备导出数据‘, fileType: ‘xlsx‘, sheetName: ‘sheet名‘ })
    },
    // 導出表格數據2
    // 導出模板方法-get、兩種-post、一種
    // get導出模板方案一:通过创建iframe的方式1
    myGetExport1() {
      // get請求寫法1
      const elemIF = document.createElement(‘iframe‘)
      elemIF.src = ‘‘
      elemIF.style.display = ‘none‘
      document.body.appendChild(elemIF)
      // get請求寫法2
    },
    // get導出模板方案一:通过创建iframe的方式2
    // get導出模板方案二:不太好用哦~~通过a标签的链接向后端服务发get请求,接收后端的文件流1
    downloadTemplate() {
      const url = ‘‘
      const a = document.createElement(‘a‘)
      a.style.display = ‘none‘
      a.setAttribute(‘target‘, ‘_blank‘)
      a.href = url
      a.click()
      // window.open(url);
    },
    // get導出模板方案二:通过a标签的链接向后端服务发get请求,接收后端的文件流2
    // post方法導出模板方案一fetch:1
    myFetch() {
      requestData = {
        no: this.noArr, //這個給的是勾選的no列表
        // no: this.myLists,//這個給的是勾選的id列表
        partsn: this.data4.map(_ => (_ = _.no))
      }
      //下载execl文件
      const url = ‘‘
      fetch(url, {
        method: ‘POST‘,
        headers: {
          ‘Content-Type‘: ‘application/json‘
        },
        body: JSON.stringify(requestData)
      })
        .then(res => res.blob())
        .then(data => {
          this.showSpin = false
          let blobUrl = window.URL.createObjectURL(data)
          const a = document.createElement(‘a‘)
          a.style.display = ‘none‘
          a.setAttribute(‘target‘, ‘_blank‘)
          a.download = ‘<List>‘
          a.href = blobUrl
          a.click()
        })
    },
    // post方法導出模板方案一fetch:2
    // post方法導出模板方案二axios:1
    myPostExport() {
      // post請求文件寫法1
      const url = ‘‘
      const formData = new FormData()
      formData.append(‘file‘, ‘123‘)
      this.axios({
        method: ‘post‘,
        url: url,
        data: formData,
        responseType: ‘blob‘ // 表明返回服務器返回的數據類型
      }).then(_ => {
        const content = _
        const blob = new Blob([content])
        const fileName = ‘測試表格.xls‘
        if (‘download‘ in document.createElement(‘a‘)) {
          // 非IE下载
          const aLink = document.createElement(‘a‘)
          aLink.download = fileName
          aLink.style.display = ‘none‘
          aLink.href = URL.createObjectURL(blob)
          aLink.setAttribute(‘target‘, ‘_blank‘)
          document.body.appendChild(aLink)
          aLink.click()
          URL.revokeObjectURL(aLink.href) // 释放URL 对象
          document.body.removeChild(aLink)
        } else {
          // IE10+下载
          navigator.msSaveBlob(blob, fileName)
        }
      })
      // post請求文件寫法2
    },
    // post方法導出模板2
    // 導入表格的方法1
    // 導入表格的方法2
    // 導入文本讀取文本的方法1
    myUploadTxt(e) {
      const myData = {
        status: ‘‘,
        result: []
      }
      if (e.target.files[0]) {
        console.log(e.target.files[0].type)
        if (e.target.files[0].type === ‘text/plain‘) {
          const fileReader = new FileReader()
          fileReader.readAsText(e.target.files[0], ‘utf-8‘)
          fileReader.onload = () => {
            console.log(fileReader.result)
          }
          // fileReader.readAsText(e.target.files[0]);
        } else {
          myData.status = ‘error‘
          return myData
        }
      }
    },
    // 導入文本讀取文本的方法2
    // 導入文本讀取表格的方法1
    // 上传表格1
    readExcel(e) {
      //表格导入
      const files = e.target.files
      // console.log(files);
      if (files.length <= 0) {
        //如果没有文件名
        return false
      } else if (!/\.(xls|xlsx)$/.test(files[0].name.toLowerCase())) {
        // this.msg.error(‘上传格式不正确,请上传xls或者xlsx格式‘);
        return false
      }

      const fileReader = new FileReader()
      fileReader.onload = (ev) => {
        try {
          const data = ev.target.result
          const workbook = XLSX.read(data, {
            type: ‘binary‘
          })
          const wsname = workbook.SheetNames[0] //取第一张表
          const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]) //生成json表格内容
          // console.log(ws);
          const excellist = [] //清空接收数据
          //编辑数据
          for (var i = 0; i < ws.length; i++) {
            excellist.push(ws[i])
          }
          // 此时得到的是一个内容是对象的数组需要处理
          // console.log(excellist);
          let arr1 = excellist.map(_ => Object.values(_)[0])
          // console.log(arr1);
          this.resultArr = arr1.map((_, idx) => {
            return {
              id: idx + 1,
              name: idx + 1,
              age: _
            }
          })
          // console.log(this.resultArr)
        } catch (e) {
          // console.log(‘出错了‘)
          return false
        }
      }
      fileReader.readAsBinaryString(files[0])
      // 如果需要後台處理表格數據,就執行如下操作1
      // 如果是發送後台解析,就這樣發送1
      // let url =  ‘‘;
      // let myformdataFile = {
      //   file: e.target.files[0]
      // }
      // if (e.target.files[0]) {
      //   this.http.post(url, myformdataFile).subscribe((res: any) => {
      //     if (res.status == ‘success‘) {
      //       console.log(res)
      //     } else {
      //       this.msg.warning(res.message);
      //       return false;
      //     }
      //   });
      // }
      // 如果是發送後台解析,就這樣發送2
      // 如果需要後台處理表格數據,就執行如下操作2
    },
    // 上传表格2
    // 導入文本讀取表格的方法2
    // 輸入文本檢測過濾空格函數形成數組
    // 用戶輸入數據使用空格,逗號,隔開,我們需要分解成數組1
    // inputvalue  字符串格式
    textValue(inputvalue) {
      if (inputvalue) {
        // 當用戶輸入用空格隔開時候使用
        let resultArr = inputvalue
          .split(/[,,\s]+/gm)
          .filter(_ => _)
          .map(item => {
            // 當用戶輸入用逗號隔開時候使用
            // let resultArr = inputvalue.split(/[,,\s]+/gm).filter(_ => _).map(item => {
            if (item.length != 0) {
              return item
            } else {
              // console.log(item)
              // this.msg.error(‘請重輸‘);
              this.resultArr = []
              return false
            }
          })
        // console.log(resultArr)
        return resultArr
      } else {
        // this.msg.error(‘輸入不能空‘);
        return false
      }
    }
    // 用戶輸入數據使用空格,逗號,隔開,我們需要分解成數組2
  }
}
</script>

关联js

// 導出表格專用代碼1
/** ***********这段直接复制就好,看明白最好,不明白也不影响使用*************/
import XLSX from ‘xlsx‘
import { saveAs } from ‘file-saver‘

function s2ab(s) {
  const buf = new ArrayBuffer(s.length)
  const view = new Uint8Array(buf)
  for (let i = 0; i !== s.length; ++i) {
    view[i] = s.charCodeAt(i) & 0xFF
  }
  return buf
}
function data2ws(data) {
  const ws = {}
  const range = { s: { c: 10000000, r: 10000000 }, e: { c: 0, r: 0 } }
  for (let R = 0; R !== data.length; ++R) {
    for (let 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
      const cell = { v: data[R][C] }
      if (cell.v == null) continue
      const cellRef = 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]
      } else {
        cell.t = ‘s‘
      }
      ws[cellRef] = 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 = {}
}
/*
* th => 表头
* data => 数据
* fileName => 文件名
* fileType => 文件类型
* sheetName => sheet页名
*/
// 导出封装好的方法
export default function toExcel({ th, data, fileName, fileType, sheetName }) {
  data.unshift(th)
  const wb = new Workbook()
  const ws = data2ws(data)
  sheetName = sheetName || ‘sheet1‘
  wb.SheetNames.push(sheetName)
  wb.Sheets[sheetName] = ws
  fileType = fileType || ‘xlsx‘
  var wbout = XLSX.write(wb, { bookType: fileType, bookSST: false, type: ‘binary‘ })
  fileName = fileName || ‘列表‘
  saveAs(new Blob([s2ab(wbout)], { type: ‘application/octet-stream‘ }), `${fileName}.${fileType}`)
}
// 導出表格專用代碼2

原文地址:https://www.cnblogs.com/sugartang/p/12587640.html

时间: 2024-10-15 07:08:03

Vue导出模板、使用前端js办法导出表格数据、导入表格前端读取表格数据、导入表格发送后端读取数据的相关文章

通过前端js将页面表格导出为PDF(二)

前面我说道了,将页面的表格导出为pdf,通过我给出的代码完好的实现了其需求,但是没过几天,又说不行了,因为我的表格是按照最多26行就进行分页,如果表格行数一多,就要点击下一页再进行pdf的导出,因为是面向客户的,所以要尽量减少用户的操作,因此要改成,一键导出所有的表格,然后自动分页,每页再加上特定的图片.我就日了@#@#@!这是....,没办法,改呗,前前后后折腾了两天,终于让我给整出来了,不容易啊!真的的是有需求才有动力啊! 先说一下我的方式:首先还是按照正常的进行分页显示,当点击导出pdf按

Vue 浅谈前端js框架vue

Vue Vue近几年来特别的受关注,三年前的时候angularJS霸占前端JS框架市场很长时间,接着react框架横空出世,因为它有一个特性是虚拟DOM,从性能上碾轧angularJS,这个时候,vue1.0悄悄 的问世了,它的优雅,轻便也吸引了一部分用户,开始收到关注,16年中旬,VUE2.0问世,这个时候vue不管从性能上,还是从成本上都隐隐超过了react,火的一塌糊涂,这个时候,angular 开发团队也开发了angular2.0版本,并且更名为angular,吸收了react.vue的

解决SpDevelop在Windows7导出Chm报错的办法

把C:\Program Files (x86)\HTML Help Workshop下的文件夹以及文件夹里面的东西复制粘贴到C:\Program Files\路径下. 解决SpDevelop在Windows7导出Chm报错的办法,布布扣,bubuko.com

动态链接库中导出模板函数

动态链接库中导出模板函数 C++ 支持函数模板,利用函数模板,可以简化我们的程序代码.我在自己的代码中也经常用到函数模板,但是以前一直以为函数模板是要放到头文件中的,否则调用模板函数时,编译器会找不到函数模板的定义.今天闲暇,又翻了翻 C++ Primer,发现我以前的理解是有问题的.模板函数也可以像普通函数那样,将声明放在头文件中,定义放在.cpp 中.这时又想到另一个问题,DLL 中是否可以导出模板函数呢.如果可以的话,就可以将函数的实现代码真正隐藏起来了.经过一番实验,发现是可以的,但是有

Vistual Studio的导出模板功能

应用场景,每个项目有自己固定的目录结构和引用文件, 无需每次创建一个项目,就手工一一将那些目录再new一遍.如图所示 菜单  文件=>导出模板 之后的操作基本上一路"下一步" 创建的项目模板默认保存在 C:\Users\[用户名]\Documents\Visual Studio 20XX\My Exported Templates\Xxx.zip 可以下次在解决方案里使用此项目模板 其它应用场景:为Vistual Studio 2012增加Global.asax项模板, 通过在其

网页内容导出word/excel的js代码

IE设置: 工具-> Internet选项-> 安全->自定义级别-> 对没有标记安全级别的ActiveX控件进行初始化  设为启用! 1.导出word //指定区域导出到Word function html2word(Area) { var oWD = new ActiveXObject("Word.Application"); var oDC = oWD.Documents.Add("", 0, 1); var oRange = oDC.

VS自定义项目模板:[1]导出模板

工具/原料 VS2013(VS2010等版本也适用,均需安装Visual Studio SDK) 方法/步骤 首先创建一个模型项目. 新建一个WinForm应用程序项目,修改窗体名称为MainForm.   通过 [文件]-->[导出模板] 打开“导出模板向导”界面.   模板类型选择 项目模板.   为模板取个名称,添加一些模板说明.   点击完成后就完成导出模板步骤了. 导出模板放在My Exported Templates文件夹中. 默认情况下模板导到C:\Users\***\Docume

用Vue.js来开发一个电影App的前端部分

我们要构建一个什么样的App? 我们大多数人使用在线流媒体服务(如Netflix)观看我们最喜欢的电影或者节目.这篇文章将重点介绍如何通过使用vue.js 2建立一个类似风格的电影流媒体WEB交互界面(见上图). 最终的产品可以去这里找:https://codepen.io/itslit/full/mvvjzr. 尽管Bulma将作为应用的CSS框架,但是本文将主要集中在Vue.js的使用和浏览CSS式样,如果你想跟着学,我设置了一个可以作为开始学习的地方,所有自定义组合,初始数据对象和必要的需

node.js ejs模板引擎将后端数据赋值给前端js

使用node.js的Express脚手架生成项目默认是jade模板引擎,jade引擎实在是太难用了,这么难用还敢设为默认的模板引擎,过分了啊!用handlebars模板引擎写还说的过去,但笔者更愿意使用ejs,选它是因为跟Asp.Net的模板引擎有点相似吧. 先来看一下这几个模板引擎: jade模板 html head title #{title} meta(charset="UTF-8") body div.description #{description} ul - each d