vue导出excel

该文章介绍了如何在Vue项目中利用vue-json-excel插件从后台获取JSON数据并导出为Excel文件,同时处理数字被误识别为日期的问题,通过在数字前添加空格以及自定义回调函数来定制故障信息的显示方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

后台传入前端json对象,前端使用vue-json-excel插件导出为excel。表头可筛选。

问题解决方案:数字字符如果被识别为日期等,可在前面加空格。

安装:

npm install vue-json-excel

引入:

<script>
import JsonExcel from "vue-json-excel"

export default {
  name: "outputFault",
  // 注册组件
  components: {
    JsonExcel
  },
//......
//......
</script>

使用:

<template>里的引入方式

<json-excel
   :data="faultData"
   :fields="dataCheckTitle"
    type="xls"
    name="表格.xls"
    :stringifyLongNum="stringifyLongNum"
 >
     <el-button type="primary" @click="checkGroupeToTitle">下载EXCEL</el-button>
</json-excel>

定义的data(){}

data(){
return {
      faultData:[],
      dataCheckTitle:{},
      stringifyLongNum:true,//解决数字精度丢失问题
      dataTitle:{
        "故障时间": "faultTime",
        "故障现场": "place",
        "故障描述": "faultDesc",
        "故障类型": "type",
        "故障原因": "reason",
        "处理过程": "result",
        "故障编码": {
          field: "faultCode",
          callback: value => {
            return '&nbsp;'+ value//解决把编码识别为日期的问题
          }
        },
        "状态": {
          field:"status",
          callback: value => {
            switch (value){
              case 0:
                value = "未解决";
                return;
              case 1:
                return value="已解决";
              case 2:
                return value="已关闭";
            }
          }
        }
      },
//......其他代码。。。。。。
}

完成页面代码示例:

<template>
  <system-dialog
    :title="outputDialog.title"
    :visible="outputDialog.visible"
    :width="outputDialog.width"
    :height="outputDialog.height"
    @onClose="onCloseOutput"
    @onConfirm="onConfirmOutput"
  >
    <div slot="content">
      <el-row>
        <el-col :span="4">导出列</el-col>
        <el-col :span="20">
          <el-checkbox-group v-model="checkGroup">
            <el-checkbox
              v-for="(item, key) in dataTitle"
              :label="key"
              :key="key"
              :disabled="key === '故障描述'"
            >{{ key }}</el-checkbox>
          </el-checkbox-group>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="4" :offset="4">
          <json-excel
            :data="faultData"
            :fields="dataCheckTitle"
            type="xls"
            name="故障列表.xls"
            :stringifyLongNum="stringifyLongNum"
          >
            <el-button type="primary" @click="checkGroupeToTitle">下载EXCEL</el-button>
          </json-excel>
        </el-col>
      </el-row>
    </div>
  </system-dialog>
</template>

<script>
import JsonExcel from "vue-json-excel"
import SystemDialog from "@/components/system/SystemDialog.vue"
import faultApi from "@/api/fault.js"

export default {
  name: "outputFault",
  // 注册组件
  components: {
    SystemDialog,
    JsonExcel
  },
  // 父组件传递给子组件的数据
  props:[
    "outputDialogVisible",
    "searchModel",
    "startEndTime"
  ],
  data(){
    return {
      faultData:[],
      dataCheckTitle:{},
      stringifyLongNum:true,//解决数字精度丢失问题
      dataTitle:{
        "故障时间": "faultTime",
        "故障现场": "place",
        "故障描述": "faultDesc",
        "故障类型": "type",
        "故障原因": "reason",
        "处理过程": "result",
        "故障编码": {
          field: "faultCode",
          callback: value => {
            return '&nbsp;'+ value //解决把编码识别为日期的问题
          }
        },
        "状态": {
          field:"status",
          callback: value => {
            switch (value){
              case 0:
                value = "未解决";
                return;
              case 1:
                return value="已解决";
              case 2:
                return value="已关闭";
            }
          }
        }
      },
      //可加可不加
      json_meta: [
        [
          {
            " key ": " charset ",
            " value ": " utf- 8 "
          }
        ]
      ],
      searchModel1:{
        startTime:'',
        endTime:'',
      },
      outputModel:{},
      //时间范围
      outputDate:'',
      outputDialog: {
        title: "故障导出",// 窗口标题 新增和修改共用,所以打开时再赋值
        visible: false, // 是否显示
        width: 700,// 窗口宽度
        height: 300// 窗口高度
      },
      // 多选框
      checkGroup:["故障时间","故障现场","故障描述"],
      // groupOption:["故障时间","故障现场","故障编码","故障描述","故障类型","故障原因","处理过程","状态"],
    }
  },
  methods:{
    async search(){
      if(this.startEndTime.length>0){
        this.searchModel.startTime = this.startEndTime[0]
        this.searchModel.endTime = this.startEndTime[1]
      }
      let res = await faultApi.getFaultListByDate(this.searchModel)
      if(res.success){
        this.faultData = res.data
      }
    },
    checkGroupeToTitle(){
      this.checkGroup.forEach(item => {
        this.dataCheckTitle[item]=this.dataTitle[item]
      })
    },
    onCloseOutput(){
      // 关闭窗口
      this.outputDialog.visible = false
      // 执行父组件方法
      this.$emit('updateOutput')
      // 清空参数
      this.outputDate=''
    },
    onConfirmOutput(){
      // 关闭窗口
      this.outputDialog.visible = false
      // 执行父组件方法
      this.$emit('updateOutput')
      // 清空参数
      this.outputDate=''
    },
  },
  //监听outputDialogVisible变化
  watch: {
    outputDialogVisible: function(newVal, oldVal){
      if(newVal) {
        this.outputDialog.visible = newVal
        this.search()
      }

    }
  },
}
</script>

<style scoped>
.el-row{
  margin-bottom: 20px;
}
.el-col{
  line-height: 30px;
}
</style>

<think>好的,用户现在问的是如何在Vue导出Excel。之前他们询问了关于el-upload组件的属性,现在转向导出功能,可能是在项目中需要处理文件上传后再导出数据。首先,我需要确定用户的需求场景,比如他们是否已经有了数据,需要前端生成Excel,还是需要从后端获取数据再导出。 用户可能是开发者,对Vue有一定了解,但可能不熟悉文件导出的具体方法。常见的导出方式有两种:前端生成Excel文件或通过后端接口返回文件流。前端生成适合数据量小的情况,后端处理适合大数据或复杂格式。 我需要考虑用户可能需要的两种方法,并分别介绍。前端方面,可以使用xlsx或file-saver库,这些是常用的工具。需要说明安装步骤、基本用法和示例代码。后端方面,可能需要处理响应头,比如设置Content-Disposition,以及如何处理blob数据。 另外,用户可能关心如何自定义导出的内容,比如表头、样式,或者如何处理大量数据。需要提到这些注意事项,比如前端导出的性能问题,或者后端生成时的安全性。 还要注意代码示例的正确性,比如使用Vue的方法和生命周期钩子,可能需要提醒用户在哪里引入依赖,如何处理异步请求。此外,是否需要处理错误情况,比如导出失败时的提示。 可能用户没有明确说明是前端还是后端实现,所以需要两者都涵盖,并比较优缺点,帮助用户选择适合的方案。同时,注意回答的结构清晰,分点说明,让用户容易理解步骤和选项。 需要检查之前的回答是否有相关部分,比如之前提到的el-upload是否与导出有关联,但看起来导出是独立的功能。因此,可以专注于导出Excel的不同方法,确保覆盖用户可能的需求点,并提供实际代码示例和常见问题解答,比如如何处理特殊字符或样式调整。</think>以下是关于在 Vue 项目中实现 Excel 导出的 3 种主流方案详解: --- ### 一、前端直接生成 Excel(适合小数据量) #### 1. 使用 `xlsx` + `file-saver` 库 ```bash npm install xlsx file-saver --save ``` #### 2. 基础实现代码 ```vue <template> <el-button @click="exportExcel">导出Excel</el-button> </template> <script> import { saveAs } from 'file-saver'; import * as XLSX from 'xlsx'; export default { data() { return { tableData: [ { name: '张三', age: 25, department: '技术部' }, { name: '李四', age: 30, department: '市场部' } ] }; }, methods: { exportExcel() { // 创建工作簿 const wb = XLSX.utils.book_new(); // 创建工作表 const ws = XLSX.utils.json_to_sheet(this.tableData); // 设置列宽 ws['!cols'] = [{ wch: 15 }, { wch: 10 }, { wch: 20 }]; // 添加到工作簿 XLSX.utils.book_append_sheet(wb, ws, '员工数据'); // 生成文件 const buffer = XLSX.write(wb, { bookType: 'xlsx', type: 'array' }); const blob = new Blob([buffer], { type: 'application/octet-stream' }); // 保存文件 saveAs(blob, '员工数据表.xlsx'); } } }; </script> ``` #### 3. 高级功能实现 ```javascript // 自定义表头 const headers = ['姓名', '年龄', '部门']; const headerData = [headers]; const bodyData = this.tableData.map(item => [item.name, item.age, item.department]); const ws = XLSX.utils.aoa_to_sheet([...headerData, ...bodyData]); // 合并单元格(合并A1-C1) ws['!merges'] = [XLSX.utils.decode_range("A1:C1")]; // 设置单元格样式 const headerStyle = { font: { bold: true, color: { rgb: "FFFFFF" } }, fill: { fgColor: { rgb: "4472C4" } } }; for(let col = 0; col < headers.length; col++) { const cell = XLSX.utils.encode_cell({ r: 0, c: col }); ws[cell].s = headerStyle; } ``` --- ### 二、后端生成 Excel 文件流(推荐大数据量场景) #### 1. 前端请求处理 ```vue <script> export default { methods: { async exportFromServer() { try { const response = await this.$axios.get('/api/export', { responseType: 'blob', params: { startDate: '2023-01-01', endDate: '2023-12-31' } }); // 创建下载链接 const url = window.URL.createObjectURL(new Blob([response.data])); const link = document.createElement('a'); link.href = url; link.setAttribute('download', '报表数据.xlsx'); document.body.appendChild(link); link.click(); link.remove(); } catch (error) { console.error('导出失败:', error); } } } } </script> ``` #### 2. 后端示例(Node.js + Express) ```javascript router.get('/export', (req, res) => { const data = generateExcelData(); // 生成Excel数据的业务逻辑 res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); res.setHeader('Content-Disposition', 'attachment; filename=export.xlsx'); // 使用 exceljs 库生成文件流 const workbook = new ExcelJS.Workbook(); const worksheet = workbook.addWorksheet('Sheet1'); // 添加数据... workbook.xlsx.write(res).then(() => { res.end(); }); }); ``` --- ### 三、第三方组件方案(快速集成) #### 1. 使用 `vue-json-excel` 插件 ```bash npm install vue-json-excel ``` #### 2. 基础使用 ```vue <template> <download-excel :data="tableData" :fields="jsonFields" name="导出数据.xls" type="xls" > <el-button>一键导出</el-button> </download-excel> </template> <script> import DownloadExcel from 'vue-json-excel'; export default { components: { DownloadExcel }, data() { return { jsonFields: { '姓名': 'name', '年龄': 'age', '部门': { field: 'department', callback: value => value.toUpperCase() // 格式化部门名称 } } }; } }; </script> ``` --- ### 四、注意事项对比表 | 方案 | 优点 | 缺点 | 适用场景 | |---------------------|-------------------------------|-------------------------------|---------------------| | **前端生成** | 快速实现,无需后端支持 | 大数据量性能差 | 数据量 < 1000 行 | | **后端生成** | 处理大数据,格式控制更灵活 | 需要前后端协作 | 数据量 > 10000 行 | | **第三方组件** | 简单快速集成 | 样式定制能力有限 | 简单表格快速导出 | --- ### 五、常见问题解决 #### 1. 中文乱码问题 ```javascript // 前端解决方案(添加BOM头) const bom = new Uint8Array([0xEF, 0xBB, 0xBF]); const blob = new Blob([bom, buffer], { type: 'application/octet-stream' }); // 后端解决方案(Node.js) res.write('\ufeff'); // 写入BOM头 ``` #### 2. 复杂表头处理 ```javascript // 使用二维数组结构 const complexHeader = [ ['主要信息', '', '', '辅助信息'], ['姓名', '年龄', '部门', '入职日期', '薪资'] ]; const ws = XLSX.utils.aoa_to_sheet(complexHeader); ``` #### 3. 导出性能优化 ```javascript // 分块处理大数据(前端) const CHUNK_SIZE = 5000; for (let i = 0; i < bigData.length; i += CHUNK_SIZE) { const chunk = bigData.slice(i, i + CHUNK_SIZE); XLSX.utils.sheet_add_json(ws, chunk, { skipHeader: true, origin: -1 }); } ``` --- 根据具体需求场景选择合适的实现方案,建议:小型数据报表使用前端生成方案,复杂业务数据采用后端生成,需要快速实现简单导出时使用第三方组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值