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

前言

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

模版下载图片
在这里插入图片描述

导出图片:
在这里插入图片描述
好了,下面我们就直接上代码!

模版下载

首先,安装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,也用了上传组件,我把下载模版和上传写在了一个弹窗内,如下图:

在这里插入图片描述

弹窗代码如下:

 <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'); // 保存的文件名
},

不要看到那么多代码就感觉很复杂,然而很简单没因为需要你作改动的并不多,当然你也可以根据自己需求去做的更加完善,简单的导入导出实现,这就足够啦,不需要做什么更改,复制粘贴就可以!

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
您可以使用 `xlsx` 库和 `FileSaver.js` 库来实现Vue和Element UI导出Excel文件的功能。以下是一个简单的示例: 1. 首先,安装 `xlsx` 和 `file-saver` 包: ```bash npm install xlsx file-saver ``` 2. 在 Vue 组件中引入所需的库: ```javascript import XLSX from 'xlsx'; import { saveAs } from 'file-saver'; ``` 3. 创建一个方法来导出Excel文件: ```javascript methods: { exportToExcel() { // 创建工作簿和工作表 const workbook = XLSX.utils.book_new(); const worksheet = XLSX.utils.json_to_sheet(this.data); // 将工作表添加到工作簿 XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); // 生成Excel文件的二进制数据 const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); // 将二进制数据转换为Blob对象 const blob = new Blob([excelBuffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); // 使用FileSaver.js保存文件 saveAs(blob, 'data.xlsx'); } } ``` 在上面的代码中,`this.data` 是要导出的数据,可以是一个数组或对象。 4. 在模板中添加一个按钮来触发导出操作: ```html <template> <div> <button @click="exportToExcel">导出Excel</button> </div> </template> ``` 这样,当用户点击“导出Excel”按钮时,将会触发 `exportToExcel` 方法,并导出Excel文件。 请注意,为了使上述代码正常工作,您需要在项目中正确引入 `xlsx` 和 `file-saver` 库,并将相关的样式和依赖项加载到您的项目中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端探险家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值