前端读取导入的Excel文件并以表格样式展示在页面中

使用前下载包 xlsx

        npm install --save xlsx

代码 

<template>
    <div style="width:100%;height:100%; background-color: white;">
        <span>
            <input class="input-file" type="file" @change="exportData"
                accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" />
            <el-button size="mini" type="primary" @click="btnClick">导入EXCEL</el-button>
        </span>
        <!-- 导入文件后需要渲染的表格 -->
        <!-- 表格组件 -->
        <div class="myTable">
            <el-table max-height="600" :data="dataArr" v-loading="tableLoading" border style="width: 100%">
                <el-table-column :prop="item.prop" :label="item.label" :width="item.width" v-for="(item, i) in tableColumn"
                    :key="i"></el-table-column>
            </el-table>
        </div>
    </div>
</template>
   
<script>
// import XLSX from 'xlsx'
import * as xlsx from 'xlsx'


export default {
    name: 'HelloWorld',
    props: {
        type: String,
        default: '选择excel文件'
    },
    data() {
        return {
            dataArr: [], // 表格内容数据数组
            // countArr: {}, // 分析表格数据以及表头,得到一个对照数组,用来进行自定义合并,本文暂时只写基础,不介绍自动合并单元格了哟~~我的其他文章有写自定义合并实现方法~
            tableColumn: [], // 表格表头配置数组
            tableLoading: false // 表格是否loading
        }
    },
    methods: {
        // 点击上传文件事件
        btnClick() {
            document.querySelector('.input-file').click()
        },
        //  获取表格表头
        getHeader(sheet) {
            const XLSX = xlsx
            const headers = []
            const range = XLSX.utils.decode_range(sheet["!ref"]) // worksheet['!ref'] 是工作表的有效范围
            let C
            /* 获取单元格值 start in the first row */
            const R = range.s.r // 行 // C 列
            let i = 0
            for (C = range.s.c; C <= range.e.c; ++C) {
                var cell =
                    sheet[
                    XLSX.utils.encode_cell({ c: C, r: R })
                    ] /* 根据地址得到单元格的值find the cell in the first row */
                var hdr = "UNKNOWN" + C // 如果有空表头,会替换为您想要的默认值replace with your desired default
                // XLSX.utils.format_cell 生成单元格文本值
                if (cell && cell.t) hdr = XLSX.utils.format_cell(cell)
                if (hdr.indexOf('UNKNOWN') > -1) {
                    if (!i) {
                        hdr = '__EMPTY'
                    } else {

                        hdr = '__EMPTY_' + i
                    }
                    i++
                }
                headers.push(hdr)
            }
            return headers
        },
        // 获取表格内容
        setTable(headers, excellist) {
            const tableTitleData = [] // 存储表格表头数据
            const tableMapTitle = {} // 设置表格内容中英文对照用
            headers.forEach((_, i) => {
                tableMapTitle[_] = "prop" + i
                tableTitleData.push({
                    prop: "prop" + i,
                    label: _,
                    width: 100
                })
            })
            console.log("tableTitleData", tableTitleData)
            // 映射表格内容属性名为英文
            const newTableData = []
            excellist.forEach(_ => {
                const newObj = {}
                Object.keys(_).forEach(key => {
                    newObj[tableMapTitle[key]] = _[key]
                })
                newTableData.push(newObj)
            })
            console.log('newTableData', newTableData)
            this.tableColumn = tableTitleData
            this.dataArr = newTableData
        },

        //  读取文件
        exportData(event) {
            if (!event.currentTarget.files.length) {
                return
            }
            const that = this
            // 拿取文件对象
            var f = event.currentTarget.files[0]
            // 用FileReader来读取
            var reader = new FileReader()
            // 重写FileReader上的readAsBinaryString方法
            FileReader.prototype.readAsBinaryString = function (f) {
                var binary = ''
                var wb // 读取完成的数据
                var outdata // 你需要的数据
                var reader = new FileReader()
                reader.onload = function (e) {
                    // 读取成Uint8Array,再转换为Unicode编码(Unicode占两个字节)
                    var bytes = new Uint8Array(reader.result)
                    var length = bytes.byteLength
                    for (var i = 0; i < length; i++) {
                        binary += String.fromCharCode(bytes[i])
                    }
                    // 接下来就是xlsx了,具体可看api
                    wb = xlsx.read(binary, {
                        type: 'binary'
                    })
                    outdata = xlsx.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]])
                    const excellist = [] //清空接收数据
                    // 自定义方法向父组件传递数据
                    // console.log('outdata = ' + JSON.stringify(outdata))
                    for (var i = 0; i < outdata.length; i++) {
                        console.log(outdata[i])
                        excellist.push(outdata[i])
                    }
                    console.log("读取结果", excellist)
                    that.$emit('getResult', outdata)
                    const a = wb.Sheets[wb.SheetNames[0]]
                    const headers = that.getHeader(a)
                    console.log("headers", headers)
                    that.setTable(headers, excellist)
                }
                reader.readAsArrayBuffer(f)
            }
            reader.readAsBinaryString(f)
        }
    }
}
</script>
   
<style scoped>
.input-file {
    display: none;
}
</style>
   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
前端可以使用FileReader API将Excel文件读取为二进制数据,然后将其发送到后端Java服务器。后端可以使用Apache POI或JExcelAPI等Java库来解析Excel文件并将其转换为数据。以下是一个简单的代码示例: 前端代码: ``` <template> <div> <input type="file" @change="handleFileChange"> </div> </template> <script> export default { methods: { handleFileChange(event) { const file = event.target.files[0] const reader = new FileReader() reader.onload = () => { const data = reader.result this.uploadFile(data) } reader.readAsBinaryString(file) }, uploadFile(data) { // 将数据发送到后端Java服务器 } } } </script> ``` 后端代码: ``` @PostMapping("/upload") public List<List<String>> uploadExcel(@RequestParam("file") MultipartFile file) throws IOException { Workbook workbook = WorkbookFactory.create(file.getInputStream()); Sheet sheet = workbook.getSheetAt(0); List<List<String>> data = new ArrayList<>(); for (Row row : sheet) { List<String> rowData = new ArrayList<>(); for (Cell cell : row) { rowData.add(cell.toString()); } data.add(rowData); } return data; } ``` 这个示例使用Spring Boot和Apache POI来处理Excel文件。在这个例子,我们将Excel文件作为MultipartFile对象上传到后端,并使用WorkbookFactory创建一个Workbook对象。然后,我们使用getSheetAt方法获取第一个Sheet对象,并使用for循环遍历每一行和每一列,将每个单元格的值添加到一个字符串列表,并将该列表添加到数据列表。最后,我们返回数据列表。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值