首页 > 其他分享 >vue,xlsx,xlsx-style,file-saver,生成Excel并导出,cptable报错,合并单元格 样式缺失

vue,xlsx,xlsx-style,file-saver,生成Excel并导出,cptable报错,合并单元格 样式缺失

时间:2024-10-18 10:14:05浏览次数:1  
标签:xlsx style console wb 报错 let workSheet1

一,安装依赖

 

二,导入依赖

import * as XLSX from 'xlsx';
import * as XLSX_STYLE from 'xlsx-style'
import {saveAs} from 'file-saver';

三,解决引入xlsx-style ./cptable模块找不到问题

This relative module was not found:

* ./cptable in ./node_modules/xlsx-style/dist/cpexcel.js

 

在vue.config.js中相应位置,添加配置

  configureWebpack: {
    externals: { './cptable': 'var cptable' },
  }

 

四代码

将eltable导出为excel

解决合并表格边框显示不正常的问题

// 导出excel
    exportExcel(show_fenxijieguo_type) {

      // 获取表格的DOM元素
      let elTable = this.$refs.coefTippingTable;
 

      let file_name = '_表格数据.xlsx'

      // 合并工作表
      // const wb = XLSX.utils.book_new();
      const wb = XLSX.utils.table_to_book(elTable);
      let workSheet1 = wb.Sheets.Sheet1

      console.log('-----elTable', elTable)
      console.log('-----workBook', wb)
      console.log('-----workSheet1', workSheet1)

      let borderAll = { // 单元格外侧框线
        top: {
          style: 'thin',
          color: {rgb: '000000'}
        },
        bottom: {
          style: 'thin',
          color: {rgb: '000000'}
        },
        left: {
          style: 'thin',
          color: {rgb: '000000'}
        },
        right: {
          style: 'thin',
          color: {rgb: '000000'}
        }
      }
      let keys = Object.keys(workSheet1)
      keys.sort()
      let newworkSheet1 = {}
      keys.forEach((key, index) => {
        console.log('-----index,key',index,key)
        if (!key.includes('!')) {
          workSheet1[key].s = {
            border: borderAll, // 边框样式设置
            alignment: { // 文字样式设置
              horizontal: 'center', // 字体水平居中
              vertical: 'center', // 垂直居中
              wrapText: 1 // 自动换行
            },
            // fill: { //背景色
            //   fgColor: {rgb: 'C0C0C0'}
            // },
            font: { // 单元格中字体的样式与颜色设置
              sz: 10,
              color: {
                rgb: '000000'
              },
              bold: false
            },
            bold: true,
            numFmt: 0
          }
        }
        if (index != keys.length - 1) {
          newworkSheet1[key] = workSheet1[key]
        }
      })
      workSheet1 = JSON.parse(JSON.stringify(newworkSheet1))

      this.addRangeBorder(workSheet1['!merges'], workSheet1)
      wb.Sheets.Sheet1 = workSheet1


      console.log('-----workSheet1  after delete', workSheet1)
      // XLSX.utils.book_append_sheet(wb, workSheet1, "Sheet1");
      const wbout = XLSX_STYLE.write(
        wb,
        {
          bookType: 'xlsx',
          bookSST: true,
          type: 'binary',
          cellStyles: true,
        });
      function s2ab2(s) {
        const buf = new ArrayBuffer(s.length);
        const view = new Uint8Array(buf);
        for (let i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
        return buf;
      }
      try {
        // 导出Excel
        saveAs(new Blob([s2ab2(wbout)], {type: 'application/octet-stream'}), file_name);
      } catch (e) {
        if (typeof console !== 'undefined') console.error(e, wbout);
      }
      return wbout;

    },
    // 给合并单元格增加样式,边框
    addRangeBorder (range, ws) {
      if (!range || !(range instanceof Array) || range.length == 0){
        console.error('----not merge table or not array')
        return
      }
      // 合并行边框
      const cols = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
      range.forEach(item => {
        for (let i = item.s.c; i <= item.e.c; i++) {
          const num = Math.floor(i / 26)
          let cellX = ''
          if (num < 1) {
            cellX = cols[i]
          } else {
            cellX = cols[num - 1] + cols[i % 26]
          }
          for (let k = item.s.r + 1; k <= item.e.r + 1; k++) {
            if (!Object.keys(ws).includes(cellX + k)) {
              ws[cellX + k] = {
                // 这一步很关键,需要让单元格的值存在,才能有边框,没有的话单元格还是没边框
                t: 's',
                v: '',
                s: {
                  border: {
                    top: {
                      style: 'thin',
                      color: {rgb: '000000'}
                    },
                    bottom: {
                      style: 'thin',
                      color: {rgb: '000000'}
                    },
                    left: {
                      style: 'thin',
                      color: {rgb: '000000'}
                    },
                    right: {
                      style: 'thin',
                      color: {rgb: '000000'}
                    }
                  }
                }
              }
            }
          }
        }
      })
    },

 

标签:xlsx,style,console,wb,报错,let,workSheet1
From: https://www.cnblogs.com/difs/p/18473685

相关文章

  • prometheus 报错 Error on ingesting samples that are too old or are too far into
    level=warnts=2021-08-16T03:20:04.960Zcaller=scrape.go:1507component="scrapemanager"scrape_pool=mtailtarget=http://18.167.146.20:3903/metricsmsg="Erroroningestingsamplesthataretoooldoraretoofarintothefuture"num_dro......
  • 07-SQL注入(联合注入、报错注入、盲注)
    1、在不依赖于DVWA后端数据库的情况,如何通过前端验证的方法判断DVWA中的注入点是数字型注入还是字符型注入?(提示:用假设法进行逻辑判断)在dvwa靶场中SQLInjection模块输入1and1=1如果是数字型注入输入内容没有被网站进行任何处理,可以查询到输入内容被网站进行处理,通过隐式......
  • spark运行报错:env: “/home/hadoop/anaconda3/envs/pyspark/bin/python3.8“: 没有那
    在进入spark的过程中,出现报错【env:"/home/hadoop/anaconda3/envs/pyspark/bin/python3.8":没有那个文件或目录】,当时我立马就被搞蒙了,百度了各种方法,最终都没有解决。当然有大佬说“进入conf目录下,修改spark-env.sh文件”,这个方法我也进行了修改,最终在终端输入./bin/pyspar......
  • Python中调用R语言代码(rpy)的一些报错和解决
    我搭建网站的过程中,需要将可视化的图下载下来,使用Echarts是比较好看,但是下载的是图片格式(png),项目需求是下载PDF的R绘制的图。所以我这边使用Python调用R代码,借rpy实现这个功能。在Python中调用R代码有多种方式,其中最常用的是通过rpy2库,它允许在Python中运行R代码并获......
  • supervisor使用报错解决
    常用命令supervisorctlstatus查看状态supervisorctlreload重新载入配置文件supervisorctlstartall/ftp启动所有/指定的程序进程supervisorctlstopall/frp关闭所有/指定的程序进程一.简化后的supervisord.conf配置文件内容:[unix_http_s......
  • 鸿蒙 NEXT 如何使用 @Styles 装饰器来优化我的组件代码?
    大家好,我是V哥。在鸿蒙NEXT开发中,@Styles装饰器是一种非常有用的方法,用于定义可重用的样式。这使得开发者可以将多条样式设置提炼成一个方法,以便在多个组件中复用,从而提高代码的可维护性和可读性。以下是@Styles装饰器的详细用法和应用场景案例。@Styles装饰器的使用说明......
  • Kylinv10 curl报错:SSLv3_client_method version OPENSSL_1_1_0 not define
    curl http://127.0.0.1出现问题#curlhttps://www.example.comcurl:relocationerror:/lib64/libcurl.so.4:symbolSSLv3_client_methodversionOPENSSL_1_1_0notdefinedinfilelibssl.so.1.1withlinktimereference错误是/usr/lib64中的动态链接中无法识别......
  • 【Azure 环境】请求经过应用程序网关,当响应内容大时遇见504超时报错
    问题描述API调用过程中,一旦遇到数据量大的场景下,返回504 超时的错误。注意: 请求首先达到ApplicationGateway,然后转发到后端的AppService服务中。 问题解答这可能与应用程序网关的“响应缓存区”配置有关:应用程序网关的响应缓冲区可以收集后端服务器发送的全部或部分......
  • 沃姆斯传说:午夜新娘游戏报错d3dcompiler_47.dll缺失,解决方法全攻略
    当你在玩《沃姆斯传说:午夜新娘》这款游戏时,如果遇到系统报错提示“d3dcompiler_47.dll缺失”,这通常意味着你的系统中缺少了这个关键的动态链接库文件,或者游戏无法正确找到它。d3dcompiler_47.dll是DirectX的一部分,它支持Direct3D编译器,对于游戏的图形渲染至关重要。以下是一些......
  • R语言报错:Error in as.double(y) : cannot coerce type 'S4' to vector of type 'd
    在RStudio中使用plot函数报错:查询解决方案是缺少Rgraphviz包,执行以下代码:source("http://bioconductor.org/biocLite.R")biocLite(c("graph","Rgraphviz")) 又提示 于是添加 plot使用成功 ......