前端excel文件处理,vue2 、file-saver、xlsx, excel文件生成与excel文件链接数据导出

news2024/11/16 11:29:12

1、前端excel文件生成

安装插件

npm install file-saver --save

如使用TS开发,可安装file-saver的TypeScript类型定义

npm install @types/file-saver --save-dev

下载文件流

import { saveAs } from 'file-saver'
/**
 *
 * @param {*} fileStream // 文件流
 * @param {*} saveFileName // 文件下载名称
 * @returns
 */
export const downloadFile = (fileStream, saveFileName = '.xlsx') => {
  return new Promise((resolve, reject) => {
    const blob = new Blob([fileStream])
    // 兼容IE
    if (navigator.msSaveBlob) {
      navigator.msSaveBlob(blob, saveFileName)
    } else {
      const url = window.URL.createObjectURL(blob)
      saveAs(url, saveFileName + '.xlsx')
    }
    resolve()
  })
}
/**
 * @description 方法调用
 */
downloadFile(fileStream, saveFileName).then(res => {
  console.log('下载成功!')
})

本地文件下载

import { saveAs } from 'file-saver'
/**
 *
 * @param {*} localFileUrl 本地地址
 * @param {*} saveFileName 文件名称
 * @returns
 */
export const downloadFile = (localFileUrl, saveFileName) => {
  return new Promise((resolve, reject) => {
    axios({
      url: localFileUrl, // 文件地址
      method: 'get',
      responseType: 'blob'
    })
      .then(res => {
        const blob = new Blob([res.data])
        if (navigator.msSaveBlob) {
          navigator.msSaveBlob(blob, saveFileName)
        } else {
          const url = window.URL.createObjectURL(blob)
          saveAs(url, saveFileName)
        }
        resolve()
      })
      .catch(err => {
        if (err.message === 'Request failed with status code 404') {
          // 未找到相关文件
        } else {
          // 下载失败
        }
        reject(err)
      })
  })
}

/**
 * @description 方法调用
 */
downloadFile(localFileUrl, saveFileName).then(res => {
  console.log('下载成功!')
})

文件下载(列宽自适应)

import fs from 'file-saver'
import XLSX from 'xlsx'
export function xlsxGenerate(json, fields, filename = '.xlsx') {
  json.forEach(item => {
    for (let i in item) {
      if (fields.hasOwnProperty(i)) {
        item[fields[i]] = item[i]
      }
      delete item[i]
    }
  })
  let sheetName = filename
  let wb = XLSX.utils.book_new()
  let ws = XLSX.utils.json_to_sheet(json, {
    header: Object.values(fields)
  })
  const defaultCellStyle = {
    font: {
      name: 'Verdana',
      sz: 16,
      color: 'FF00FF88'
    },
    alignment: {
      horizontal: 'center',
      vertical: 'center'
    },
    fill: {
      fgColor: {
        rgb: 'FFFFAA00'
      }
    }
  }
  let headsArr = Object.values(fields)
  const headsWidth = headsArr.map(value => {
    if (/.*[\u4e00-\u9fa5]+.*$/.test(value)) {
      return parseFloat(value.toString().length * 2.1)
    } else {
      return parseFloat(value.toString().length * 1.1)
    }
  })
  // console.log("所有表头的宽度:", headsWidth);
  // 2.所有表体值的宽度
  json.unshift(fields)
  const rowsWidth = json.map(item => {
    const maxValue = Object.values(item).map((value, index) => {
      let valueWidth
      if (/.*[\u4e00-\u9fa5]+.*$/.test(value)) {
        valueWidth = parseFloat(value.toString().length * 2.1)
      } else {
        valueWidth = parseFloat(value.toString().length * 1.1)
      }
      return Math.max(valueWidth, headsWidth[index])
    })
    return maxValue
  })
  // console.log("每行数据对比出的最大宽度:", rowsWidth)
  // 3.对比每列最大值
  let aotuWidth = []
  rowsWidth.map((row, index) => {
    let maxWidth = []
    row.map((value, i) => {
      if (index === 0) {
        maxWidth.push({
          wch: value
        })
      } else {
        maxWidth.push({
          wch: Math.max(value, aotuWidth[i].wch)
        })
      }
    })
    aotuWidth = maxWidth
  })
  // ws["!rows"] // 杭高
  ws['!cols'] = aotuWidth // 列宽

  wb.SheetNames.push(sheetName)
  wb.Sheets[sheetName] = ws
  let wopts = {
    bookType: 'xlsx',
    bookSST: false,
    type: 'binary',
    cellStyles: true,
    defaultCellStyle: defaultCellStyle,
    showGridLines: false
  }
  let wbout = XLSX.write(wb, wopts)
  let blob = new Blob([s2ab(wbout)], {
    type: 'application/octet-stream'
  })
  fs.saveAs(blob, filename + '.xlsx')
}
/**
 * 数据下载
 * @param {*} header 表头
 * @param {*} tableData 数据
 */
