vue-Excel导入对话框模板

这是一个关于Vue.js实现的Excel导入对话框模板,具备更新历史记录和功能清单。该组件提供基本的定制内容配置,支持通过回调方法处理导入内容,并能设置导入结果的显示方式。还包含用于辅助操作的工具类。

vue-Excel导入对话框模板

更新历史

名称内容
创建时间2021-10-18
更新时间2021-10-18
变更次数0

功能清单

  • 提供基于对话框的excel导入功能
  • 配置基本定制内容
  • 通过回调方法处理定制内容
  • 通过方法设置导入结果的显示
<!--
version: 1.0
date: 2021-10-18
update:
author: Petty Fox
function: 提供基于对话框的excel导入功能

属性配置:
- allowType:配置允许的文件类型
- title:对话框标题
- allowType:配置允许的文件类型
- importDesc:导入框描述
- maxSize:最大字节数

回调方法:
- clickDownTemp(): 点击下载模板
- handleUpload({file:file}): 处理上传的文件,用axios接口调用上传
- update(): 导入完成后点击

方法:
- setResult 导入结果
- setResultError 导入错误
-->
<template>
    <el-dialog
            :close-on-click-modal="false"
            :title="title"
            top="10vh"
            destroy-on-close
            :visible.sync="dialogVisible"
            width="50%">
        <div class="import-layout">
            <el-steps :active="activeStatus" finish-status="success">
                <el-step title="导入文件" icon="el-icon-upload"></el-step>
                <el-step title="导入中" icon="el-icon-top"></el-step>
                <el-step title="导入完成"></el-step>
            </el-steps>
            <div>
                <el-upload
                        v-if="activeStatus === 0"
                        style="text-align: center;margin-top:20px;"
                        drag
                        :show-file-list="false"
                        :before-upload="uploadBefore"
                        action="https://jsonplaceholder.typicode.com/posts/"
                        multiple>
                    <i class="el-icon-upload"></i>
                    <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
                    <div class="el-upload__tip"
                         style="display: flex;justify-content: center;align-items: center;"
                         slot="tip">
                        {{importDesc}}
                        <el-link type="primary" :underline="false" @click="clickDownTemp">下载模板</el-link>
                    </div>
                </el-upload>
                <div v-if="activeStatus === 1"
                     style="display: flex;justify-content: center;align-items: center;flex-direction: column;height: 15vh">
                    <div class="el-icon-loading" style="font-size: 3rem"></div>
                    <div style="line-height: 5vh">导入中请稍后</div>
                </div>
                <div v-if="activeStatus === 2">
                    <el-descriptions title="导入结果" border>
                        <el-descriptions-item label="成功数">
                            <el-tag size="small">{{ importResult.successCount }}</el-tag>
                        </el-descriptions-item>
                        <el-descriptions-item label="失败数">
                            <el-tag size="small" type="danger">{{ importResult.errorCount }}</el-tag>
                        </el-descriptions-item>
                    </el-descriptions>
                    <div style="display: flex;justify-content: center;margin-top:30px;">
                        <el-button type="primary" @click="clickClose">关闭</el-button>
                    </div>
                </div>
            </div>
        </div>
    </el-dialog>
</template>

<script>
    import {FileUtils} from "../utils/FileUtils";

    export default {
        name: "ExcelImportDialog",
        data() {
            return {
                dialogVisible: false,
                form: {},
                activeStatus: 0,
                importResult: {}
            }
        },
        props: {
            title: {
                type: String,
                default: '批量导入'
            },
            importDesc: {
                type: String,
                default: ' 只能上传xls、xlsx文件,且不超过100MB'
            },
            allowType: {
                type: Array,
                default() {
                    return ['xls', 'xlsx']
                }
            },
            maxSize: {
                type: Number,
                default: 100 * 1024 * 1024
            }
        },
        methods: {
            open(form) {
                this.form = form
                this.dialogVisible = true
            },
            clickClose() {
                this.dialogVisible = false
                this.$emit("update")
            },
            setResult(result) {
                this.activeStatus = 2
                this.importResult = result
            },
            setResultError() {
                this.activeStatus = 0
            },
            /***
             * 上传之前处理,校验参数后触发上传事件
             */
            uploadBefore(file) {
                // 文件大小校验
                if (file.size > this.maxSize) {
                    this.$message.warning(this.importDesc)
                    return
                }
                // 文件后缀名校验
                let suffix = FileUtils.fileSuffix(file.name)
                if (this.allowType.indexOf(suffix) < 0) {
                    this.$message.warning("只支持文件格式:" + this.allowType.join(","))
                    return
                }
                this.activeStatus = 1
                this.$emit('handleUpload', {file: file})
            },
            //*****************界面操作
            /***
             * 点击下载模板
             */
            clickDownTemp() {
                this.$emit('handleDownTemp')
            }
        }
    }
