vue2项目导出操作实现方法(后端接口导出、前端直接做导出)

 更新时间:2024年05月09日 11:27:56   作者:沐沐长记录  
这篇文章主要给大家介绍了关于vue2项目导出操作实现方法的相关资料,文中介绍的是后端接口导出、前端直接做导出,通过代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、调后端接口做导出效果

实现效果:导出列表数据

导出的内容:

后台相对来说比较简单一点,只要后端配合写接口即可

代码:放在导出事件里进行调整即可完成导出效果

axios({
        method: "get",  //请求方式
        url: url,   //接口
        params: params,
        responseType: 'blob'  
      }).then((res) => {
        if (+res.status == 200) {
          var blob = res.data;
          var filename = "录用统计";  
          saveAs(
            new Blob([blob], {
              type: "application/vnd.ms-excel",
            }),
            filename   //导出文件的文件名可自定义
          );
          
        }
      }).catch(err => {
        console.log(err)
      })

二、前端使用xlxs库进行导出操作

效果如上:个人认为调接口导出的表格更美观一点

操作如下:

首先安装我们需要的xlxs库:

npm install xlsx

接着在我们项目文件夹/src/assets/js创建一个excel-tool.js文件:

excel-tool.js文件:(不需要修改,可根据需求进行改动)

/**
 * excel 工具类
 *
 * 基于 js-xlsx 模块对 excel 进行读写
 * 官方文档可参照: https://www.npmjs.com/package/xlsx#acquiring-and-extracting-data
 */
import { utils, read, writeFile } from 'xlsx'

/**
 * sheet 表头解析
 * @param sheet{WorkSheet} sheet 对象
 * @returns {String[]} 表头列表
 */
function readHeaders(sheet) {
    const headerNames = []
    // cell address format: { c: 0, r: 2 }  c: column   r: row
    // range format: { s: { c: 0, r: 2 }, e: { c: 1, r: 6 } }  s: start  e: end
    const range = utils.decode_range(sheet['!ref'])
    const firstRowNum = range.s.r

    for (let columnNum = range.s.c; columnNum <= range.e.c; columnNum++) {
        const cellAddress = { c: columnNum, r: firstRowNum }
        const cell = sheet[utils.encode_cell(cellAddress)]
        const name = cell && cell.t ? cell.w : `UNKNOWN-${columnNum}`
        headerNames.push(name)
    }
    return headerNames
}

/**
 * 读 excel
 * @param file file 对象
 * @returns {Promise<{}>} 返回的对象 { sheetName: {headerNames, dataList}}
 */
export const readFile = async(file) => {
    const ret = {}
    const bufferData = await file.arrayBuffer()
    const workBook = read(bufferData)
    for (const sheetName in workBook.Sheets) {
        const sheet = workBook.Sheets[sheetName]
        const headerNames = readHeaders(sheet)
        const dataList = utils.sheet_to_json(sheet)
        ret[sheetName] = { headerNames, dataList }
    }
    return ret
}

/**
 * 输出数据到 excel
 * @param dataList {Object[]} 数据列表
 * @param dataKey {String[]} 需要导出的数据对象 key
 * @param firstRowNames {String[]} 表头
 * @param filename {String} 文件名
 */
export const write2File = (dataList, dataKey, firstRowNames, filename) => {
    const workBook = utils.book_new()
    const handledDataList = dataList.map(data => dataKey.map(key => data[key]))
    handledDataList.unshift(firstRowNames)
    const sheet = utils.aoa_to_sheet(handledDataList)
    utils.book_append_sheet(workBook, sheet, filename)
    writeFile(workBook, `${filename}.xlsx`)
}

export default {
    readFile,
    write2File
}

页面中具体使用: 

import { write2File } from "../../assets/js/excel-tool";  //引入excel-tool文件
import { GetNews } from "../../api/api";  //调接口拿数据
 
<script>
    export default {
  name: "articleList",
  data() {
    return {
      dataKey: [
        "title",
        "programName",
        "articelisturl",
        "draftUser",
        "groupName",
        "state",
        "draftTime"
      ],
      firstRowNames: [
        "标题",
        "所属栏目",
        "文章地址",
        "拟稿人",
        "拟稿单位",
        "状态",
        "拟稿日期"
      ],
      filename: "文章列表",
    };
    methods: {
    //导出
    daochu() {
      write2File(
        this.tableData,  //接口数据
        this.dataKey,     //表头对应的数据
        this.firstRowNames,  //表头
        this.filename  //导出内容命名
      );
    },
    //接口数据
    GetNews(num) {
      if (num === 1) {
        this.currentPage = 1;
      }
      let data = {
        pageNum: this.currentPage,
        rowLength: this.pageSize,
        title: this.queryData.title || undefined,
        programCode: this.queryData.programCode || undefined
      };
      
      GetNews(data).then(res => {
        if (res.code === 200) {
          this.tableData = res.data.dataList;
          //此处为拼接的文章地址,可删除
          this.tableData.forEach((item, index) => {
            return (item.articelisturl =
              this.url +
              "newsinfo?type=" +
              item.programName +
              "&code=" +
              item.uniqueCode);
          });

          this.total = Number(res.data.totalItems);
           //强制刷新
          this.$forceUpdate();
        }
      });
    },
    
   }
    
  },
</script>

总结 

到此这篇关于vue2项目导出操作实现方法的文章就介绍到这了,更多相关vue2项目导出方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue LogicFlow更多配置选项示例详解

    vue LogicFlow更多配置选项示例详解

    这篇文章主要为大家介绍了vue LogicFlow更多配置选项详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Vue异步组件处理路由组件加载状态的解决方案

    Vue异步组件处理路由组件加载状态的解决方案

    这篇文章主要介绍了Vue异步组件处理路由组件加载状态的解决方案,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • Vue Element前端应用开发之常规的JS处理函数

    Vue Element前端应用开发之常规的JS处理函数

    在我们使用Vue Element处理界面的时候,往往碰到需要利用JS集合处理的各种方法,如Filter、Map、reduce等方法,也可以涉及到一些对象属性赋值等常规的处理或者递归的处理方法,本篇随笔列出一些在VUE+Element 前端开发中经常碰到的JS处理场景,供参考学习。
    2021-05-05
  • Vue2.0 实现歌手列表滚动及右侧快速入口功能

    Vue2.0 实现歌手列表滚动及右侧快速入口功能

    这篇文章主要介绍了Vue2.0实现歌手列表滚动及右侧快速入口功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • Vue微信项目按需授权登录策略实践思路详解

    Vue微信项目按需授权登录策略实践思路详解

    这篇文章主要介绍了Vue微信项目按需授权登录策略实践思路详解,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • vue-cli中的:visible.sync是什么意思

    vue-cli中的:visible.sync是什么意思

    visible前面加冒号的,说明后面是一个变量或者表达式;没加冒号的后面就是对应的字符串字面量,这篇文章主要介绍了vue-cli中的:visible.sync是什么,需要的朋友可以参考下
    2022-11-11
  • Vue 同步异步存值取值实现案例

    Vue 同步异步存值取值实现案例

    这篇文章主要介绍了Vue 同步异步存值取值实现案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 详解使用vue-admin-template的优化历程

    详解使用vue-admin-template的优化历程

    这篇文章主要介绍了详解使用vue-admin-template的优化历程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 细说Vue组件的服务器端渲染的过程

    细说Vue组件的服务器端渲染的过程

    这篇文章主要介绍了细说 Vue 组件的服务器端渲染,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • vue实现计算器功能

    vue实现计算器功能

    这篇文章主要为大家详细介绍了vue实现计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02

最新评论