发布时间:2023-05-31 文章分类:WEB开发, 电脑百科 投稿人:李佳 字号: 默认 | | 超大 打印

前言:之前导出的excel都是一个excel中只有一个表格,在这次开发中,要实现的功能是一个项目中有三个表格,而且单元格还要设置不同的样式,遇到了很多问题,特意记录。

内容大纲如下:

目录

一、选择插件

二、创建工作簿对象

三、设置样式

1. 合并单元格

 2. 设置单元格公共样式

3.单元格设置边框

4.设置列宽

5.在单元格中设置斜线


一、选择插件

最开始,我们要根据是否需要自己设置样式选择好插件:

由于我们导出的是excel文件,所以要使用xlsx插件

npm i xlsx

 其次,要对单元格样式进行更改,所以这次使用的是xlsx-style 插件

npm i xlsx-style

准备就绪,将这两个插件引入到js文件中

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

二、创建工作簿对象

1. 创建一个工作簿对象:(table1和table2是表数据,是[['', '', ''], ['', '', ''], ['', '', '']]的格式)

 var wb = XLSX.utils.book_new() // 工作簿对象包含一SheetNames数组,以及一个表对象映射表名称到表对象,XLSX.utils.book_new使用函数创建一个新的工作簿对象
  var ws_name = 'SheetJS' // 给工作表命名
  var workbook = XLSX.utils.aoa_to_sheet(table1) // 定义工作表,并在里边添加第一个表格
  XLSX.utils.sheet_add_aoa(workbook, table2, { origin: 'B1' }) // 向工作表中追加一个表格,并设置从哪个单元格开始
  XLSX.utils.book_append_sheet(wb, workbook, ws_name) // 合成工作簿,向工作簿中添加命名为wa_name的工作表

 这时,我们就可以生成基础的工作簿对象。

工作簿中的工作表对象,这个对象中每个不以!开头的属性,都代表一个单元格。

三、设置样式

1. 合并单元格

工作表中的 !merges字段存储的是合并的单元格,我们可以自定义要合并的单元格,并把它放进去。

// 定义要合并的单元格
var merges = [
    'A20:E21', 'A1:A3', 'B1:R3', 'S1:V3', 'A4:V4', 'A5:E5', 'A13:E13', 'G5:H5', 'G6:G9', 'G10:G13', 'G14:G17', 'G18:G21', 'A6:A7', 'B6:B7', 'C6:D7', 'V6:V7', 'H6:H7', 'I6:I7', 'J6:J7', 'K6:K7', 'L6:L7'
]
// 将要合并的单元格放进工作表中
if (merges.length > 0) {
    if (!workbook['!merges']) workbook['!merges'] = []
    merges.forEach(item => {
      workbook['!merges'].push(XLSX.utils.decode_range(item))
    })
  }

 2. 设置单元格公共样式

单元格的样式都存储在workbook[key].s中,我们可以在设置完公共样式后单独再设置某些单元格的样式。

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' }
    }
  }
// 设置公共样式
if (workbook[key] instanceof Object) {
      workbook[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
      }
    }

3.单元格设置边框

给某个单元格设置边框

if (key === 'A1') {
      workbook[key].s.border = {
        top: {
          style: 'thin',
          color: { rgb: 'FFFFFF' }
        },
        bottom: {
          style: 'double',
          color: { rgb: '3E87C8' }
        },
        left: {
          style: 'thin',
          color: { rgb: 'FFFFFF' }
        },
        right: {
          style: 'thin',
          color: { rgb: 'FFFFFF' }
        }
      }
    }

边框的样式:

thin

vue导出含有多个表的excel,并设置边框、背景色、字体、宽度等
medium

 vue导出含有多个表的excel,并设置边框、背景色、字体、宽度等

thick

vue导出含有多个表的excel,并设置边框、背景色、字体、宽度等
dotted

 vue导出含有多个表的excel,并设置边框、背景色、字体、宽度等
hair

 vue导出含有多个表的excel,并设置边框、背景色、字体、宽度等
dashed

 vue导出含有多个表的excel,并设置边框、背景色、字体、宽度等
mediumDashed

vue导出含有多个表的excel,并设置边框、背景色、字体、宽度等
dashDot

vue导出含有多个表的excel,并设置边框、背景色、字体、宽度等
mediumDashDot

vue导出含有多个表的excel,并设置边框、背景色、字体、宽度等
dashDotDot 

vue导出含有多个表的excel,并设置边框、背景色、字体、宽度等
mediumDashDotDot

 vue导出含有多个表的excel,并设置边框、背景色、字体、宽度等

slantDashDot

vue导出含有多个表的excel,并设置边框、背景色、字体、宽度等
double

 vue导出含有多个表的excel,并设置边框、背景色、字体、宽度等

4.设置列宽

单元格的列宽用的是  !cols  属性,列的顺序是从左向右,从0开始

if (!workbook['!cols']) workbook['!cols'] = []
  for (var i = 0; i <= 21; i++) {
    if (i === 0 || i === 1 || i === 4 || i === 7) {
      workbook['!cols'][i] = { wpx: 60 }
    } else if (i === 2 || i === 3) {
      workbook['!cols'][i] = { wpx: 25 }
    } else {
      workbook['!cols'][i] = { wpx: 50 }
    }
  }

5.在单元格中设置斜线

斜线的方向与斜线的样式必须同时使用,不然没有效果

斜线方向:

diagonalDown:对角线向下方向
diagonalUp: 对角线向上方向

if (key === 'A6') {
      workbook[key].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' }
        },
        diagonalDown: true, // 斜线方向
        diagonal: { // 斜线样式
          color: { rgb: '000000' },
          style: 'thin'
        }
      }
    }