dataDownload() {
  let headerArr = ['Name', 'Age', 'Address']
  let header = {
    title0: 'Name',
    title1: 'Age',
    title2: 'Address'
  }
  let tableData = [
    {
      Name: '喜洋洋',
      Age: '108',
      Address: '青青草原-羊村-2幢'
    },
    {
      Name: '美羊羊',
      Age: '108',
      Address: '青青草原-羊村-1幢'
    }
  ]
  let tableDataList = []
  tableData.forEach((item, index) => {
    let obj = {}
    for (let i = 0; i < headerArr.length; i++) {
      if (i === 0) {
        obj['title0'] = item.Name
      } else if (i === 1) {
        obj['title1'] = item.Age
      } else if (i === 2) {
        obj['title2'] = item.Address
      }
    }
    tableDataList.push(obj)
  })
  xlsxGenerate(tableDataList, header, '羊村登记表')
}

在这里插入图片描述表格显示,每列列宽自适应

xlsx文件链接数据导出

import fs from 'file-saver'
import XLSX from 'xlsx'
export function readWorkbookFromRemoteFile(url, callback) {
  var xhr = new XMLHttpRequest()
  xhr.open('get', url, true)
  xhr.responseType = 'arraybuffer'
  xhr.onload = function(e) {
    if (xhr.status == 200) {
      var tableData = new Uint8Array(xhr.response)
      var workbook = XLSX.read(tableData, { type: 'array' }) // 该方法接收一个二进制的数据,和数据的类型,返回解析完成后的对象
      if (callback) callback(workbook)
    }
  }
  xhr.send()
}
export function readWorkbook(workbook) {
  let sheetNames = workbook.SheetNames // 工作表名称集合
  let worksheet = workbook.Sheets[sheetNames[0]] // 这里我们只读取第一张sheet
  let csv = XLSX.utils.sheet_to_csv(worksheet)
  return csv2table(csv)
}
// 将csv转换成简单的表格,会忽略单元格合并,在第一行和第一列追加类似excel的索引
export function csv2table(csv) {
  let arrs = []
  let rows = csv.split('\n')
  let first_rows = rows.shift().split(',') // 第一行没用的
  rows.pop() // 最后一行没用的
  rows.forEach(function(row, idx) {
    let columns = row.split(',')
    let obj = {}
    columns.forEach(function(col, idx) {
      obj[first_rows[idx]] = col
    })
    arrs.push(obj)
  })
  return { first_rows, arrs }
}

方法调用

let urlNew = url.replace(/http:/, 'https:') // url xlsx文件链接,转https
readWorkbookFromRemoteFile(
  urlNew,
  workbook => {
    let param = readWorkbook(workbook)
    param.arrs // 表格数据
    param.first_rows // 表头
  }
)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/695623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue+leaflet地图实现根据省份区域划分颜色渐变图

