JavaScript 导出csv文件页面卡死时的处理方式

news2024/11/28 3:42:00

在这里插入图片描述

文章概叙

当我在使用xlsx包导出csv文件时候,数据过大导致页面卡死,因此才使用blob的方式来导出csv文件,如果没有出现这个问题,建议还是使用xlsx包

XLSX包

npm的地址,对于前后端开发的同学来说,文档难度不大,大概看下就可以快速上手,且当前开发的最高版本为0.18.5,项目使用也很稳定

https://www.npmjs.com/package/xlsx

为什么使用blob生成文件

当数据量大于某个值的时候(需要看你当时的内存,有时候可能一两个g都没问题,有时候可能100m都炸),会导致页面的卡死,基本是因为使用xlsx的时候,生成每一个sheet的时候,传入的数据形式类似下面

let array1 = new Array(10).fill({
        name: 'mk',
        age: "18"
        });

数据大概如下,就是一个长度为10的数组对象。
请添加图片描述
当数据量不会太大的时候,内存并不会溢出,也就是说页面并不会卡死,数据量较少时候放在前端,是一个很明智的选择。但当你把导出excel的功能放在前端的时候,你就必须考虑一个内存会爆的情况。这时候可以尝试使用blob的形式导出csv文件。我想你也不会想我花两三个小时的时间解释Blob的作用,直接上代码吧。

使用Blob创建文件

    const downloadFunction = (dataArray) => {
        document.getElementById('download').onclick = function () {
          
            var csvRows = dataArray;
            var csvString = csvRows.join("\r\n");
            var csvData = new Blob([csvString], { type: 'text/csv' });var a = document.createElement('a');
            a.href = URL.createObjectURL(csvData);
            a.target = '_blank';
            a.download = 'export.csv';
            document.body.appendChild(a);
            a.click();
        }
    }

上述的代码没有啥理解的难度,主要是生成一个下载名为export.csv的文件,对传进去的数据的处理逻辑也只是将数组转化为string,并且添加空格作为切割,以及将其转化为blob,并导出去。

代码使用以及测试

先来一波最简单的压力测试,让大家大概地了解下用法。

   const downloadFunction = (dataArray) => {
        document.getElementById('download').onclick = function () {var csvRows = dataArray;
            var csvString = csvRows.join("\r\n");
            var csvData = new Blob([csvString], { type: 'text/csv' });var a = document.createElement('a');
            a.href = URL.createObjectURL(csvData);
            a.target = '_blank';
            a.download = 'export.csv';
            document.body.appendChild(a);
            a.click();
        }
    }
    let column = ["name", "age"];const data = ["mk", "18"];let array = new Array(100000).fill(data);
    downloadFunction([column, ...array]);

请添加图片描述

生成了一个最简单的excel,生成了一个csv文件,大概内容如下

对于csv文件,百度的解释是这样的

