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

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])// 兼容IEif (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 = filenamelet 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 valueWidthif (/.*[\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] = wslet 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]] // 这里我们只读取第一张sheetlet 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.hqwc.cn/news/549.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

No CMAKE_Swift_COMPILER could be found问题解决

编译OpenCV的IOS平台包,出错: CMake Error at CMakeLists.txt:20 (enable_language): No CMAKE_Swift_COMPILER could be found. 出错定位,原因是启用Swift语言时没有找到CMAKE_Swift_COMPILER变量 CMAKE官方文档说明启用Swift语言方法 cmake 3.15开始支持swift 查找swift …

数据库监控与调优【十三】—— LIMIT语句优化

LIMIT语句优化 LIMIT语句使用规则 limit<offset>, <size> offset&#xff1a;返回结果第一行的偏移量&#xff08;想要跳过多少行&#xff09;size&#xff1a;指定返回多少条 举例说明 -- 查询第1页时&#xff0c;花费92ms SELECT * FROM employees LIMIT 0,…

【容灾系统搭建】网络杂谈(1)之容灾系统如何搭建?

涉及知识点 什么是容灾&#xff0c;容灾系统的建设&#xff0c;容灾系统的结构模型&#xff0c;容灾平台。深入了解容灾技术。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可去其主页关注下哈&#xff0c;不胜感激 文章目录 涉及知识点前言1.容灾系统…

ElasticSearch的核心概念简单描述

我正在参加「掘金启航计划」 ES核心概念 ES是面向文档,下面表格是和关系型数据库的对比,一切都是JSON 关系数据库(Mysql)ES数据库(database)索引(indices) 和数据库一样表(tables)types 慢慢会被弃用 7.0已经过时 8.0会彻底废弃行(rows)documents (数据)文档字段(columns)fi…

Navicat连接oracle

1、官网下载oracle instant client客户端&#xff08;版本自选&#xff09; Oracle Instant Client Downloads 下载后解压 2、navicat配置 在工具-> 选项 -> OCI 或环境中&#xff0c;选择在步骤 1 解压目录的 oci.dll 3、重新启动 Navicat 4、配置oracle连接即可 参考…

别再分库分表了,试试TiDB!

什么是NewSQL 传统SQL的问题 升级服务器硬件 数据分片 NoSQL 的问题 优点 缺点 NewSQL 特性 NewSQL 的主要特性 三种SQL的对比 TiDB怎么来的 TiDB社区版和企业版 TIDB核心特性 水平弹性扩展 分布式事务支持 金融级高可用 实时 HTAP 云原生的分布式数据库 高度兼…

工程安全监测无线振弦采集仪在建筑物的应用分析

工程安全监测无线振弦采集仪在建筑物的应用 工程安全监测无线振弦采集仪是一种在建筑物中应用的重要设备。它通过无线采集建筑物内部的振动信息&#xff0c;对建筑物的安全性进行监测和评估&#xff0c;为建筑物的施工和使用提供了可靠的技术支持。本文将详细介绍工程安全监测…

【GESP】2023年06月图形化一级 -- 去旅行

文章目录 去旅行1. 准备工作2. 功能实现3. 设计思路与实现&#xff08;1&#xff09;角色、舞台背景设置a. 角色设置b. 舞台背景设置 &#xff08;2&#xff09;脚本编写a. 角色&#xff1a;Avery Walking 4. 评分标准 去旅行 1. 准备工作 &#xff08;1&#xff09;删除默认小…

golang,OpenGL,计算机图形学(三)

代码仓库 https://github.com/phprao/go-graphic 颜色 光源照射到物体上&#xff0c;一部分颜色被吸收&#xff0c;另一部分无法吸收的被反射到人眼&#xff0c;于是呈现出了颜色。 当我们把光源的颜色与物体的颜色值相乘&#xff08;而不是点乘&#xff09;&#xff0c;所…

同城跑腿独立版小程序 码科跑腿小程序 支持用户端 骑手端

是独立版哦&#xff0c;不是微擎的 搭建有点复杂&#xff0c;只要一步错就会导致骑手端来单没有声音提示. 多的也不介绍了&#xff0c;不知道的朋友可以百度一下码科跑腿就知道了&#xff01;

大数据的金融数据读取及分析(-)

由于考虑商业数据问题&#xff0c;我们用开源数据做演示 一.tushare开源数据 Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工到数据存储的过程&#xff0c;能够为金融分析人员提供快速、整洁、和多样的便于分析的数据&#x…

Tomcat与Undertow容器性能对比分析

&#x1f468;‍&#x1f393;作者&#xff1a;bug菌 ✏️博客&#xff1a; CSDN、 掘金、 infoQ、 51CTO等 &#x1f389;简介&#xff1a;CSDN博客专家&#xff0c;C站历届博客之星Top50&#xff0c;掘金/InfoQ/51CTO等社区优质创作者&#xff0c;全网合计8w粉&#xff0c;对…