朱丽叶

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

vue3 + xlsx + xlsx-style 导出excel

安装 file-saver、xlsx、xlsx-style

// 注意安装的版本
"file-saver": "^2.0.5",
"xlsx": "^0.17.0",
"xlsx-style": "^0.8.13"

npm i xlsx@0.17.0 -S
npm i xlsx-style@0.8.13 -S 
npm i file-saver -S

配置vue.config.js

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  configureWebpack: {
    // 添加配置项
    externals: {
      './cptable': 'var cptable'
    },
    resolve: { fallback: { fs: false } }
  }
})

导出excel表格

import { ElMessageBox } from 'element-plus'
import XLSX from "xlsx";
import XLSXS from 'xlsx-style'
import FileSaver from 'file-saver'

// 导出的数据
const tableData = [
  {
    date: '2016-05-03',
    name: 'Tom',
    address: '123',
  },
  {
    date: '2016-05-02',
    name: 'Tom',
    address: '456',
  },
  {
    date: '2016-05-04',
    name: 'Tom',
    address: '789',
  },
  {
    date: '2016-05-01',
    name: 'Tom',
    address: '147',
  },
  {
    date: '2016-05-08',
    name: 'Tom',
    address: '258',
  },
  {
    date: '2016-05-06',
    name: 'Tom',
    address: '369',
  },
  {
    date: '2016-05-07',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  }
]

// 提示是否导出
const exportAllFile = () => {
  ElMessageBox.confirm(
    '是否确认导出全部数据?',
    '警告',
    {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      type: 'warning',
    }
  )
    .then(() => {
      exportList(tableData)
    })
}

// 正式导出excel的方法
const exportList = (arr) => {
  let table = [
    // 表格表头
    ['幼儿园课表', null, null, null],
    ["序号", '时间', '姓名', "地址"]
  ]
  arr.forEach((item, index) => {
    let rowData = []
    //导出内容的字段
    rowData = [
      index + 1,
      item.date,
      item.name,
      item.address,
    ]
    table.push(rowData)
  })

  let bookNew = XLSX.utils.book_new();
  let workSheet = XLSX.utils.aoa_to_sheet(table);
  XLSX.utils.book_append_sheet(bookNew, workSheet, '作品名称') // 设置工作簿名称



  // 设置标题行单元格合并
  // s即start, e即end, r即row, c即column
  // 合并从--0行0列开始,到0行3列
  workSheet['!merges'] = [
    { s: { r: 0, c: 0 }, e: { r: 0, c: 3 } },
    { s: { r: 7, c: 1 }, e: { r: 8, c: 2 } },
  ]
  // 调用 设置表格样式的方法
  setExlStyle(workSheet)

  // 设置单元格宽度
  workSheet['!cols'] = [
  	{ wpx: 80}, 
  	{ wpx: 100},
  	{ wpx: 180},
  	{ wpx: 400}
  ]

  // 导出Excel, 注意这里用到的是XLSXS对象
  let wbout = XLSXS.write(bookNew, {
    bookType: 'xlsx',
    bookSST: false,
    type: 'binary',
  })

  FileSaver.saveAs(
    new Blob([s2ab(wbout)], {
      type: 'application/octet-stream'
    }),
    '全部人员.xlsx' // 保存的文件名
  )

  // 使用xlsx 方式直接导出excel
  // let workSheet = XLSX.utils.aoa_to_sheet(table);
  // let bookNew = XLSX.utils.book_new();
  // XLSX.utils.book_append_sheet(bookNew, workSheet, '作品名称') // 设置工作簿名称
  // XLSX.writeFile(bookNew, '全部人员.xlsx')   // 保存的文件名
}

// 工具方法
function s2ab(s) {
  var buf = new ArrayBuffer(s.length)
  var view = new Uint8Array(buf)
  for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff
  return buf
}

// 设置表格的样式
const setExlStyle = (data) => {
  //单元格外侧框线
  let borderAll = {
    top: {
      style: "thin",
    },
    bottom: {
      style: "thin",
    },
    left: {
      style: "thin",
    },
    right: {
      style: "thin",
    },
    diagonal: {
      style: "thin",
      color: "red"
    },
  };
 
  for (let key in data) {
    // 判断是否为excel表头
    if (key === 'A1') {
      data[key].s = {
        font: {
          name: '宋体', //字体类型
          sz: 20, //字体大小
          color: { rgb: 'ff0000' }, //字体颜色
          bold: true, //是否加粗
        },
        fill: {
          patternType: 'solid',     // 默认 solid,设为 none 时,fgColor 失效
          bgColor: {                // 无效
            rgb: "0000FF",
          },
          fgColor: {        // 背景色
            theme: "2",
            tint: "-0.25"
          }
        },

      }
      continue;
    }
    
    if (data[key] instanceof Object) {
      data[key].s = {
        // 边框
        border: borderAll,
        // 对齐方式相关样式
        alignment: {
          vertical: 'center', //垂直对齐方式
          horizontal: 'center', //水平对齐方式
          // wrapText: true,  //自动换行
        },
        //字体相关样式
        font: {
          name: '宋体', //字体类型
          sz: 20, //字体大小
          color: { rgb: '' }, //字体颜色
          bold: false, //是否加粗
        },
        //背景相关样式
        
        bold: true,
        numFmt: 0,
      };
    }
  }
    
  return data;
}

posted on   朱丽叶  阅读(1659)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示