逗号分隔值(Comma-Separated
Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。

因此,对于数据中的逗号,需要做一些处理,比如下面这种情况。

这儿对数据的格式做了处理,比如,将其添加了一个逗号,这样子,会出现下面的这种情况,数据“mk, a coder” 被csv文件切割成了"mk", "a coder"这两个不同的格子里面。
请添加图片描述

所以,对逗号的处理,需要添加下面的这种操作,这儿修改下,只生成两个数组

let array = new Array(2)
    .fill(data.map(string => string === null ? '' : `\"${string}\"`));
 console.log(array);

请添加图片描述

ok,逗号的问题,暂时解决了。接下来要处理的,是数字的问题,大家应该都有发现,我这儿用的数字是18,但是如果是用户的编号,类似00001这样子的话,生成的csv文件,会出问题。如下:
请添加图片描述

所以,需要再加一个数字的处理,具体逻辑就是加一个"\t",具体可以百度下是什么意思,我就不喜欢做保姆了。

let array = new Array(2)
    .fill(
        data
            // 对数字格式的字符串做处理
            .map(string => { if (!!parseInt(string)) { return `\t${string}` } })
            // 对逗号做处理
            .map(string => string === null ? '' : `\"${string}\"`)
    );

接下来还有一个问题,当我们将数据修改为如下的格式的时候。

    let column = ["name", "age", "description", "remark"];const data = ["mk, a coder",
     "000018",
      '{"desc1":"desc1","desc2":"desc2"}',
       'the remarks is: {"remark1":"remark2","reamrk3":"remark4"}'
       ];

可以看到新的数据,他们多增加了一个双引号,这就导致了我们生成的csv文件中,在有逗号的地方,会分割开,生成一个新的格子。让我们打印出来文字看看。

请添加图片描述

可以看到最后是由于页面中的",被csv文件认为是需要做切割的地方,因此,对于逗号的处理,我们要修改下操作​​

let array = new Array(2)
        .fill(
            data
                // 对数字格式的字符串做处理
                .map(string => !!parseInt(string) ? `\t${string}` : string)
                // 对逗号以及json做处理
                .map(string => string === null ? '' : "\"" + string.replaceAll("\"", "\"\"") + "\"")
        );

打印出来的文字如下
请添加图片描述

​生成的文件如下:

请添加图片描述

完美,游戏结束,最后的代码如下:

<!DOCTYPE html>
<html lang="en"><head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head><body>
    <button id="download">下载</button>
</body>
<script>const downloadFunction = (dataArray) => {
        document.getElementById('download').onclick = function () {var csvRows = dataArray;
            var csvString = csvRows.join("\r\n");
            var csvData = new Blob([csvString], { type: 'text/csv' });var a = document.createElement('a');
            a.href = URL.createObjectURL(csvData);
            a.target = '_blank';
            a.download = 'export.csv';
            document.body.appendChild(a);
            a.click();
        }
    }
​
​
    let column = ["name", "age", "description", "remark"];const data = ["mk, a coder", "000018", '{"desc1":"desc1","desc2":"desc2"}', 'the remarks is: {"remark1":"remark2","reamrk3":"remark4"}'];let array = new Array(2)
        .fill(
            data
                // 对数字格式的字符串做处理
                .map(string => !!parseInt(string) ? `\t${string}` : string)
                // 对逗号以及json做处理
                .map(string => string === null ? '' : "\"" + string.replaceAll("\"", "\"\"") + "\"")
        );
    console.log(array);
    downloadFunction([column, ...array]);
</script></html>

当然,我的建议是能使用xlsx就使用xlsx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/742057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SCI一区】互联燃料电池混合动力汽车通过信号交叉口的生态驾驶双层凸优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

LCD显示方向

LCD显示方向 一、ILI9341内存到显示地址的映射 本文只讨论“正常显示”&#xff0c;不讨论“垂直滚动显示”模式。 可以看到物理内存被两个指针访问&#xff0c;行指针和列指针&#xff0c;行指针范围从000h到013Fh&#xff0c;列指针范围为0000h到00EFh。也就是说&#xff0c…

naive-ui 的n-date-picker改变成中文

如下 那改完之后就要变成 如下 其实蛮简单的 修改app.vue import { zhCN,dateZhCN } from "naive-ui";<n-config-provider :locale"zhCN" :date-locale"dateZhCN"><RouterView /></n-config-provider> 你要是卡到前端难题&a…

Graphics Mill 11.1.18 -24-06-2023 Crack

Graphics Mill 是适用于 .NET 和 ASP.NET 开发人员的最强大的成像工具集。它允许用户轻松向 .NET 应用程序添加复杂的光栅和矢量图像处理功能。 加载和保存 JPEG、PNG 和另外 8 种图像格式 调整大小、裁剪、自动修复、色度键和 30 多种其他图像操作 可处理任何尺寸&#xff08…

P3 第一章 电路模型与电路定律

1、在电路当中&#xff0c;理想电源的阻值与理想电源的u-i特性无关。 理想电压源的内阻是零&#xff0c;理想电流源的内阻是无穷。而在电路中的等效阻值有电路的连接情况决定。 发电机、蓄电池工作特性接近于电压源&#xff0c;电路模型表达为电压源电阻串联。 光电池特性比较…

《MySQL》内置函数

文章目录 日期函数字符串函数数学函数其他函数 日期函数 函数名称功能current_date()当前日期&#xff08;yyyy-mm-dd&#xff09;current_time()当前时间&#xff08;hh-mm-ss&#xff09;current_timestamp()当前时间戳&#xff08;yyyy-mm-dd hh-mm-ss&#xff09;now()当前…

缓存 - Spring Boot 整合 Caffeine 不完全指北

文章目录 Pre名词解释注解属性指导步骤步骤 1&#xff1a;添加依赖步骤 2&#xff1a;配置缓存步骤 3&#xff1a;使用缓存 CodepomConfigService缓存名枚举 & 常量测试入口测试 Pre 缓存 - Caffeine 不完全指北 名词解释 Cacheable&#xff1a;表示该方法支持缓存。当调…

Few-Shot Learning in Wireless Networks: A Meta-Learning Model-Enabled Scheme

1 INTRODUCTION 由于6G的复杂管理机制&#xff0c;可以在基站收集历史数据——为克服训练数据集容量的限制提供了极大的便利 问题与挑战&#xff1a; 尽管元学习可以提高网络边缘智能(network edge intelligence)的性能&#xff0c;但其在无线网络(wireless networks)中的应用…

HCIP实验---OSPF实验2

1.如图连接&#xff0c;合理规划IP地址&#xff0c;所有路由器各自创建一个loopback接口 2.R1再创建三个接口IP地址为201.1.1.1/24、201.1.2.1/24、201.1.3.1/24 R5再创建三个接口IP地址为202.1.1.1/24、202.1.2.1/24、202.1.3.1/24 R7再创建三个接口IP地址为203.1.1.1/2…

高效办公学习的秘密!打工人高效工作必备的AI神器

​人工智能 (AI) 近年来取得了显著进步&#xff0c;并已成为科技行业的流行语。我们随时能看到大量有关人工智能工具的资讯&#xff0c;它有可能自动执行任务&#xff0c;节省时间并提高效率&#xff0c;使其成为企业的宝贵资产和平台。 随着人工智能的进步&#xff0c;旨在让…

如何在Ubuntu18.04中下载MySQL5.7

检查环境 首先检查自己电脑有没有安装过mysql,输入如下&#xff1a; rpm -qa | grep mysql如果有则清理干净在安装&#xff0c;输入 whereis mysql找到文件夹目录&#xff0c;再把它删除 rpm -e --nodeps mysql-xxx检查系统是否自带mariadb&#xff0c;输入如下检查 rpm -…

基于Tars高并发IM系统的设计与实现-实战篇1

基于Tars高并发IM系统的设计与实现-实战篇1 通过前文基础篇&#xff0c;进阶篇的介绍&#xff0c;相信大家已经对IM的基础能力实现&#xff0c;难点及其如何解决有了一个全面的了解与认识。 相信大家都迫不及待想看看一个高性能的IM系统到底怎么设计与实现&#xff0c;从本篇开…

grpc学习笔记

目录 gRPC原理网络传输效率问题基本概念概览ClientServer 异步相关概念异步 Client异步 Server gRPC原理 RPC 即远程过程调用协议&#xff08;Remote Procedure Call Protocol&#xff09;&#xff0c;可以让我们像调用本地对象一样发起 远程调用。 网络传输效率问题 HTTP…

Mysql---explain详解

explain命令是用来分析查询语句的执行计划的工具。它可以显示查询语句的执行计划&#xff0c;包括查询的顺序、使用的索引、扫描的行数等信息&#xff0c;帮助开发人员优化查询语句的性能。通过分析执行计划&#xff0c;可以找到查询语句的瓶颈&#xff0c;进而优化查询语句的性…

机器学习笔记 - 探索PaddlePaddle框架的对象检测、分割和关键点检测

一、PaddlePaddle简述 PaddlePaddle(PArallel Distributed Deep LEarning)是百度于2016年发布的开源深度学习框架。它为各种机器学习任务提供了统一的平台。 但是最近的基准测试显示 PaddlePaddle 是潜在的领跑者,其基准速度超过了其更知名的竞争对手。 PaddlePaddle 与 PyT…

2.SpringBoot集成Swagger

1.添加依赖 <!--添加Swagger依赖 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version></dependency><!--添加Swagger-UI依赖 --><dependenc…

Python实现操作MySQL【增删改查-示例】

闲话少叙,直接上操作! 一、准备工作 1.本地安装MySQL、Python(以3.6为例) 2.MySQL新建数据库【test】,新建表【user】,新建字段【name】【age】 3.建表方式:navicat工具 字段 二、Python操作—插入数据 #!/usr/bin/env # coding=utf-8import pymysql # Python 连…

Leetcode-每日一题【430.扁平化多级双向链表】

题目 你会得到一个双链表&#xff0c;其中包含的节点有一个下一个指针、一个前一个指针和一个额外的 子指针 。这个子指针可能指向一个单独的双向链表&#xff0c;也包含这些特殊的节点。这些子列表可以有一个或多个自己的子列表&#xff0c;以此类推&#xff0c;以生成如下面…

Java语言程序设计试卷6套

目录 Java语言程序设计试卷1 一、单项选择题 二、多项选择题 三、判断题 Java语言程序设计试卷2 一、单项选择题 二、多项选择题 三、判断题 Java语言程序设计试卷3 一、单项选择题 二、多项选择题 三、判断题 Java语言程序设计试卷4 一、单项选择题 二、多项选…

【7月比赛合集】119场可报名的数据挖掘大奖赛,任君挑选!

CompHub[1] 主页增加了“近两周上新的奖金赛”&#xff0c;更加方便查找最新比赛&#xff0c;欢迎访问和反馈&#xff01; 最新更新的比赛会第一时间在群里通知&#xff0c;欢迎加群交流&#xff01;&#xff08;公众号回复“加群”即可&#xff09; 以下信息仅供参考&#xff…