XLSX隐藏单元格+设置单元格公式和宽度

前端将表格数据导入excel中,隐藏单元格,设置单元格格式

引入xlsx依赖

import xlsx from 'xlsx'

引入相关方法

import { downLoadExcelAs, strBuffer } from '@/validate.js'

处理表格

  methods: {
	downloadMfgExcel(){
 	  // 想导出的数据
      const data = []
      // 设置excel的名称和sheet名称
      const sheet = 'Sheet1'
      const excelName = 'excel名称'
      const wb = { SheetNames: [sheet], Sheets: {}, Props: {}}
      // 将JS对象数组转换为工作表
      wb.Sheets[sheet] = xlsx.utils.json_to_sheet(data)
      // 这一步必须要
      wb.Sheets[sheet]['!cols'] = []
      // 设置第一列隐藏
      wb.Sheets[sheet]['!cols'][0] = { hidden: true }
      // 根据不同字段设置不同宽度
      // wch可以设置单元格宽度
      labelList.forEach((item, index) => {
        if (item.property === 'q_number') {
          wb.Sheets[sheet]['!cols'][index] = { wch: 30 }
        } else if (item.property === 's_name') {
          wb.Sheets[sheet]['!cols'][index] = { wch: 20 }
        } else if (item.property === 'desc') {
          wb.Sheets[sheet]['!cols'][index] = { wch: 30 }
        } else {
          wb.Sheets[sheet]['!cols'][index] = { wch: 15 }
        }
      })
      for (let i = 2; i < data.length + 2; i++) {
        // 设置单元格的格式和格式
        /*
        t: 单元格数据类型 n:number,s:string
        f: 公式
        z: 格式 '#,##0.00'保留两位小数
        v: 默认值
        */
        // N列 = L列 * (1 + P列)
        wb.Sheets[sheet]['N' + i] = { t: 'n', f: 'L' + i + '*(1+' + 'P' + i + ')', z: '#,##0.00' }
        // O列 = M列 + N列
        wb.Sheets[sheet]['O' + i] = { t: 'n', f: 'M' + i + '+N' + i, z: '#,##0.00' }
        // R列设置成百分比(注:必须使用默认值,不加默认值设置百分比无效)
        wb.Sheets[sheet]['R' + i] = { t: 'n', v: '0', z: '0%' }
      }
      const wopts = {
        // 处理文件类型
        bookType: 'xlsx',
        // Generate Shared String Table
        bookSST: false,
        // Output data encoding
        type: 'binary'
      }
      downLoadExcelAs(new Blob([strBuffer(xlsx.write(wb, wopts))],
        {
          type: 'application/octet-stream'
        }),
      excelName + '.' + wopts.bookType)
   }
 }

js

// 下载excel
export function downLoadExcelAs(obj, fileName) {
  const tamp = document.createElement('a')
  tamp.download = fileName || '下载'
  // 绑定a标签
  tamp.href = URL.createObjectURL(obj)
  // 模拟点击实现下载
  tamp.click()
  // 用URL.revokeObjectURL()来释放这个object URL
  URL.revokeObjectURL(obj)
}

// 字符串转ArrayBuffer
export function strBuffer(s) {
  if (typeof ArrayBuffer !== 'undefined') {
    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
  } else {
    const buf = new Array(s.length)
    for (let i = 0; i !== s.length; ++i) {
      buf[i] = s.charCodeAt(i) & 0xFF
    }
    return buf
  }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值