vue+xlsx实现前端模版下载、导入和导出excel文件

这篇具有很好参考价值的文章主要介绍了vue+xlsx实现前端模版下载、导入和导出excel文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

产品需求:后端不想写下载,导入和导出的接口,让我们前端自己实现。
这里我们就可以用xlsx插件来实现,我们不多说了,先放一下实现的图片,下面我们分别把模版下载、导入和导出的代码放上来,想用的话,直接复制粘贴即可!

模版下载图片
vue 安装xlsx,vue,导入导出,前端,vue.js,excel

导出图片:
vue 安装xlsx,vue,导入导出,前端,vue.js,excel
好了,下面我们就直接上代码!

模版下载

首先,安装xlsx插件

 //我这里用的是0.18.5版本
  npm install xlsx@0.18.5

其次,配置表格导入导出的下载属性


<Button  @click="downloadTemplate(tableInfo)">导出</Button>
...
data(){
   return {
       tableData:[],//表格数据
	   tableInfo:{
	      rowMerge:false,//行合并
	      columnsCheckAll: true,
	      columnsChecked:[],
	      exportColumnAll: true,
	      exportColumns:[],
	      exportColumnChecked: [],
	      visible:false,
	      importModal:false,//控制导入弹框显示
	      importFile:null,//存放导入excel
	      showImportTable:false,//控制导入展示数据表格显示
	      importTableData:[],//导入excel的数据
	      columns:[
	          {title: '考核维度', key: 'checkDimension'},
	          {title: '考核指标', key: 'checkIndicators'},
	          {title: '分值', key: 'score'}
	      ],
	      importTableColumns:[],//导入excel的列
	      importTableNewData:[],//导入excel解析后的数据
	  },
  }
}

然后,写下载方法

   //下载导入模板
	downloadTemplate(tableInfo){
       let expData = [];
        tableInfo.importColumns = this.appendTableImportColumns(tableInfo.columns);
        var header = [];
        tableInfo.importColumns.map((item,index)=>{
           header[index] = item.title;
        });
        //1. 新建一个工作簿
        let workbook = XLSX.utils.book_new();
        //2.2 把json对象转成工作表
        let sheet1 = XLSX.utils.json_to_sheet(expData,{header:header});
        //3.在工作簿中添加工作表
        XLSX.utils.book_append_sheet(workbook, sheet1, '导入模板'); //工作簿名称
        XLSX.writeFile(workbook, '考核指标导入模板.xlsx'); // 保存的文件名
    
    },
     //获取导入表格的列
    appendTableImportColumns(columns){
        return columns.filter((item) =>{
            if(item.hasOwnProperty("title")){
                if(item.hasOwnProperty("key")){
                    return true;
                }else{
                    if(item.hasOwnProperty("slot") && item.slot.split(".").length > 1){
                        item.key = item.slot.split(".")[1];
                        return true;
                    }else{
                        return false;
                    }
                }
            }
        });
    },

导入功能

这里vue项目我用的是iview ui,也用了上传组件,我把下载模版和上传写在了一个弹窗内,如下图:

vue 安装xlsx,vue,导入导出,前端,vue.js,excel

弹窗代码如下:

 <Modal
  title="导入数据"
   v-model="tableInfo.importModal"
   v-on:on-ok="poCheckKeyTableImportClass(tableInfo,tableData)"
   width="400"
   >
   <div class="button_content_box">
       <div class="finance_goods_list_main_content">
       <div style="margin-bottom: 5px;" >点击此处进行 <a  @click="downloadTemplate(tableInfo)">模版下载</a></div>
           <Row>
               <Col span="24">
               <div>
                   <Upload type="drag" action=""
                   :before-upload="function(file) { return poCheckKeyTableHandleUpload(file,tableInfo)}">
                       <div style="padding: 20px 0">
                           <Icon type="ios-cloud-upload" size="52"></Icon>
                           <p>将文件拖到此处,<a>点击上传</a></p>
                       </div>
                   </Upload>
               
               </div>
               </Col>
           </Row>
       </div>
       <div v-if="tableInfo.importFile"><span><Icon type="ios-podium" /></span>{{tableInfo.importFile.name }}</div>
   </div>
 </Modal>
      