效果图 实现代码如下 let separatedColors [rgb(255, 153, 209)];// 离散颜色&#xff0c;如效果图上的粉色 let maxVal 300000;// 定义一个最大值 data.forEach((item) > {for (let i 10; i > 0; i--) {if (item.us_year < maxVal * i) {item.opacity i / 10;}…

ThinkPHP-Shop2020版本的商城CMS前端SQL注入

0x01、漏洞名描述 ThinkPHP-Shop2020版本的商城CMS前端SQL注入 0x02、fofa "ThinkPHP-Shop"0x03、POC http://x.x.x.x//mobile/index/index2/id/1* 0x04、漏洞复现

数字孪生和 GIS 结合能够为智慧社区带来怎样的改变?

数字孪生和地理信息系统&#xff08;GIS&#xff09;是当今智慧社区发展中的两个重要技术&#xff0c;它们的结合将为智慧社区带来根本性的改变和巨大的发展机遇。这种结合将深刻影响社区的规划、建设、运营和管理&#xff0c;为居民创造更智能、便利、宜居的生活环境。 首先&…

Windows 10 使用Docker记录

1. 下载Docker Desktop Installer&#xff0c;按照步骤安装。 2. 安装位置只能在系统盘&#xff0c;镜像存储位置可更改&#xff0c;如下图&#xff0c;在设置中。 3. 启动桌面后会有提示&#xff0c;打开终端(cmd)&#xff0c;输入 wsl -upgrade可解决。 4. 拉取仓库中的镜像…

【C++学习】类和对象 | 拷贝构造 | 探索拷贝构造函数为什么需要引用传参 | 深拷贝 | 初识运算符重载

写在前面&#xff1a; 上一篇文章我们开始学习类内的默认成员函数&#xff0c; 这里是传送门&#xff0c;有兴趣可以去看看&#xff1a;http://t.csdn.cn/iXdpH 这篇文章我们继续来学习类和对象的知识。 目录 写在前面&#xff1a; 1. 拷贝构造 2. 拷贝构造函数为什么需…

线性回归算法实现

回归算法是一种有监督算法。 回归算法是一种比较常用的机器学习算法&#xff0c;用来建立“解释”变量(自变量X)和观 测值(因变量Y)之间的关系&#xff1b;从机器学习的角度来讲&#xff0c;用于构建一个算法模型(函 数)来做属性(X)与标签(Y)之间的映射关系&#xff0c;在算法的…

Search space set group switching(二)

R17规定UE可以根据DCI 0_2/0_1/1_1/1_2 的PDCCH monitoring adaptation field 结合具体的配置&#xff0c;对Type3-PDCCH CSS sets 或 USS sets 的acitve DL BWP进行skipping PDCCH monitoring或search space set group switch(包括2个SSSG或3个SSSG的switching)的操作。3个SSS…

腾讯云轻量应用服务器便宜是不是性能差?

腾讯云轻量应用服务器便宜&#xff1f;大揭秘&#xff01;为什么便宜&#xff1f;因为限制月流量&#xff0c;虽然公网带宽看似很大&#xff0c;有月流量限制&#xff0c;但是也不得不说&#xff0c;轻量应用服务器性价比确实高&#xff0c;大家估算下自身应用&#xff0c;如果…

打包apk时出现Execution failed for task ‘:app:lintVitalRelease

程序可以正常运行&#xff0c;但是打包apk的时候报Execution failed for task ‘:app:lintVitalRelease导致打包失败&#xff0c;原因是执行lintVitalRelease失败了&#xff0c;存在错误。解决办法&#xff1a;在app模块的build.gradle的Android里面添加如下代码&#xff1a; l…

如何在linux上查看显卡型号

使用命令lspci | grep VGA 在我的主机上得到如下信息: 08:00.0 VGA compatible controller: NVIDIA Corporation Device 2504 (rev a1)发现我的显卡型号是2504&#xff0c;这和我们印象中的显卡型号如1080Ti之类的不一样&#xff0c;看起来不像真正的型号。我们需在pci这个网…

