首页 > 其他分享 >vue项目通过xlsx-js-style导出数据为EXCEL

vue项目通过xlsx-js-style导出数据为EXCEL

时间:2022-09-29 16:45:00浏览次数:48  
标签:xlsx style vue const let key push obj cellValue

排除工具

xlsx(sheet.js): 缺点:社区版无法自定义格式,需要购买pro版本 xlsx-style: 缺点:代码多年未更新,存在bug,需要改动node_modules包   选用工具

安装xlsx-js-style

npm install xlsx-js-styled

使用思路

设定每个单元格基础格式,遍历所有数据,填入所需要的格式

使用方法

引入

import * as XLSXStyle from "xlsx-js-style";

 设定基础样式

class ConstantCell {
  constructor(obj) {
    this.obj = {
      r: obj.r,
      c: obj.c,
      v: {
        v: obj.v,
        ct: { fa: "General", t: "g" },
        bg: obj.bg || "ffffff",
        bl: obj.bl || 0,
        it: 0,
        fc: obj.fc || "#000",
        ff: 1,
        fs: "11",
        ht: 0,
        vt: 0,
        m: obj.m,
        bold: false
      }
    };
  }
}

获取基础数据

我的数据格式,可以自己设定

pAll = [{data.content:[数据]}]
tables=[{label:'sheet名称',columns:[{label:'列名称',prop:'列字段'}]}]
fileName = '表名称'

将数据改写为EXCEL导出所需格式

function formatData(pAll, tables, fileName) {
  const mapRes = new Map();

  pAll.map((v, i) => {
    let content = [];
    if (v.data) {
      content = v.data.content;
    }
    mapRes.set(tables[i].label, {
      tableData: content,
      columns: tables[i].columns
    });
  });
  const sheetDataArr = [];
  for (let key of mapRes.keys()) {
    const tableList = [];
    const headerList = [];
    const { tableData, columns } = mapRes.get(key);
    let objColIndex = 0;
    //设定表头
    columns.map(({ prop, label }) => {
      objColIndex = objColIndex + 1;
      const  headerConstantCellObj = new ConstantCell({
          r: 0,
          c: objColIndex,
          v: label,
          bg: "f8f8f9",
          m: label,
          bl: 1
        });
      
      headerList.push(headerConstantCellObj.obj);
    });

    tableList.push(headerList);
//设定行
    tableData.map((v, i) => {
      const rowList = [];
      objColIndex = 0;
      columns.map(({ prop, label }) => {
        objColIndex = objColIndex + 1;
        let fc = null;
        const ConstantCellObj = new ConstantCell({
          r: i + 1,
          c: objColIndex,
          v: v[prop],
          bg: "ffffff",
          m: v[prop],
          fc
        });
        rowList.push(ConstantCellObj.obj);
      });
      tableList.push(rowList);
    });
    sheetDataArr.push({ tableList, sheetTitle: key });
  }
  formatExcel(sheetDataArr, fileName);
}    

根据自己所需设置样式:(A1:每个单元格信息)

网上复制的