下面方法能看懂最好,看不懂也无妨,直接复制粘贴拿去用就行,方法代码如下:

 //上传导入文件前事件
 poCheckKeyTableHandleUpload(file, tableInfo) {
     let vm = this;
     tableInfo.importFile = file;
     let reader = new FileReader()
     let rABS = typeof FileReader !== "undefined" && (FileReader.prototype || {}).readAsBinaryString
     if (rABS) {
         reader.readAsBinaryString(file)
     } else {
         reader.readAsArrayBuffer(file)
     }
     reader.onload = function (e) {
         let data = e.target.result
         if (!rABS) {
         data = new Uint8Array(data)
         }
         let workBook = XLSX.read(data, {type: rABS ? 'binary' : 'array'})
         workBook.SheetNames.forEach(name => {
             let sheet = workBook.Sheets[name]
             let json = XLSX.utils.sheet_to_json(sheet, {
                 raw: true,
                 header: 1,
                 defval: null
             });
         let tableData = [];
         json.map((itemData, indexData) => {
             if (indexData > 0) {
             var attr = {};
             json[0].map((item, index) => {
                 attr[item] = itemData[index];
             });
             tableData.push(attr);
             }
         });
         let importTableColumns = [];
         json[0].map((item, index) => {
             var attr = {};
             attr.title = item;
             attr.key = item;
             attr.width = 100;
             importTableColumns.push(attr);
         })

         let tableNewData = [];
         let columnCount = 0;
         tableInfo.columns.map((item, index) => {
             importTableColumns.some((itemColumn, indexColumn) => {
             if (item.title == itemColumn.title) {
                 columnCount++;
                 var field = item.key;
                 if (field == undefined) {
                 field = item.slot.split(".")[1];
                 }
                 tableData.map((itemData, indexData) => {
                 if (columnCount == 1) {
                     var attr = {};
                     attr[field] = itemData[itemColumn.title];
                     tableNewData.push(attr);
                 } else {
                     tableNewData[indexData][field] = itemData[itemColumn.title];
                 }
                 })
                 return true;
             }
             });
         });
         if (tableNewData.length > 0) {
             tableInfo.importTableData = tableData;
             tableInfo.importTableColumns = importTableColumns;
             tableInfo.importTableNewData = tableNewData;
             tableInfo.showImportTable = true;
         } else {
             vm.$Message.error('请规范录入表格数据!');
         }
         })
     }
     return false;
 },
 //点击导入确认
 poCheckKeyTableImportClass(tableInfo, data) {
     tableInfo.showImportTable = false;
     if (tableInfo.importTableNewData.length > 0) {
         tableInfo.importTableNewData.map(item => {
          data.push(item);
         })
         tableInfo.importTableNewData = [];
     }
 },
        

导出功能

<Button type="primary" @click="onBtnExporttableClick(tableInfo,'考核得分信息')">
   <span>导出</span>
</Button>

导出方法如下:

 onBtnExporttableClick(tableInfo, fileName) {
    tableInfo.visible = false;
    if (tableInfo.params === undefined) {
      tableInfo.params = {};
    }
    let expData = [];
    tableInfo.columns.map((item, index) => {
        this.tableData.map((itemData, indexData) => {

            if (index == 0) {
                var attr = {};
                attr[item.title] = itemData[item.key];
                expData.push(attr);
            } else {
                expData[indexData][item.title] = itemData[item.key];
            }
        })
    })
    //1. 新建一个工作簿
    let workbook = XLSX.utils.book_new();
    //2.2 把json对象转成工作表
    let sheet1 = XLSX.utils.json_to_sheet(expData);
    //3.在工作簿中添加工作表
    XLSX.utils.book_append_sheet(workbook, sheet1, fileName); //工作簿名称
    //4.输出工作表,由文件名决定的输出格式
    XLSX.writeFile(workbook, fileName + '.xlsx'); // 保存的文件名
},

不要看到那么多代码就感觉很复杂,然而很简单没因为需要你作改动的并不多,当然你也可以根据自己需求去做的更加完善,简单的导入导出实现,这就足够啦,不需要做什么更改,复制粘贴就可以!文章来源地址https://www.toymoban.com/news/detail-639131.html

