vue导出导入csv文件(无需插件)

这篇博客详细介绍了在Vue.js应用中如何处理CSV文件导出时的UTF-8 BOM头问题,以及导入CSV文件时如何兼容GBK编码。通过示例代码展示了如何创建和读取包含BOM头的CSV文件,并在用户界面提供下载和上传功能。
摘要由CSDN通过智能技术生成

vue导出csv的时候有一个问题,就是如果数据是UTF-8格式的,需要在文件内容前面加BOM头,这样Excel程序可以识别这个BOM头,不会乱码。
csv文件无非就是文本行加上BOM头,字符串解析就可以搞定,注意导出的csv文件经过WSP编辑保存后会变成GBK编码,所以导入还要兼容GBK编码:

<template>
    <div class="hello">
        <button @click="exportCsv">download</button>
        <input type="file" id="files" ref="file" v-on:change="importCsv" />
        <table align="center">
            <tr>
                <th width="100">姓名</th>
                <th>年龄</th>
            </tr>
            <tr v-for="(item, i) in data" :key="i">
                <td>{{ item.name }}</td>
                <td>{{ item.age }}</td>
            </tr>
        </table>
    </div>
</template>

<script>
/* eslint-disable */
export default {
    name: 'HelloWorld',
    data() {
        return {
            data: [
                { name: '张三', age: 32 },
                { name: '李四', age: 24 },
            ],
        }
    },
    methods: {
        exportCsv() {
            const header = { 'name': '姓名', 'age': '年龄' };
            export_csv(header, this.data);
            function export_csv(header, data) {
                let csv = '';
                for (let key in header) {
                    csv += header[key] + ',';
                }
                csv = csv.substr(0, csv.length - 1) + '\r\n';
                for (let i in data) {
                    for (let key in header) {
                        csv += data[i][key] + ',';
                    }
                    csv = csv.substr(0, csv.length - 1) + '\r\n';
                }
                //定义文件内容,类型必须为Blob 否则createObjectURL会报错
                let content = new Blob(['\uFEFF' + csv]);
                //生成url对象
                let urlObject = window.URL || window.webkitURL || window;
                let url = urlObject.createObjectURL(content);
                //生成<a></a>DOM元素
                let el = document.createElement("a");
                //链接赋值
                el.href = url;
                el.download = "文件导出.csv";
                //必须点击否则不会下载
                el.click();
                //移除链接释放资源
                urlObject.revokeObjectURL(url);
            }
        },
        importCsv() {
            const header = { '姓名': 'name', '年龄': 'age' };
            let file = this.$refs.file.files[0];
            read_csv_file(header, file, (data) => {
                data.splice(0, 1);
                this.data = data;
            });
            // const header = { '姓名': 'name', '年龄': 'age' };用于将标题翻译为对象的键
            // file就是input的原生file,vue里:let file = this.$refs.file.files[0];
            // callback里传递的是解析到的数组
            function read_csv_file(header, file, callback, encoding) {
                if (!file) {
                    return;
                }
                if (!encoding) {
                    const reader = new FileReader();
                    reader.readAsBinaryString(file);
                    reader.onload = () => {
                        let data = reader.result;
                        if (data.charCodeAt(0) == 0xEF && data.charCodeAt(1) == 0xBB && data.charCodeAt(2) == 0xBF) {
                            console.log('utf8 with bom data');
                            read_csv_file(header, file, callback, 'utf8');
                        } else {
                            console.log('gbk data');
                            read_csv_file(header, file, callback, 'gbk');
                        }
                    };
                } else {
                    const reader = new FileReader()
                    reader.readAsText(file, encoding);
                    reader.onload = () => {
                        let data = reader.result;
                        let lines = data.split('\n');
                        if (lines.length == 0 || !lines[0]) {
                            return;
                        }
                        let titles = {};
                        let arr = lines[0].split(',');
                        for (let i in arr) {
                            let key = arr[i].trim(); // 可能带有\r
                            titles[i] = header[key] ? header[key] : key;
                        }
                        let list = [];
                        for (let i = 0; i < lines.length; i++) {
                            if (!lines[i]) {
                                continue;
                            }
                            lines[i] = lines[i].trim();
                            let arr = lines[i].split(',');
                            let obj = {};
                            for (let j in arr) {
                                obj[titles[j]] = arr[j].trim();
                            }
                            list.push(obj);
                        }
                        callback(list);
                    }
                }
            }
        }
    }
}
</script>
Vue是目前一种流行且广泛应用于前端开发的JavaScript框架。在Vue中,常常需要实现下载并导出CSV格式的文件并自定义表头的功能。该过程一般涉及到一些列的技术与操作,下面我们来一一探讨。 1. 安装“papaparse”模块 “papaparse”是一种用于解析csvJavaScript模块,可以很方便的安装和使用。使用npm安装即可: ```bash npm install papaparse --save ``` 2. 编写自定义表头 在使用“papaparse”模块进行CSV文件处理前,需要先定义表头。下面是一个简单的例子: ```javascript const headers = [ {label: '列名1', key: 'columnName1'}, {label: '列名2', key: 'columnName2'}, {label: '列名3', key: 'columnName3'}, ]; ``` 其中,label属性表示表头中展示的文本内容,key属性唯一标识了该列在数据中的字段名称。 3. 编写CSV文件并下载 当自定义表头准备好后,可以开始编写CSV文件。在Vue中,我们可以通过使用template标签来隐藏该部分内容: ```html <template id="csv-template"> 字段1,字段2,字段3\n 数据1,数据2,数据3\n </template> ``` 然后,可以编写一个方法来代表点击按钮后下载该文件。在该方法中,我们使用“papaparse”模块内置的“unparse”方法将数据转换为CSV格式: ```javascript import Papa from 'papaparse'; downloadCSV() { const csv = Papa.unparse({ data: '数据1,数据2,数据3\n', header: true, }); const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.setAttribute('href', url); link.setAttribute('download', 'filename.csv'); link.style.visibility = 'hidden'; document.body.appendChild(link); link.click(); document.body.removeChild(link); } ``` 其中,data属性表示CSV文件的数据内容,设置header属性为true,可以省略了编写表头的步骤。另外,我们还需要将blob对象转化为URL并添加至一个隐藏的链接中完成下载动作。 以上即是导出CSV并自定义表头的方法,可以根据实际开发需求进行更进一步的定制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值