火爆全网,Python自动化测试-openpyxl操作测试(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 当做自动化测试时…

{“errMsg“:“setTabBarBadge:fail not TabBar page“}

问题描述&#xff1a;想要在详情页添加商品到购物车后&#xff0c;同时更新tabBar页面的购物袋徽标。于是直接在goods-detail页面使用以下代码后&#xff0c;发现报错&#xff1a; uni.setTabBarBadge({index: 3,text: this.goodsCount}) 错误信息&#xff1a;{"errMsg&q…

python爬虫-逆向实例小记-3

注意&#xff01;&#xff01;&#xff01;&#xff01;某数据网站逆向实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01;&#xff01; 案例分析 第一步&#xff1a;分析页面。查看响应内容&#xff0c;内容加密 第二步&am…

案例研究|小牛电动通过DataEase进行业务数据可视化分析

小牛电动&#xff08;Niu Technologies&#xff09;创立于2014年&#xff0c;是全球智能城市出行解决方案提供商。小牛电动的产品线包括电动自行车、电动摩托车、电动滑板车等。小牛电动在销售渠道上采用了线上线下相结合的模式&#xff0c;通过线上电商平台和线下门店销售&…

HP惠普暗影精灵6 OMEN笔记本电脑-15-en0007ax原厂Win10系统镜像,原装OEM系统,恢复出厂状态

HP惠普暗影精灵6笔记本电脑&#xff0c;OMEN 笔记本电脑-15-en0007ax原装出厂Win10系统&#xff0c;恢复原厂系统 15-en0005ax 、15-en0006ax 、15-en0007ax、 15-en0030ax、 15-en0031ax、 15-en0032ax 、15-en0033ax、 15-en0034ax、 15-en0035ax、 15-en0043ax 系统自带所…

树形控件父节点不选中,只能选中子节点,如何实现?

rTree 树形控件一级菜单没有复选框&#xff0c;子菜单有复选框&#xff0c;如何实现&#xff1f;_阿 尭的博客-CSDN博客 接上一篇博客&#xff0c;继续深入功能&#xff0c;如何只选中叶子节点而不选中父节点。 1.在节点被点击时的回调&#xff0c;node-click中&#xff0c;返…

Layui时间范围选择器,添加快捷键【本周、本月、本季度、本年】

界面 <input id"Date_select" type"text" class"form-control" placeholder"请选择时间范围" style"border-radius: 4px;" /><input id"StartDate" type"hidden" /><input id"EndD…

Qt动态多级导航菜单(三)

前文链接&#xff1a;Qt动态多级导航菜单&#xff08;二&#xff09; 本次更新&#xff0c;主要将原导航项NavItem抽象为基类NavItemBase, 并派生出带有图标样式的动态多级导航菜单。至此&#xff0c;关于想要增加自定义的导航菜单样式&#xff0c;只需要从NavItemBase类派生即…

【Windows系统优化篇】谨慎开启“来自微软输入法的启用建议“功能

【Windows系统优化篇】谨慎开启"来自微软输入法的启用建议"功能 出于个人隐私数据的保护&#xff0c;不建议开启这玩意&#xff0c;容易造成个人隐私数据泄露。—【蘇小沐】 1.实验环境 系统版本Windows 11 专业工作站版22H2&#xff08;22621.1928&#xff09;&a…

为什么扩散模型能如此迅速地取代 GAN?看完这篇文章你就懂了

在人工智能领域&#xff0c;文本生成和图像生成一直是备受关注的领域。GAN (Generative Adversarial Networks) 技术作为当前最流行的生成模型之一&#xff0c;在这个领域内占据了重要地位。但是&#xff0c;随着技术的不断发展和应用&#xff0c;它的局限性也逐渐显露出来。而…