到了这里,关于vue+xlsx实现前端模版下载、导入和导出excel文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3前端excel导出;组件表格,自定义表格导出;Vue3 + xlsx + xlsx-style

    当画面有自定义的表格或者样式过于复杂的表格时,导出功能可以由前端实现 1. 使用的插件 : sheet.js-xlsx 文档地址:https://docs.sheetjs.com/ 中文地址:https://geekdaxue.co/read/SheetJS-docs-zh/README.md xlsx-style:https://www.npmjs.com/package/xlsx-style 2. 安装引用 安装插件-vue3 引用插件 3. 组件表格

    2024年04月26日
    浏览(30)
  • vue导入导出excel、设置单元格背景色、文字居中、合并单元格、设置列宽(使用xlsx库和xlsx-style库)

    xlsx 是由 SheetJS 开发的一个处理excel文件的npm库 适用于前端开发者实现导入导出excel文件的经典需求 为了区别于xlsx文件,突出其应用语言,该库通常又被称为 js-xlsx 需要以下步骤: 安装 xlsx 库 你可以使用 npm 包管理器安装 xlsx 库,也可以将 xlsx 下载到本地,然后在 HTML 文件中

    2024年02月16日
    浏览(36)
  • 【前端】Vue中引入excel模板并下载以及XLSX使用

    模板存放位置 src/assets/excelTemplate/模板.xls 安装模块包 新增配置,在vue.config.js中,自己比较一下,最后一段新增的chainWebpack 即可将模板下载到本地 我使用XLSX的场景,在我上传excel的时候,我需要获取它的表头以及里面的数据进行渲染到表格中,在我编辑的时候需要请求Exce

    2024年02月21日
    浏览(33)
  • 前端excel文件处理,vue2 、file-saver、xlsx, excel文件生成与excel文件链接数据导出

    安装插件 如使用TS开发,可安装file-saver的TypeScript类型定义 下载文件流 本地文件下载 文件下载(列宽自适应) 表格显示,每列列宽自适应 xlsx文件链接数据导出 方法调用

    2024年02月11日
    浏览(36)
  • 前端结合xlsx.js+xlsx-style.js源码实现自定义excel文件导出

          js-xlsx是一款非常方便的只需要纯JS即可读取和导出excel的工具库,功能强大,支持格式众多,支持xls、xlsx、ods(一种OpenOffice专有表格文件格式)等十几种格式。本文全部都是以xlsx格式为例。 创建一个excel会经历以下过程: 创建一个工作薄 创建一个sheet 创建表格行列等

    2024年03月10日
    浏览(51)
  • vue中使用xlsx插件导出多sheet excel实现方法

    安装xlsx,一定要注意版本:  package.json: App.vue: 设置单元格宽度:  

    2024年02月07日
    浏览(40)
  • 前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法

    一、vue实现导出excel 1、前端实现 xlsx是一个用于读取、解析和写入Excel文件的JavaScript库。它提供了一系列的API来处理Excel文件。使用该库,你可以将数据转换为Excel文件并下载到本地。这种方法适用于在前端直接生成Excel文件的场景。 更多介绍可参见官网 1、安装xlsx依赖 2、引

    2024年01月23日
    浏览(47)
  • sheetJs / xlsx-js-style 纯前端实现导出 excel 表格及自定义单元格样式

    xlsx 地址:https://www.npmjs.com/package/xlsx SheetJs 地址:https://docs.sheetjs.com/docs/ xlsx-js-style 地址:https://www.npmjs.com/package/xlsx-js-style !cols 设置列宽 cols 为一个对象数组,依次表示每一列的宽度 wpx 字段表示以像素为单位,wch 字段表示以字符为单位 hidden 如果为真,则隐藏该列 !rows 设

    2024年02月06日
    浏览(28)
  • 纯前端实现 导入 与 导出 Excel

    最近经常在做 不规则 Excel 的导入,或者一些普通 Excel 的导出,当前以上说的都是纯前端来实现;下面我们来聊聊经常用到的Excel导出与导入的实现方案,本文实现技术栈以 Vue2 + JS 为例 导入分类: 调用 API 完全由后端来解析数据,清洗数据,前端只负责调用 API ; 前端解析

    2024年02月09日
    浏览(33)
  • node使用node-xlsx实现excel的下载与导入,保证你看的明明白白

    需求简介 node-xlsx 的简单介绍 node-xlsx 构建 xlsx 文件[将数据转化为excel] 需要注意的2点 如何设置列宽呢? 03png 实现导出下载功能-node后端代码 实现导出下载功能-前端代码 关于axios.get() 置请求头responseType:\\\'blob\\\'不生效 mockjs会导致文件下载失败及原因 验证 mockjs 会导致下载失败

    2023年04月10日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包