</script>

<style scoped>
    .import-layout {
    }
</style>


工具类

const formatFileSize = (bytes) => {
    if (bytes === 0) return '0 B';
    let k = 1024, // or 1024
        sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
        i = Math.floor(Math.log(bytes) / Math.log(k));
    return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i];
}
/**
 * 获取文件后缀名,不包含点
 * @param name
 * @returns {string}
 */
const fileSuffix = (name) => {
    return name.substring(name.lastIndexOf(".") + 1)
}
/**
 * 文件处理相关的工具类
 * version: 1.0
 * author: Petty Fox
 */
export const FileUtils = {
    formatFileSize: formatFileSize,
    fileSuffix: fileSuffix
}

### 实现 Vue3 中的 Excel 表格编辑功能 为了实现Vue3 项目中的 Excel 表格编辑功能,可以采用多种方法和技术栈组合来完成这一目标。一种常见的做法是利用现有的库和组件,如 `SheetJS` 和 `handsontable` 或者其他类似的插件。 #### 使用 Handsontable 进行表格编辑 Handsontable 是一款强大的 JavaScript 数据网格/电子表格组件,支持丰富的交互操作,非常适合用于构建可编辑的数据表单应用。通过与 Vue.js 的集成,能够轻松创建具备复杂数据处理能力的应用程序[^1]。 安装依赖: ```bash npm install handsontable @handsontable/vue --save ``` 引入并注册组件: ```javascript import { HotTable } from '@handsontable/vue'; import 'handsontable/dist/handsontable.full.css'; export default { components: { HotTable, }, }; ``` 定义模板结构: ```html <template> <div id="app"> <hot-table :settings="hotSettings"></hot-table> </div> </template> <script> // ... data() { return { hotSettings: { data: [ ["", "Kia", "Nissan", "Toyota", "Honda"], ["2019", 10, 11, 9, 8], ["2020", 7, 2, 6, 4], ["2021", 5, 3, 8, 7] ], colHeaders: true, rowHeaders: true, contextMenu: true, filters: true, dropdownMenu: true } }; } </script> ``` 此配置提供了基本的功能集,包括列头、行号显示以及上下文菜单等功能选项。用户可以直接点击单元格输入新值或者修改现有内容,实现了简单的在线编辑体验。 对于更高级的需求,比如自定义样式、事件监听器或者其他特定行为,则可以根据官方文档进一步调整设置参数或扩展 API 接口。 #### 结合 SheetJS 处理导入导出逻辑 如果还需要支持从本地文件加载数据到表格中或是保存当前视图状态为 .xlsx 文件格式的话,那么就可以借助于之前提到过的 SheetJS 库来进行相应的读写操作了。这不仅限定了前后端之间的传输方式,同时也让用户拥有了更多样化的选择途径去管理自己的工作簿资源。 ```javascript async function importExcel(event) { const files = event.target.files; if (files.length === 0) return; const file = files[0]; const reader = new FileReader(); reader.onload = async (event) => { /* Parse data */ const bstr = event.target.result; const wb = XLSX.read(bstr, {type:'binary'}); /* Get first worksheet */ const wsname = wb.SheetNames[0]; const ws = wb.Sheets[wsname]; /* Convert array of arrays */ const data = XLSX.utils.sheet_to_json(ws, {header:1}); // 更新 Handsontable 的数据源 this.$refs.hotInstance.loadData(data); }; reader.readAsBinaryString(file); } function exportExcel() { try { // 获取 Handsontable DOM 元素 const tableData = this.$refs.hotInstance.getData(); // 将二维数组转换成工作薄对象 const ws = XLSX.utils.aoa_to_sheet(tableData); // 构建工作簿对象 const wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, 'Sheet1'); // 导出下载 XLSX.writeFile(wb, 'output.xlsx'); } catch (e) { console.error('Export failed:', e); } } ``` 上述代码片段展示了如何结合 HTML `<input>` 控制用来触发文件选取对话框,并通过调用相应的方法实现双向同步更新界面展示的内容;与此同时还给出了有关导出部分的具体实现细节说明。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值