function formatExcel(sheetDataArr, fileName) {
  const SheetNames = [];
  const Sheets = {};
  sheetDataArr.map(({ tableList, sheetTitle }, sheetDataIndex) => {
    let downOriginData = tableList;
    let arr = []; // 所有的单元格数据组成的二维数组
    let bgConfig = {};
    let percentageReg = /%$/;
    let cellValue = null;
    //列下标 数字转字母

    function chatatABC(n) {
      var orda = "a".charCodeAt(0);
      var ordz = "z".charCodeAt(0);
      var len = ordz - orda + 1;
      var s = "";
      while (n >= 0) {
        s = String.fromCharCode((n % len) + orda) + s;
        n = Math.floor(n / len) - 1;
      }
      return s.toUpperCase();
    }

    // 设置样式
    function setStyle(row, col, cellValue) {
      var colA = chatatABC(col);
      var key = colA + (row + 1);
      bgConfig[key] = cellValue;
      // bgConfig[key] = cellValue.bg.replace(/\#?/, "");
    }

    // 判断值类型是否为百分比 %
    function isPercentage(value) {
      return percentageReg.test(value.m) && value.ct && value.ct.t === "n";
    }

    // 获取二维数组
    for (let row = 0; row < downOriginData.length; row++) {
      let arrRow = [];
      for (let col = 0; col < downOriginData[row].length; col++) {
        cellValue = downOriginData[row][col].v;

        setStyle(row, col, cellValue);
        if (cellValue.ct != null && cellValue.ct.t == "d") {
          //  d为时间格式  2019-01-01   或者2019-01-01 10:10:10
          arrRow.push(new Date(cellValue.m.replace(/\-/g, "/"))); //兼容IE
        } else if (cellValue.m && isPercentage(cellValue)) {
          //百分比问题
          arrRow.push(cellValue.m);
        } else {
          arrRow.push(cellValue.v);
        }
        // }
      }
      arr.push(arrRow);
    }

    let opts = {
      dateNF: "m/d/yy h:mm",
      cellDates: true,
      cellStyles: true
    };
    const wb = XLSXStyle.utils.book_new();
    let ws = XLSXStyle.utils.aoa_to_sheet(arr, opts);
    XLSXStyle.utils.book_append_sheet(wb, ws, "readme demo");
    let reg = /[\u4e00-\u9fa5]/g;
    for (let key in ws) {
      let item = ws[key];
      if (item.t === "d") {
        if (item.w) {
          //时间格式的设置
          let arr = item.w.split(" ");
          if (arr[1] && arr[1] == "0:00") {
            ws[key].z = "m/d/yy";
          } else {
            item.z = "yyyy/m/d h:mm:ss";
          }
        }
      }
      // 设置单元格样式
      if (bgConfig[key]) {
        const { bg, bold, fc } = bgConfig[key];
        ws[key]["s"] = {
          alignment: { vertical: "center", horizontal: "center" },
          fill: {
            bgColor: { indexed: 32 },
            fgColor: { rgb: bg }
          },
          font: { bold, color: { rgb: fc } },
          border: {
            top: { style: "thin", color: { rgb: "999999" } },
            bottom: { style: "thin", color: { rgb: "999999" } },
            left: { style: "thin", color: { rgb: "999999" } },
            right: { style: "thin", color: { rgb: "999999" } }
          }
        };
      }
    }

    //第四步:组装下载数据格式
    SheetNames.push(sheetTitle);
    Sheets[sheetTitle] = Object.assign({}, ws);
  });
  let tmpWB = {
    SheetNames, //保存的表标题
    Sheets
  };

  // 第六步:写入文件
  XLSXStyle.writeFile(tmpWB, fileName + ".xlsx");
} 

最简单的基本功能完成,后续根据需求慢慢完善

标签:xlsx,style,vue,const,let,key,push,obj,cellValue
From: https://www.cnblogs.com/truegrit/p/16739633.html

相关文章

  • 同时启动node和vue项目解决方案
    前言自己写的前端项目是vue做前端页面,node做后端接口,但是每次启动都要分开打两次启动命令,感觉很不智能,于是决定用一个命令让项目同时启动vue和node说干就干。。。技术......
  • vue-admin-template-master下载依赖出错最全简洁解决方法
    vue-admin-template-master下载依赖出错最全简洁解决方法前言我用vscode搭建前端项目的时候,发下载依赖包出错,百度查了很多方法,发现这个方法是可以行的,在此记录下来。原......
  • Style3D招聘:渲染、CAD、物理仿真
    Style3DBase杭州,年薪30~200w,优秀的可谈,实习生也要滴岗位职责1:从事服装布料渲染引擎开发工作岗位要求:1、熟悉计算机图形学;2、精通C/C++编程,有很强的代码阅读、分析和设计能力;3......
  • vue Excel导入,下载Excel模板,导出Excel
    vue Excel导入,下载Excel模板,导出Excel<template><divstyle="display:flex;"><el-button@click="handleDownload"class="button_searc......
  • vue3中element-plus引入ElLoading并修改颜色
    在vue3中引入element-plus的loading跟vue2差别还是有的写法:<scriptsetup>import{ElLoading}from'element-plus'//使用constloading=ref(false)//loading......
  • vue +echarts+ docxtemplater导出word和图表图片
    1.下载插件//--安装docxtemplaternpminstalldocxtemplaterpizzip--save//--安装jszip-utilsnpminstalljszip-utils--save//--安装jszipnpminstallj......
  • Vue2,Vue3,React,vue-cli和Vite创建和启动
    vue2-project创建项目vuecreatexxx名字下依赖包npminstall启动项目npmrunserve项目打包npmrunbuildvue3-project创建项目vuecreatexxx名字下依......
  • Vue 手动配置路由
    不用一键创建项目的方式 手动引用 1.安装路由组件(vue2)npmivue-router@3 2.创建路由映射js创建src/router/index.js//引用Vue和路由组件importVuef......
  • 如何监听Vue或js项目报错的4种方式
    背景onerrorelement.onerrorerrorHandlererrorCapturederror传播规则(划重点)如何监听异步错误总结背景在开发Vue项目时,使用浏览器调试可以比较清晰的看到报的什......
  • vue项目环境搭建
    vue项目环境搭建安装Nodejs环境地址:https://nodejs.org/en/download/安装包管理工具#推荐安装yarnnpminstall--globalyarn#或者安装cnpmnpmconfigsetregis......