首页 > 其他分享 >vue2项目中使用webworker(二):导出Excel

vue2项目中使用webworker(二):导出Excel

时间:2024-09-02 19:38:21浏览次数:10  
标签:const item excelName Excel webworker vue2 workbook worker columns

需求

有的时候我们导出的数据量很大,如果在主进程中操作的话可能会导致页面卡顿的问题

代码

App.vue

<template>
  <div class="app">
    <button @click="exportExcel">导出Excel</button>
  </div>
</template>

<script>
import ExcelWorker from './worker/excel.worker.js'

import * as XLSX from 'xlsx-js-style'

export default {
  created() {
    const worker = new ExcelWorker()
    this.worker = worker
    this.worker.addEventListener('message', (e) => {
      const { workbook, excelName } = e.data
      XLSX.writeFile(workbook, excelName)
    })
  },
  methods: {
    exportExcel() {
      this.worker.postMessage({
        data: [
          {
            name: 'zs',

            age: 20,

            date: '1991-06-01',

            address: '广州市',
          },

          {
            name: 'ww',

            age: 14,

            date: '2001-09-01',
          },

          {
            name: 'ls',

            age: 31,

            date: '1993-04-14',
          },
        ],
        columns: [
          {
            prop: 'name',

            label: '姓名',

            width: 150,

            excelStyle: {
              font: { bold: true },

              alignment: {
                horizontal: 'center',

                vertical: 'center',
              },

              fill: {
                fgColor: {
                  rgb: 'FFFF00',
                },
              },
            },
          },

          {
            prop: 'age',

            label: '年龄',

            width: 300,
          },

          {
            prop: 'date',

            label: '出生日期',

            excelStyle: {
              fill: {
                fgColor: {
                  rgb: '00FFFF',
                },
              },
            },
          },
        ],
        excelName: '测试',
      })
    },
  },
}
</script>

<style lang="less" scoped></style>

excel.worker.js

import { exportExcel } from '@/utils/excel.js'


self.onmessage = (e) => {
  const { columns, data, excelName } = e.data

  exportExcel(excelName, data, columns, (workbook, excelName) => {
    self.postMessage({
      workbook,
      excelName
    })
  })
}

utils/excel.js

import * as XLSX from 'xlsx-js-style'



export function exportExcel(excelName, data, columns, cb) {

  const newData = []

  const keys = columns.map((item) => item['prop'])

  const headers = columns.map((item) => item['label'])



  data.forEach((item) => {

    const row = []

    for (let key of keys) {

      row.push(item[key])

    }

    newData.push(row)

  })

  // 添加表头

  newData.unshift(headers)



  const workbook = XLSX.utils.book_new()

  const worksheet = XLSX.utils.json_to_sheet(newData, {

    skipHeader: true,

  })



  // 设置列宽

  const columnsWidth = columns.map((item) => {

    return {

      wpx: item.width,

    }

  })

  worksheet['!cols'] = columnsWidth



  // 设置表头样式

  columns.forEach((item, index) => {

    if (item['excelStyle']) {

      const cell = indexToLetters(index) + 1

      worksheet[cell].s = item['excelStyle']

    }

  })



  XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1')

  // XLSX.writeFile(workbook, `${excelName}.xlsx`)
  cb(workbook, `${excelName}.xlsx`)
}



function indexToLetters(i) {

  if (i >= 0 && i <= 25) {

    return String.fromCharCode(65 + i)

  } else {

    return undefined

  }

}

标签:const,item,excelName,Excel,webworker,vue2,workbook,worker,columns
From: https://www.cnblogs.com/it774274680/p/18393359

相关文章

  • Java 根据模板生成 PDF 文件 以及 excel 文件
    模板PDF的字段引入maven<!--iTextforgeneratingPDFfiles--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.2</v......
  • delphi开发Excel用户定义函数
    在Delphi中开发Excel用户定义函数(User-DefinedFunction,UDF)通常涉及到以下几个关键步骤:1.**创建DLL文件**-使用Delphi编写一个动态链接库(DLL),其中包含要作为ExcelUDF的函数。函数必须遵循特定的签名规范,以便Excel能够识别和调用。示例UDF函数:```delphilibr......
  • Python自动复制Excel数据:将各行分别重复指定次数
      本文介绍基于Python语言,读取Excel表格文件数据,并将其中符合我们特定要求的那一行加以复制指定的次数,而不符合要求的那一行则不复制;并将所得结果保存为新的Excel表格文件的方法。  这里需要说明,在我们之前的文章多次复制Excel符合要求的数据行:Python批量实现中,也介绍过实现......
  • Vue面试常见知识总结2——spa、vue按需加载、mvc与mvvm、vue的生命周期、Vue2与Vue3区
    SPASPA(SinglePageApplication,单页面应用)是一种Web应用程序架构,其核心特点是在用户与应用程序交互时,不重新加载整个页面,而是通过异步加载页面的局部内容或使用JavaScript动态更新页面。以下是对SPA的详细解析,包括其优点和缺点:SPA的优点更好的用户体验:SPA无需重新加载......
  • vue2项目中使用webworker(一):发送网络请求
    背景有的时候我们需要向后端发送多个网络请求,如果全部在主线程中操作的话页面会变得非常卡顿,我们可以使用webwoker来发送网络请求,一旦服务响应结果,我们再从子线程给主线程发送消息步骤默认情况下vue2是不支持webwoker。安装worker-loadernpmi-Dworker-loadervue.conf......
  • vue3 导出为Excel文件
    服务端给的一个下载接口:/order/exportOrderOpenInvoice导出转化为ExcelconstexportOrder=async()=>{ letreqData={};  letexportOrderOpenInvoiceUrl="/order/exportOrderOpenInvoice";   try{   constresponse=awaitaxios.get(exportOrderOpenInvo......
  • nodejs实现将json转化为excel文件
    本文使用node.js实现将json数据转换导出为excel文件。一、安装json2xls库npmijson2xls二、封装转换方法新增jsonToExcel.js文件,该文件用于将json数据(对象数组)转换为excel文件,文件内容如下:constfs=require('fs')//引入文件系统模块constjson2xls=require('json2......
  • Vue2实现应用添加水印的功能
    需求有的情况,我们需要给我们的网页添加水印。我们可以使用第三方库WatermarkDesign。官方地址:https://watermark-design.github.io/watermark/zh/效果示例代码入口文件main.jsimportWatermarkDesignfrom'@watermark-design/vue';Vue.use(WatermarkDesign)vue容器App......
  • python Pandas合并(单元格、sheet、excel )
    如果你对Python感兴趣的话,可以试试我整理的这一份全套的Python学习资料,【点击这里】免费领取!安装Pandas和openpyxl首先,确保已经安装了Pandas和openpyxl。可以通过pip安装:pip install pandas openpyxl创建DataFrameimportpandasaspd#创建DataFramed......
  • Java Excel转PDF(免费)
    目前市面上Excel转PDF的组件较多:收费:aspose、GcExcel、spire开源:jacob、itextpdf其中收费的组件封装得比较好,代码简洁,转换的效果也很好,但收费也高得离谱:为了成本考虑,就需要考虑开源的组件了,因为它们都是免费的:jacob:目前没有探索出很好的导出效果。itextpdf:已探索出......