vue使用vue-xlsx-table包读取Excel文件,并实现单元格数据可编辑

Vue读取Excel并以表格形式展现在页面上,并实现单元格数据可编辑

最近由于公司项目需求,我在画原型图的时候发现,有个功能是前端导入Excel文件并在页面上进行预览,在预览过程中用户可能会修改某个单元格的数据。因此,本文来实现利用node包vue-xlsx-table实现此需求。

第一步、安装:install
npm install vue-xlsx-table --save
第二步、引入:main.js
import vueXlsxTable from 'vue-xlsx-table'

Vue.use(vueXlsxTable, { rABS: false })
第三步、使用:ExcelRead.vue
<template>
    <div>
        <h4>vue-xlsx-table</h4>
        <vue-xlsx-table @on-select-file="handleSelectedFile">上传Excel</vue-xlsx-table>
    </div>
</template>

<script>
    export default {
        name: 'ExcelRead',
        methods: {
            /**
             * 读取Excel内容
             * @param excelData
             */
            handleSelectedFile (excelData) {
                let { header: tableHeader, body: tableData } = excelData
                console.log("excel表头:",tableHeader)
                console.log("excel数据:",tableData)

            }
        }
    }
</script>

<style scoped lang="stylus">

</style>
<template>
    <div class="home">
        <ExcelRead @update="updateExcel"></ExcelRead>
        <el-table ref="multipleTable" :data="tableData" tooltip-effect="dark" style="width: 100%"
                  @selection-change="handleSelectionChange">
            <el-table-column type="selection" width="55"></el-table-column>
            <el-table-column label="姓名">
                <template slot-scope="scope">
                    <div @dblclick="handleFieldEdit(scope.$index)">
                        <span v-show="!scope.row.mode">{{scope.row.姓名}}</span>
                        <el-input v-show="scope.row.mode" :ref="'name'+scope.$index" v-model="scope.row.姓名"
                                  @blur="handleFiledBlur(scope.$index)"
                                  @keyup.enter.native="$event.target.blur" clearable placeholder="请输入姓名"></el-input>
                    </div>
                </template>
            </el-table-column>
            <el-table-column prop="拼音" label="拼音"></el-table-column>
            <el-table-column prop="证件号码" label="证件号码"></el-table-column>
            <el-table-column prop="性别" label="性别"></el-table-column>
            <el-table-column prop="地址" label="地址"></el-table-column>
            <el-table-column prop="国籍" label="国籍"></el-table-column>
            <el-table-column prop="标签" label="标签"></el-table-column>
            <el-table-column prop="群体" label="群体"></el-table-column>
            <el-table-column prop="案件信息" label="案件信息"></el-table-column>
            <el-table-column prop="状态" label="状态"></el-table-column>
            <el-table-column prop="其他" label="其他"></el-table-column>
        </el-table>
    </div>
</template>

<script>
    import ExcelRead from '@/components/ExcelRead.component.vue'

    export default {
        name: 'home',
        data () {
            return {
                tableData: [],
            }
        },
        components: {
            ExcelRead
        },
        methods: {
            /**
             * excel数据已经上传,可以读取了
             */
            updateExcel (excelData) {
                this.tableData = excelData.body
            },
            /**
             * 编辑表格字段
             */
            handleFieldEdit (index) {
                this.tableData[index].mode = true
                this.$set(this.tableData, index, this.tableData[index])
                this.$nextTick(()=>{
                    this.$refs[`name${index}`].focus()
                })
            },
            /**
             * 单元格失去焦点事件
             */
            handleFiledBlur (index) {
                this.tableData[index].mode = false
                this.$set(this.tableData, index, this.tableData[index])
            },
            /**
             * 勾选表格行数据
             * @param val
             */
            handleSelectionChange (val) {
                console.log(val)
            }
        }
    }
</script>

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
很抱歉,我之前的回答有误,x-data-spreadsheet是基于JavaScript的电子表格库,而不是Vue组件。 以下是一个使用x-data-spreadsheet库实现Excel文件导入导出和可编辑单元格样式的示例代码: HTML模板代码: ``` <template> <div> <button @click="exportExcel">导出Excel文件</button> <input type="file" ref="file" style="display:none" @change="importExcel" /> <button @click="() => { this.$refs.file.click() }">导入Excel文件</button> <div ref="spreadsheet"></div> </div> </template> ``` JS代码: ``` <script> import Spreadsheet from 'x-data-spreadsheet' import 'x-data-spreadsheet/dist/xspreadsheet.css' export default { mounted() { const el = this.$refs.spreadsheet const options = { data: [], columns: [ { title: '姓名', field: 'name', width: 120 }, { title: '年龄', field: 'age', width: 80 }, { title: '性别', field: 'gender', width: 80 }, ], style: { bgcolor: '#f1f1f1', align: 'center', valign: 'middle', textwrap: true }, row: { len: 20, height: 30 } } this.spreadsheet = new Spreadsheet(el, options) }, methods: { async exportExcel() { const data = this.spreadsheet.getData() const blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }) const url = URL.createObjectURL(blob) const link = document.createElement('a') link.href = url link.download = 'excel.xlsx' link.click() }, async importExcel() { const file = this.$refs.file.files[0] const reader = new FileReader() reader.onload = async (event) => { const data = event.target.result const { arrayBuffer } = await import('xlsx') const workbook = arrayBuffer(data) const worksheet = workbook.Sheets[workbook.SheetNames[0]] const sheetData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }) const headerRow = sheetData[0] const tableData = [] for (let i = 1; i < sheetData.length; i++) { const rowData = {} for (let j = 0; j < headerRow.length; j++) { const key = headerRow[j] rowData[key] = sheetData[i][j] } tableData.push(rowData) } this.spreadsheet.loadData(tableData) } reader.readAsArrayBuffer(file) } } } </script> ``` 这个示例中,我们使用了x-data-spreadsheet库来渲染一个电子表格。在mounted钩子函数中,我们创建了一个Spreadsheet对象,并将其挂载到了页面上的一个div元素上。我们指定了表格的数据、列定义、单元格样式和行高等选项。 导出Excel文件的方法是通过调用Spreadsheet对象的getData方法获取表格的数据,然后使用Blob对象将数据转换为Excel文件格式,并创建一个a标签下载文件。 导入Excel文件的方法是通过一个input元素来获取用户选择的文件,然后使用FileReader对象将文件读取为ArrayBuffer二进制格式。接下来,我们使用xlsx库解析文件数据,获取到表格数据后,我们将其转换为x-data-spreadsheet库所需的数据格式,并使用Spreadsheet对象的loadData方法加载数据。 希望这个示例能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明致成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值