使用xlsx-style设置多级表头边框,边框显示不完整

// 设置表格样式
setExlStyle(data,rowAndColHWList) {
  Object.keys(data).forEach(key => {
    //设置每个单元格属性
    if (key.indexOf("!") < 0) {
      data[key].s = {
        // 边框
        border: {
          top: {
            style: "thin"
          },
          bottom: {
            style: "thin"
          },
          left: {
            style: "thin"
          },
          right: {
            style: "thin"
          }
        },
      }
    }
  })
  return data;
},

原因:创建的workbook或者worksheet并不会包含合并单元格之后的子单元格

 例如该worksheet中只有A1,没有A2和A3,而缺失的边框正是该两个单元格,所以通过遍历表格单元格的方式设置边框会出现边框缺失的问题。

那么解决办法就显而易见了,只需要加上xlsx没有自动创建的单元格,并且给他们设置上边框即可。

// data 可以传入一个workbook或者worksheet
setExlStyle(data) {
  // 定义好边框样式
  const border = {
    top: {
      style: "thin"
    },
    bottom: {
      style: "thin"
    },
    left: {
      style: "thin"
    },
    right: {
      style: "thin"
    }
  }
  // 字体
  const font = {
    sz: 10,
    // bold: true,
    // color: {  rgb: "FFFFFF" } //白色
  }
  // 居中
  const alignment = {
    horizontal: "center",
    vertical: "center",
    wrapText: true
  }

  // 获取表格的有效范围
  const range = XLSX.utils.decode_range(data['!ref']);
  // cellList:xlsx自动创建的excel单元格,去掉带!开头的就是所有单元格
  const cellList = Object.keys(data).filter(item => item.indexOf('!') < 0)
  
  // 遍历表格
  for(let row = range.s.r; row <= range.e.r; row++){
    for(let col = range.s.c; col <= range.e.c; col++){
      // 通过行列转成excle的单元格索引
      const cell = XLSX.utils.encode_cell({ r:row, c:col });
      // 查找一下单元格是否已经存在,不存在:创建一个单元格并设置边框,存在:直接修改样式
      if(cellList.indexOf(cell) < 0){
        data[cell] = {t:'',v:'',s:{ border,font,alignment } }
      } else {
        data[cell].s = { border,font,alignment }
      }
    }
  }
  return data;
},

通过以上方法即可让所有单元格都加上完整的边框。

其中const range = XLSX.utils.decode_range(data['!ref']);得到的结果是这样的:

 

s:开始,e:结束,r:行,c:列

分别对应start、end、row、column的缩写

const cell = XLSX.utils.encode_cell({ r:row, c:col });传入行和列索引,可以得到该坐标在excel中的单元格索引,例如A1、B3这种。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值