前端使用vue3+ts如何实现表格的导出以及如何进行合并计算,以及中文转换

149 阅读4分钟

在我们涉及表格数据统计的时候,难免会进行数据合并然后导出展示,一般后端会给我们写导出接口,但是有时候后端给我们返回的数据不是全部都要使用,少部分需要导出的时候,这个时候就满足不了需求,就需要我们前端进行导出

image.png

就比如给我们很多字段,但是导出的时候只需要某几个的情况

1、 我使用的是xlsx,首先进行下载

npm i xlsx

2、在对应的页面进行引入使用(这是引入假数据的页面,但是合计不是中文)

image.png

3、我们可以在main.ts引入并且全局挂载

import locale from 'element-plus/lib/locale/lang/zh-cn' // 中文语言
// 使用element-plus 并且设置全局的大小
app.use(ElementPlus, {
  locale: locale
}).use(store).use(router).mount('#app')

这样就是中文的了

image.png

4、比如说表格有这么多数据,我不想导出固化剂加水量的数据,这个时候我们前端就调用xlsx方法

image.png

<template>
    <el-button type="warning" @click="handleExport">导出</el-button>
    <el-table v-loading="loading" border :cell-style="{ textAlign: 'center' }"
        :header-cell-style="{ 'text-align': 'center' }" :data="tableData" style="width: 100%" stripe show-summary>
        <el-table-column prop="startTime" label="开始时间">
        </el-table-column>
        <el-table-column prop="endTime" label="结束时间">
        </el-table-column>
        <el-table-column prop="gq" label="矸石量(t)">
        </el-table-column>
        <el-table-column prop="fac" label="粉煤灰量(t)">
        </el-table-column>
        <el-table-column prop="wcfga" label="矸石加水量(m³)">
        </el-table-column>
        <el-table-column prop="cc" label="固化剂量(t)">
        </el-table-column>
        <el-table-column prop="cwa" label="固化剂加水量(m³)">
        </el-table-column>
    </el-table>
</template>
<script lang="ts" setup>
    import * as XLSX from 'xlsx'
    import { ref } from 'vue'
    const loading = ref(false);
    const excelList = ref([])
    // 这是后端表格返回的getList()方法的数据
    const tableData = ref([
        {
            "createBy": null,
            "createTime": "2024-06-03 14:31:18",
            "updateBy": null,
            "updateTime": null,
            "remark": null,
            "id": "a9a0332e34a1425f8f54833bd1b851ad",
            "startTime": "2024-06-01 12:00",
            "endTime": "2024-06-01 17:00",
            "gq": 26.963,
            "fac": 15.802,
            "wcfga": 17.9,
            "cc": 19.201,
            "cwa": null,
            "startDate": null,
            "endDate": null
        },
        {
            "createBy": null,
            "createTime": "2024-06-03 14:30:26",
            "updateBy": null,
            "updateTime": null,
            "remark": null,
            "id": "36f5111bd8214ceba9aa3afd0cb1bfa2",
            "startTime": "2024-05-28 12:00",
            "endTime": "2024-05-28 21:00",
            "gq": 271.823,
            "fac": 112.779,
            "wcfga": 147.2,
            "cc": 134.794,
            "cwa": null,
            "startDate": null,
            "endDate": null
        },
        {
            "createBy": null,
            "createTime": "2024-05-26 19:51:31",
            "updateBy": null,
            "updateTime": null,
            "remark": null,
            "id": "3c354565a68849c3b0d034fdd037ecd1",
            "startTime": "2024-05-26 14:05",
            "endTime": "2024-05-26 21:00",
            "gq": 324.204,
            "fac": 408.291,
            "wcfga": 153,
            "cc": 117.5,
            "cwa": null,
            "startDate": null,
            "endDate": null
        }
    ])
    // 导出逻辑和合并逻辑
    const handleExport = () => {
        // 点击导出调用接口给的数据
        const response = [
            {
                "createBy": null,
                "createTime": "2024-06-03 14:31:18",
                "updateBy": null,
                "updateTime": null,
                "remark": null,
                "id": "a9a0332e34a1425f8f54833bd1b851ad",
                "startTime": "2024-06-01 12:00",
                "endTime": "2024-06-01 17:00",
                "gq": 26.963,
                "fac": 15.802,
                "wcfga": 17.9,
                "cc": 19.201,
                "cwa": null,
                "startDate": null,
                "endDate": null
            },
            {
                "createBy": null,
                "createTime": "2024-06-03 14:30:26",
                "updateBy": null,
                "updateTime": null,
                "remark": null,
                "id": "36f5111bd8214ceba9aa3afd0cb1bfa2",
                "startTime": "2024-05-28 12:00",
                "endTime": "2024-05-28 21:00",
                "gq": 271.823,
                "fac": 112.779,
                "wcfga": 147.2,
                "cc": 134.794,
                "cwa": null,
                "startDate": null,
                "endDate": null
            },
            {
                "createBy": null,
                "createTime": "2024-05-26 19:51:31",
                "updateBy": null,
                "updateTime": null,
                "remark": null,
                "id": "3c354565a68849c3b0d034fdd037ecd1",
                "startTime": "2024-05-26 14:05",
                "endTime": "2024-05-26 21:00",
                "gq": 324.204,
                "fac": 408.291,
                "wcfga": 153,
                "cc": 117.5,
                "cwa": null,
                "startDate": null,
                "endDate": null
            }
        ]
        excelList.value = response
        let gqSum = excelList.value.reduce((prev, item) => {
            prev += item.gq
            return prev
        }, 0)
        let facSum = excelList.value.reduce((prev, item) => {
            prev += item.fac
            return prev
        }, 0)
        let wcfgaSum = excelList.value.reduce((prev, item) => {
            prev += item.wcfga
            return prev
        }, 0)
        let ccSum = excelList.value.reduce((prev, item) => {
            prev += item.cc
            return prev
        }, 0)
        let cwaSum = excelList.value.reduce((prev, item) => {
            prev += item.cwa
            return prev
        }, 0)
  excelList.value.push({ startTime: '合计', gq: gqSum, fac: facSum, wcfga: wcfgaSum, cc: ccSum})
        // 1.把数据转化为表格名称对应
        let arr = excelList.value.map((item) => {
            return {
                '开始时间': item.startTime,
                '结束时间': item.endTime,
                '矸石量(t)': item.gq,
                '粉煤灰量(t)': item.fac,
                '矸石加水量(m³)': item.wcfga,
                '固化剂量(t)': item.cc,
            };
        });
        //2.用于将 JSON 数据转换为 Excel 工作表中的单元格数据。
        let sheet = XLSX.utils.json_to_sheet(arr);
        //3.用于创建一个新的 Excel 工作簿对象它返回一个空白的工作簿,可以向其中添加工作表和单元格数据。
        let book = XLSX.utils.book_new();
        //4.用于向现有的 Excel 工作簿对象(Workbook)中添加一个新的工作表
        // book_append_sheet(wb, sheet, name=None)
        //参数wb是要将工作表添加到的 Workbook 对象;sheet 参数是要添加的 Worksheet 对象;name 参数是要为工作表指定的名称(如果未指定,则使用默认名称)
        XLSX.utils.book_append_sheet(book, sheet, "sheet1");
        //5.用于将 Excel 工作簿下载到本地文件系统中 book要下载的Eceial表格,第二个参数是表格名称
        XLSX.writeFile(book, `充填量数据.xlsx`);
    }
</script>
<style lang="scss" scoped>
    /* // 表格尾部的合计这行文字对齐 */
    :deep(.el-table__footer-wrapper tbody td.el-table__cell) {
        text-align: center;
    }
</style>