首页技术栈归档照片墙音乐日记随想收藏夹友链留言关于

VUE纯前端导出

写作时间:2026-07-08

VUE纯前端导出

前端excel导出

            <el-col :span="4" >
              <el-button type="primary" @click="exportToExcel">导出</el-button>
            </el-col>

            <el-table
              :data="sortedAndPaginatedVerificationTableData"
              stripe
              border
              ref="tableRef"
              @sort-change="handleSortChange"
            >
              <el-table-column prop="age" label="年龄" width="150" sortable>
              </el-table-column>
              <el-table-column prop="status" label="状态" width="120" sortable>
              </el-table-column>
              <el-table-column
                prop="message"
                label="信息"
                sortable
              >
              </el-table-column>
            </el-table>

导出方式一

//导出Excel
    exportToExcel(){
      //第一种方式
      // 获取表格内容
      const excelContent = this.$refs.tableRef.$el.innerHTML;

      // 处理表头,确保没有额外的空白单元格
      const headerElement = document.createElement('div');
      headerElement.innerHTML = excelContent;
      const headerCells = headerElement.querySelectorAll('th');

      // 移除最后一个空单元格
      if (headerCells.length > 0) {
        const lastCell = headerCells[headerCells.length - 1];
        lastCell.parentNode.removeChild(lastCell);
      }

      // 构建 Excel 文件内容
      let excelFile = `
        <html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel' xmlns='http://www.w3.org/TR/REC-html40'>
        <head>
        <!--[if gte mso 9]>
        <xml>
        <x:ExcelWorkbook>
        <x:ExcelWorksheets>
        <x:ExcelWorksheet>
        <x:Name>{worksheet}</x:Name>
        <x:WorksheetOptions>
        <x:DisplayGridlines/>
        </x:WorksheetOptions>
        </x:ExcelWorksheet>
        </x:ExcelWorksheets>
        </x:ExcelWorkbook>
        </xml>
        <![endif]-->
        <style>
        td{border: .5pt solid;}
        </style>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        </head>
        <body>
        ${headerElement.innerHTML}
        </body>
        </html>
      `;

      // 创建 Blob 对象
      const blob = new Blob([excelFile], { type: 'application/vnd.ms-excel' });

      // 创建链接并触发下载
      const link = document.createElement("a");
      link.href = URL.createObjectURL(blob);
      link.download = '表格.xlsx'; // 设置默认文件名
      link.style.display = "none";
      document.body.appendChild(link);
      link.click();
      window.URL.revokeObjectURL(link.href);
      document.body.removeChild(link);
    }

导出方式2

//导出Excel
    exportToExcel(){
      //第二种方式

      // 获取表格数据
      const tableData = this.tableData;

      // 构建 Excel 文件内容
      let excelContent = `<html><head><meta charset="UTF-8"></head><body><table border="1">`;

      // 添加表头
      excelContent += '<tr>';
      for (const column of this.$refs.tableRef.columns) {
        if (column.property) {
          excelContent += `<th>${column.label}</th>`;
        }
      }
      excelContent += '</tr>';

        //如要添加多级表头则复制几个tr几即可使用
        //rowspan用于合并多个行的单元格。
         //  colspan用于合并多个列的单元格。


      // 添加表格数据
      for (const row of tableData) {
        excelContent += '<tr>';
        for (const column of this.$refs.tableRef.columns) {
          if (column.property) {
            excelContent += `<td>${row[column.property]}</td>`;
          }
        }
        excelContent += '</tr>';
      }

      // 构建完整的 Excel 文件内容
      excelContent += '</table></body></html>';

      // 创建 Blob 对象
      const blob = new Blob([excelContent], { type: 'application/vnd.ms-excel' });

      // 创建链接并触发下载
      const link = document.createElement("a");
      link.href = URL.createObjectURL(blob);
      link.download = '表格.xlsx'; // 设置默认文件名
      link.style.display = "none";
      document.body.appendChild(link);
      link.click();
      window.URL.revokeObjectURL(link.href);
    }

这里tableData是表格的原始数据,如果前端已经获取到表格的所有数据,就可以对整个数据进行导出,也就是推荐第二种方式,第一种方式可以对表格样式进行控制,但是数据是考虑当前页面的表格数据,也就是本页数据的导出,所以后来我摒弃了第一种方式,直接使用的第二种方式。

第二种方式的好处:

  1. 首先,它获取表格数据并遍历每一行,以构建 Excel 文件内容。
  2. 在构建表头时,它遍历了表格的列属性,以获取每一列的标签(label),并添加到表头中,不用控制表格过滤空白单元格,这是第一种的弊端。

导出为cvs

     let csvContent = "data:text/csv;charset=utf-8,";
      csvContent += "年龄,状态,信息\n"; // 添加表头

      // 添加数据行
      this.verificationTableData.forEach(row => {
        let csvRow = [];
        csvRow.push(row.age);
        csvRow.push(row.status);
        csvRow.push(row.message);
        csvContent += csvRow.join(",") + "\n";
      });

      // 创建下载链接
      const encodedUri = encodeURI(csvContent);
      const link = document.createElement("a");
      link.setAttribute("href", encodedUri);
      link.setAttribute("download", "data.csv");
      document.body.appendChild(link);

      // 触发点击下载
      link.click();
      document.body.removeChild(link);

前端导出excel 分多个sheet页


