首页 > 其他分享 >导入个Excel页面直接卡死,该如何解决

导入个Excel页面直接卡死,该如何解决

时间:2023-10-31 10:45:34浏览次数:28  
标签:xlsx const worker Excel WebWorker new 卡死 data 页面

JavaScript是单线程的语言,也就是说同步代码都需要排队去执行,这样就会造成很多问题,就比如:数据量大的excel文件的导入导出,会造成整个页面出现“假卡死”的现象。
什么是“假卡死”呢?意思就是页面其实并没有卡死,但是用户做一些操作时,页面并没有及时给到反馈,这就会让用户觉得页面卡死了

解决方案

这个问题可以用 WebWorker 来解决,WebWorker 能开启一个子线程,来做一些我们需要让它做的事情,并把结果返回到主线程,这样就可以不阻塞主线程的代码执行了

WebWorker和setTimout区别

  • 其实在单核电脑上,它两确实没啥区别,但是在多核电脑上,WebWorker 可以同时使用多个cpu来计算, 速度比 setTimeout快
  • setTimeout 还是在主线程上执行,还是会占主线程的资源影响主线程的执行,但是 WebWorker 跟主线程是隔离开的

步骤

1.安装xlsx

pnpm i xlsx

2.WebWorker导入

<input @change="handleImport" type="file" />
<button type="button" @click="handleClick">按钮</button>
const handleImport = (ev: Event) => {
  const file = (ev.target as HTMLInputElement).files![0];
  const worker = new Worker(
    URL.createObjectURL(
      new Blob([
        `
        importScripts('https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.16.4/xlsx.full.min.js');
        onmessage = function(e) {
          const fileData = e.data;
          const workbook = XLSX.read(fileData, { type: 'array' });
          const sheetName = workbook.SheetNames[0];
          const sheet = workbook.Sheets[sheetName];
          const data = XLSX.utils.sheet_to_json(sheet, { header: 1 });
          postMessage(data);
        };
        `,
      ]),
    ),
  );

  // 使用FileReader读取文件内容
  const reader = new FileReader();

  reader.onload = function (e: any) {
    const data = new Uint8Array(e.target.result);
    worker.postMessage(data);
  };

  // 读取文件
  reader.readAsArrayBuffer(file);

  // 监听Web Worker返回的消息
  worker.onmessage = function (e) {
    console.log('解析完成', e.data);
    worker.terminate(); // 当任务完成后,终止Web Worker
  };
};

3.WebWorker解决导出

const handleExport = () => {
  const worker = new Worker(
    URL.createObjectURL(
      new Blob([
        `
        importScripts('https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.16.4/xlsx.full.min.js');
        onmessage = function(e) {
          const data = e.data;
          const workbook = XLSX.utils.book_new();
          const sheetData = e.data
          const worksheet = XLSX.utils.aoa_to_sheet(sheetData);
          XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
          const excelData = XLSX.write(workbook, { type: 'array', bookType: 'xlsx' });
          postMessage(excelData, [excelData.buffer]);
        };
        `,
      ]),
    ),
  );

  worker.onmessage = function (e) {
    const excelData = e.data;

    // 创建 Blob 对象,用于保存 Excel 文件数据
    const blob = new Blob([excelData], {
      type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    });

    // 创建下载链接并触发下载
    const downloadLink = document.createElement('a');
    downloadLink.href = URL.createObjectURL(blob);
    downloadLink.download = 'export.xlsx';
    downloadLink.click();

    // 终止 Web Worker
    worker.terminate();
  };

  worker.postMessage([...你的数据]);
};

标签:xlsx,const,worker,Excel,WebWorker,new,卡死,data,页面
From: https://www.cnblogs.com/tn666/p/17799748.html

相关文章

  • 如何修改URL而不重新加载页面?
    内容来自DOChttps://q.houxu6.top/?s=如何修改URL而不重新加载页面?有没有办法在不重新加载页面的情况下修改当前页面的URL?如果可能的话,我想访问#哈希之前的部分。我只需要更改域名之后的部分,所以它不像是违反了跨域政策。window.location.href="www.mysite.com/page2.......
  • 【Azure Function App】如何修改Azure函数应用的默认页面呢?
    问题描述当在Azure中创建了一个函数应用(FunctionApp)后,访问默认URL会得到一个默认的页面。是否有办法修改这个默认页面呢?  问题解答在之前的博文中,介绍了修改AppService的默认页面。1:【Azure应用服务】AppService默认页面暴露Tomcat版本信息,存在安全风险 :https://www.cnbl......
  • # yyds干货盘点 #Python自动化办公——3个Excel表格中每个门店物品不同,想要汇总在一起
    大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Python自动化办公处理的问题,一起来看看吧。原始数据如下所示:二、实现过程这里【猫药师Kelly】给了一个代码和思路,如下所示:顺利地解决了粉丝的问题。下一篇文章,我们一起来看看另外一种方法。三、总结大家好,......
  • [-005-]-Python3+Unittest+Selenium Web UI自动化测试之页面滑动
    1.上下滑动a.滑动#滑动至页面底部:js1="window.scrollTo(0,document.body.scrollHeight)"self.driver.execute_script(js1)#滑动至页面顶部:js2="window.scrollTo(0,0)"self.driver.execute_script(js2)c.纵向滚动条通过scrollBy坐标来滚动#纵向滚动条通过scr......
  • python,pandas ,openpyxl提取excel特定数据,合并单元格合并列,设置表格格式,设置字体颜色,
    python,pandas,openpyxl提取excel特定数据,合并单元格合并列,设置表格格式,设置字体颜色,代码importosimportnumpyimportpandasaspdimportopenpyxlfromopenpyxl.stylesimportFontfromopenpyxl.stylesimportBorder,Sidedefread(file):#读取表格A和表格B......
  • FastReport 导出Excel、Word、Pdf
    privatevoidExportPDF(H_HistoryDataModelmodel){try{//createreportinstanceReportreport=newReport();PrepareReport(report,model);//createexpor......
  • vue3 + vite 的Excel表格的导入导出
    一、安装XLSX插件yarnaddxlsx或者npmixlsx二、引入插件在你需要的页面或者在main.js中引入import*asXLSXfrom'xlsx'三、导出Excel3.1核心api①xlsx.utils.book_new() 新建工作簿② xlsx.uti......
  • 短视频app源码,Flutter组件--搜索页面布局
    短视频app源码,Flutter组件--搜索页面布局 classLayoutDemoextendsStatelessWidget{ constLayoutDemo({Key?key}):super(key:key); @override Widgetbuild(BuildContextcontext){  returnPadding(   padding:constEdgeInsets.all(10),   c......
  • HExcel,一个简单通用的导入导出Excel工具类
    前言日常开发中,Excel的导出、导入可以说是最常见的功能模块之一,一个通用的、健壮的的工具类可以节省大量开发时间,让我们把更多精力放在业务处理上中之前我们也写了一个Excel的简单导出,甚至可以不依赖poi,还扩展了纯前端导出Excel!详情请戳:《POI导出Excel 》,遗憾的是......
  • 工作常用的EXCEL公式 | 某列相同的数据进行汇总
    需求:解决方法:1、对部门排序,再进行分类汇总(数据-分类汇总) 2、选中A列,CTRL+G,快速定位空值,然后点击合并单元格3、选中A列,然后点击格式刷,刷在B列 4、取消分类汇总 5、删除A列,然后筛选B列为0的数据,然后删除,即可。 (调整一下格式即可) ......