如何运用Vue和Excel实现数据的批量编辑和导入

Vue是一款流行的JavaScript框架,常被用于构建动态用户界面。Excel是微软开发的电子表格软件,因其易用性和强大功能备受欢迎。本文将介绍如何运用Vue和Excel实现数据的批量编辑和导入。

1. 准备工作

在介绍具体实现步骤前,我们需要先做些准备工作。

1.1 安装依赖

首先,我们需要安装以下依赖项:

npm install xlsx --save

npm install file-saver --save

xlsx是一个可以解析Excel文件的库,file-saver用于在客户端生成文件并保存在本地。

1.2 创建Vue工程

在安装依赖项后,我们需要创建Vue工程,可使用Vue官方的脚手架工具,也可以使用其他的工具。

2. 批量编辑

数据批量编辑是Excel表格最常用的功能之一。在本节中,我们将实现在Vue页面中批量编辑表格的功能。

2.1 解析Excel文件

首先,我们需要编写代码来解析上传的Excel文件,并将其转换成可编辑的数据格式。以下是实现代码:

import { read } from "xlsx";

export default {

methods: {

handleFile(files) {

const file = files[0];

const reader = new FileReader();

reader.onload = e => {

const data = e.target.result;

const workbook = read(data, {type: "binary"});

const sheetName = workbook.SheetNames[0];

const worksheet = workbook.Sheets[sheetName];

const headers = {};

const dataArr = [];

for (let cell in worksheet) {

if (cell[0] === "!") continue;

const col = cell.substring(0, 1);

const row = cell.substring(1);

const value = worksheet[cell].v;

if (row === "1") {

headers[col] = value;

continue;

}

if (!dataArr[row]) dataArr[row] = {};

dataArr[row][headers[col]] = value;

}

this.dataArr = dataArr.slice(1);

};

reader.readAsBinaryString(file);

}

},

data() {

return {

dataArr: []

};

}

};

在这个代码中,我们使用了xlsx库中的read方法来解析Excel文件。首先,我们读取上传的文件并将其转换成二进制数据。然后我们从二进制数据中解析出Excel文件,取得第一个sheet的所有数据。接下来,我们通过headers对象来存储表头中的每一列的值。最后,我们将Excel文件的数据从对象格式转换成数组格式,并将其传递给Vue组件中的dataArr数组。

2.2 实现表格编辑功能

我们已经成功将Excel文件解析成可编辑的数据格式,现在开始实现表格编辑功能。我们将在Vue中使用element-ui库来实现表格展示和编辑功能。

<template>

<el-table :data="dataArr" style="width: 100%">

<el-table-column v-for="(item, index) in columns" :key="index" :prop="item.prop" :label="item.label">

<template slot-scope="scope">

<el-input v-model="scope.row[item.prop]" :disabled="!editable"></el-input>

</template>

</el-table-column>

</el-table>

</template>

<script>

export default {

data() {

return {

editable: false,

columns: [

{ label: "姓名", prop: "name" },

{ label: "性别", prop: "gender" },

{ label: "年龄", prop: "age" }

]

};

}

};

</script>

在这段代码中,我们首先使用element-ui的el-table组件来展示数据。然后,我们使用el-table-column来创建表头和对应的列,其中prop属性表示该列对应的数据字段。最后,我们使用el-input组件来实现可编辑的单元格。在editetable属性为false时,单元格为只读状态,在editable为true时,单元格为可编辑状态。

3. 数据导入

数据导入是Excel表格最常用的功能之一。在本节中,我们将实现在Vue页面中导入Excel文件的功能。

3.1 下载Excel模板

首先,我们需要为用户提供一个下载Excel模板的链接,让用户根据表头进行数据录入。

<template>

<div class="button-wrap">

<a href="./ExcelTemplate.xlsx" download>下载Excel模板</a>

</div>

</template>

使用a标签创建一个下载链接,并指定其链接文件的格式为.xlsx文件。例如,在我的项目文件夹中,Excel模板文件的位置为./public/ExcelTemplate.xlsx。

3.2 上传Excel文件

在用户完成数据录入之后,我们需要提供一个上传Excel文件的按钮,让用户上传数据文件。以下是实现代码:

<template>

<el-button type="primary" @click="handleUploadClick">

{{ uploadBtnText }}

<input type="file" ref="fileInput" class="file-input" @change="handleFileChange" style="display:none">

</el-button>

</template>

<script>

export default {

data() {

return {

uploadBtnText: "上传Excel数据文件"

};

},

methods: {

handleUploadClick() {

this.$refs.fileInput.click();

},

handleFileChange(event) {

const files = event.target.files;

this.$emit("file-selected", files);

}

}

};

</script>

<style>

.file-input {

height: 0;

width: 0;

visibility: hidden;

}

</style>

在这段代码中,我们使用element-ui的el-button组件创建一个上传按钮,并使用input元素来实现输入框功能。当用户点击按钮时,我们触发handleUploadClick方法,使input元素的click事件被触发,从而实现选择文件功能。当用户选择文件后,我们将所选文件传递给父组件。

3.3 保存导入数据

在文件上传成功后,我们需要将文件中的数据保存到数据库中。以下是实现代码:

import { write } from "xlsx";

import { saveAs } from "file-saver";

export default {

methods: {

handleFileSelected(files) {

if (files && files.length) {

this.file = files[0];

this.handleFile(this.file);

}

},

handleFile(file) {

const reader = new FileReader();

reader.onload = e => {

const data = e.target.result;

const workbook = read(data, {type: "binary"});

const sheetName = workbook.SheetNames[0];

const worksheet = workbook.Sheets[sheetName];

const headers = [];

const dataArr = [];

for (let cell in worksheet) {

if (cell[0] === "!") continue;

const col = cell.substring(0, 1);

const row = cell.substring(1);

const value = worksheet[cell].v;

if (row === "1") {

headers[col] = value;

continue;

}

if (!dataArr[row]) dataArr[row] = {};

dataArr[row][headers[col]] = value;

}

const fileName = this.file.name.replace('.xlsx', '');

const headers = this.columns.map(column => column.label);

const fields = this.columns.map(column => column.prop);

const result = [];

dataArr.forEach(item => {

const newItem = {};

fields.forEach(field => {

newItem[field] = item[field] ? item[field] : null;

});

result.push(newItem);

});

const newWorkbook = {

SheetNames: ["Sheet1"],

Sheets: {

Sheet1: write(result, { header: headers, skipHeader: true })

}

};

saveAs(new Blob([newWorkbook]), `${fileName}-processed.xlsx`);

};

reader.readAsBinaryString(file);

}

}

};

在这个代码中,我们首先使用file-saver库中的saveAs方法来保存上传的文件,并按照指定格式重命名该文件。然后,我们使用xlsx库中的write方法来将文件中的数据进行处理,并生成一个新的Excel文件,其中的数据和原始数据类似,只不过我们对其进行了处理。最后,将处理后的数据保存到新的Excel文件中。

总结

本文介绍了如何使用Vue和Excel实现数据批量编辑和导入功能。我们通过使用xlsx库中的read和write方法来解析和生成Excel文件,并使用element-ui库来实现表格展示和编辑功能。同时,我们还使用了file-saver库来在客户端生成和保存文件。这些功能的实现,可以大大提高数据维护的效率,减少人工录入和编辑数据的时间和成本。