/**
* 
* @param {*} jsonDataArray    二维数组                  数据
* @param {*} headerArray      二维数组                  表头
* @param {*} sheetNameArray   数组                      每个sheet页的名称
* @param {*} info             excel名称的前缀           
* @returns 
*/

import * as XLSX from 'xlsx/xlsx.mjs';

export default function exportByExcel(jsonDataArray, headerArray, sheetNameArray, info) {
    let time = new Date();
    let year = time.getFullYear();
    let month = time.getMonth() + 1;
    let day = time.getDate();
    let hour = time.getHours();
    let min = time.getMinutes();
    let s = time.getSeconds();
    month = month > 10 ? month : '0' + month;
    day = day > 10 ? day : '0' + day;
    hour = hour > 10 ? hour : '0' + hour;
    min = min > 10 ? min : '0' + min;
    s = s > 10 ? s : '0' + s;
    let name = year + '' + month + '' + day + '' + hour + '' + min + '' + s;

    const workbook = XLSX.utils.book_new();

    jsonDataArray.forEach((jsonData, index) => {
        let arrAll = [];
        jsonData.forEach((item) => {
            let arr = [];
            headerArray[index].forEach((item1) => {
                let singleData = '';
                for (let i in item) {
                    if (item1 === i) {
                        singleData = item[item1];
                    }
                }
                arr.push(singleData);
            });
            arrAll.push(arr);
        });

        const worksheetName = sheetNameArray[index];
        const worksheetData = [headerArray[index], ...arrAll];
        const worksheet = XLSX.utils.aoa_to_sheet(worksheetData);
        XLSX.utils.book_append_sheet(workbook, worksheet, worksheetName);
    });

    XLSX.writeFile(workbook, info + '_' + name + '.xlsx');
};

<script>
import exportByExcel from "../utils/exportByExcel"
import { ElMessage } from 'element-plus'
export default {
  name: 'HomeView',
  data() {
    return {
      tableData: [],
      tableData2: [],
      dataHeaders: [
        ["a", "b", "c", "d", "e", "f"],
        ["a", "b", "c", "d", "e", "f"],
      ],
      list1: [],
      list2: []
    }
  },
  methods: {
    onSuccess(response, uploadFile, uploadFiles) {
      console.log(response, uploadFile, uploadFiles)
    },
    onError(error, uploadFile, uploadFiles) {
      ElMessage({
        message: error,
        type: 'error',
      })
    },
    exportBtn() {
      this.tableData.forEach((item) => {
        this.list1.push({
          "a": item.a,
          "b": item.b,
          "c": item.c,
          "d": item.d,
          "e": item.e,
          "f": item.f,
        })
      })
      this.tableData2.forEach((item) => {
        this.list2.push({
          "a": item.a,
          "b": item.b,
          "c": item.c,
          "d": item.d,
          "e": item.e,
          "f": item.f,
        })
      })
      let jsonDataArray = [this.list1, this.list2]
      let sheetNameArray = ["sheetName1", " sheetName2",]
      let info = "导出"
      exportByExcel(jsonDataArray, this.dataHeaders, sheetNameArray, info)
    }
  }
}
</script>

Element table 导出Excel重复数据

exportToExcel(){


    let fix = document.querySelector('.el-table__fixed');
    let wb;
    if(fix){ //判断要导出的节点中是否有fixed的表格,如果有,转换excel时先将该dom移除,然后append回去
        wb = XLSX.utils.table_to_book(document.querySelector('#lyTable').removeChild(fix));
        document.querySelector('#lyTable').appendChild(fix);
    }else{
        wb = XLSX.utils.table_to_book(document.querySelector('#lyTable'));
    }
    let wbout = XLSX.write(wb, { bookType: 'xls', bookSST: true, type: 'array' })
    try {
        saveAs(new Blob([wbout], { type: 'application/octet-stream' }), ' 重点日跟踪环保设施用电量情况表.xlsx');
    } catch (e) {
        if (typeof console !== 'undefined') console.log(e, wbout)
    }
    return wbout

},




  <el-table
                        highlight-current-row
                        show-body-overflow
                        virtual-scroll
                        ref="dataTabletO"
                        id="lyTable"
                        row-height="25"
                        :span-method="spanMethod"
                        border
                        size="mini"
                        :data="dataTable"
                        style="width: 100%"
                        max-height="500px"
                        :header-cell-style="{
                                'text-align': 'center',
                                'color': 'white',
                                'height': '8',
                                'fontsize': '1.8rem'
                            }"
                        :cell-class-name="addTableRowAndColClass">
                    <el-table-column type="index" prop="xh" width="50" label="序号" fixed></el-table-column>
                    <el-table-column prop="DUTY_DEPT" label="责任部门" :show-overflow-tooltip="true" width="90" fixed></el-table-column>
                    <el-table-column prop="EQPT_NAME" label="设备名称" :show-overflow-tooltip="true" width="200" fixed></el-table-column>
                    <el-table-column prop="IND_NAME" label="对标指标名称" :show-overflow-tooltip="true" width="120" fixed></el-table-column>
                    <el-table-column prop="UINT" label="单位" :show-overflow-tooltip="true" width="90" fixed></el-table-column>
                </el-table>
avatar

yuanyourdomain

写代码,做研究,记录生活。

RECOMMENDED

MyBatis 动态 SQL

2026-07-08

Nginx 基础入门

2026-07-08

Maven 多模块与私服

2026-07-08