vue中上传、下载xlsx文件方法
1.xlsx依赖引入
npm install xlsx --save
2.downloadExcel模板下载(参数:file_Name、file_List)
var XLSX = require('xlsx');
// const sheetName = '模板';
// const file_Name = '模板.xlsx';
// const json = this.templateData;
const fileName = file_Name;
const json = file_List;
const type = 'xlsx';
// 导出到excel
let keyMap = []; // 获取键
for (let k in json[0]) {
if (json[0].hasOwnProperty(k)) {
keyMap.push(k)
}
}
let tmpdata = []; // 用来保存转换好的json
json.map((v, i) => keyMap.map((k, j) => Object.assign({}, {
v: v[k] || '',
position: (j > 25 ? this.getCharCol(j) : String.fromCharCode(65 + j)) + (i + 1)
}))).reduce((prev, next) => prev.concat(next)).forEach(function (v) {
tmpdata[v.position] = {
v: v.v
}
})
console.log("tmpdata");
console.log(tmpdata);
let outputPos = Object.keys(tmpdata); // 设置区域,比如表格从A1到F3
let tmpWB = {
SheetNames: ['sheet'], // 保存的表标题
Sheets: {
'sheet': Object.assign({},
tmpdata, // 内容
{
'!ref': outputPos[0] + ':' + outputPos[outputPos.length - 1] // 设置填充区域
})
}
};
let blob = new Blob([this.sTbuff(XLSX.write(tmpWB,
{ bookType: (type || 'xlsx'), bookSST: false, type: 'binary' } // 这里的数据是用来定义导出的格式类型
))], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
}); // 创建二进制对象写入转换好的字节流
var link = document.createElement('a');
document.body.appendChild(link);
link.href = window.URL.createObjectURL(blob);
link.download = fileName; //下载的文件名,带格式
link.click();
//释放内存
// window.URL.revokeObjectURL(link.href);
window.URL.revokeObjectURL(link.href, 100); // 延时释放
document.body.removeChild(link);
sTbuff字符串转字符流(str参数:string)
// 字符串转字符流
var buff = new ArrayBuffer(str.length)
var view = new Uint8Array(buff)
for (var i = 0; i !== str.length; ++i) {
view[i] = str.charCodeAt(i) & 0xFF
}
return buff
getCharCol将指定自然数转换为26进制表示(n参数:number) 映射关系[0-25] —> [A-Z]
let s = '';
let m = 0;
while (n > 0) {
m = n % 26 + 1;
s = String.fromCharCode(64 + m) + s;
n = (n - m) / 26;
}
return s
3.importFile导入excel
// 导入excel
this.fullscreenLoading = true;
let files = this.__getVueIns('1579073713062').$refs._op_formUpload_upload.uploadFiles;
if (!files) {
this.fullscreenLoading = false;
return;
}
var file = files[0];
const types = file.name.split('.');
const type = types[types.length - 1];
const fileType = ['xlsx', 'xls', 'XLSX', 'XLS'].some(item => item == type);
if (!fileType) {
this.$message.error('格式错误,请重新上传文件!');
return;
}
this.readFile(file).then((res)=>{
let list = res[0];
console.log('list',list);
if (list.length <= 1) {
this.$notify({
title: '文件内容格式不对或不能为空!',
type: 'error'
});
return;
}
let appBody = [];
for (let i in list) {
if (i == 0) {
continue;
}
let data = {
staffNo: list[i][0],
merchantNo: list[i][2],
operation: list[i][4]
}
appBody.push(data);
}
});
readFile文件读取(参数:file)
var XLSX = require('xlsx');
const result = [];
return new Promise((resolve) =>{
const reader = new FileReader();
reader.onload = function(e) {
const data = e.target.result;
const wb = XLSX.read(data, {
type: 'binary'
});
wb.SheetNames.forEach((sheetName) => {
result.push(
XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], {header:1,defval:''})
/* {
sheet: XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], {header:1,defval:''})
} */
)
});
console.log('result',result);
resolve(result)
};
reader.readAsBinaryString(file.raw)
})
4.exportExcel模板下载(参数:data、columns、fileName)带样式
安装插件:npm install xlsx-style
修改源码文件:.\node_modules\xlsx-style\dist\cpexcel.js
将:var cpt = require('./cpt' + 'able');修改成:var cpt = cptable;
var XLSX = require('xlsx');
var XLSXStyle = require('xlsx-style');
const type = 'xlsx';
let xlsxParam = { raw: true }
//定义表格样式
const styleAmount = {
alignment: { vertical: "center", horizontal: "right" },
numFmt: '#,##0.00'
}
const styleDate = {
alignment: { vertical: "center", horizontal: "right" },
numFmt: 'yyyy/m/d'
}
//格式化数据
const newData = this.formatData(data, columns);
//创建工作簿
const wb = XLSX.utils.book_new();
//创建工作表
const ws = XLSX.utils.json_to_sheet(newData, xlsxParam);
//设置列宽,wpx字段存储像素宽度,wch存储字符宽度,MDW字段存储最大数字宽度。
const colWidth = columns.map(column => ({ wch: column.cn_name.length * 3 + 2 }));
ws['!cols'] = colWidth;
//设置表格样式
for (let i = 1; i <= data.length; i++) {
for (let j = 0; j < columns.length; j++) {
const cell = ws[XLSX.utils.encode_cell({ r: i, c: j })]
if (cell && cell.v === null) {
cell.t = 's';
cell.v = '';
} else if (cell && cell.v !== null && columns[j].control_type === 'TEXT_WITH_AMOUNT') {
cell.t = 'n';
cell.s = styleAmount;
} else if (cell && cell.v !== null && columns[j].control_type === 'DATEBOX') {
cell.t = 'd';
cell.s = styleDate;
}
}
}
console.log('ws2', ws);
//将工作表添加到工作簿
console.log('XLSX', XLSX);
console.log('XLSXStyle', XLSXStyle);
XLSX.utils.book_append_sheet(wb, ws, fileName);
//导出表格
let blob = new Blob([this.sTbuff(XLSXStyle.write(wb,
{ bookType: (type || 'xlsx'), bookSST: false, type: 'binary' } // 这里的数据是用来定义导出的格式类型
))], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
}); // 创建二进制对象写入转换好的字节流
var link = document.createElement('a');
document.body.appendChild(link);
link.href = window.URL.createObjectURL(blob);
link.download = fileName; //下载的文件名,带格式
link.click();
//释放内存
window.URL.revokeObjectURL(link.href, 100); // 延时释放
document.body.removeChild(link);
formatData表格数据格式化(参数:data、columns)
const newData = []
//遍历数据
data.forEach(item => {
const obj = {}
//遍历列名
columns.forEach(column => {
obj[column.cn_name] = item[column.en_name]
})
newData.push(obj)
})
return newData
"columns": [{
"cn_name": "编号",
"en_name": "no",
"control_type": "TEXT"
}, {
"cn_name": "金额",
"en_name": "amount",
"control_type": "TEXT_WITH_AMOUNT"
}, {
"cn_name": "日期",
"en_name": "date",
"control_type": "DATEBOX"
}, {
"cn_name": "名称",
"en_name": "name",
"control_type": "TEXT"
}]
//下拉框取值
let fileName = this.options.find(item => item.tableENName === this.tableENName).tableCNName;
let fileName = this.options.find(item => item.value === this.tableCNName).label;
5.压缩下载的Excel文件,注意:压缩之后各种格式都没了
// 导出表格
const XLSX = require('xlsx');
const XLSXStyle = require('xlsx-style');
const JSZip = require('jszip');
const FileSaver = require('file-saver'); // 格式化数据
const newData = this.formatData(data, columns);
// 创建工作簿
const wb = XLSX.utils.book_new();
// 创建工作表
const ws = XLSX.utils.json_to_sheet(newData); // 将工作表添加到工作簿
XLSX.utils.book_append_sheet(wb, ws, fileName.substring(0, 30));
// 生成.xlsx文件的二进制数据
const excelData = XLSX.write(wb, { type: 'array', bookType: 'xlsx' });
// 创建一个新的JSZip实例
const zip = new JSZip();
// 将.xlsx文件添加到ZIP文件中,并设置文件名称
zip.file(fileName + '.xlsx', excelData, { binary: true }); // 生成zip文件
zip.generateAsync({
type: 'blob',
compression: 'DEFLATE', // STORE: 默认不压缩,DEFLATE:需要压缩
compressionOptions: {
level: 1 // 压缩等级 1~9 1:压缩速度最快,9:最优压缩方式
}
}).then((compressedData) => {
FileSaver.saveAs(compressedData, fileName + '.zip'); // 使用FileSaver.saveAs保存文件,文件名可自定义
});
6.前端Vue下载后端传输过来Excel文件的二进制流数据
const byteCharacters = atob(res.obj.result);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const arrayBuffer = new Uint8Array(byteNumbers);
// // 将二进制流转换为ArrayBuffer
// const arrayBuffer = new Uint8Array(res.obj.result).buffer;
// 通过ArrayBuffer创建一个Blob对象
const blob = new Blob([arrayBuffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
// 创建一个文件名
const fileName = name + '.xlsx';
// 创建一个虚拟链接
const url = window.URL.createObjectURL(blob);
// 创建一个<a>标签并设置下载属性
const link = document.createElement('a');
link.href = url;
link.download = fileName;
// 模拟点击下载链接,触发下载
link.click();
// 释放虚拟链接
window.URL.revokeObjectURL(link.href, 100); // 延时释放
参考:https://www.cnblogs.com/J-Luck/p/15066768.html、https://blog.csdn.net/sumimg/article/details/124927392
vue中上传、下载xlsx文件方法的更多相关文章
- 在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹)
在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹) 1 列出所有需要copy的sh文件 -bash-4.1$ ll /mysqllog/osw/*.sh ...
- VB中上传下载文件到SQL数据库
VB中上传下载文件到SQL数据库 编写人:左丘文 2015-4-11 近期在修改一个VB编写的系统时,想给画面增加一个上传文件到数据库,并可以下载查看的功能,今天在这里,我想与大家一起分享代码,在此做 ...
- Xshell5下利用sftp上传下载传输文件
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp 与 ftp 有着几乎一样的语法和功能.SFTP 为 SSH ...
- SpringMVC文件上传下载(单文件、多文件)
前言 大家好,我是bigsai,今天我们学习Springmvc的文件上传下载. 文件上传和下载是互联网web应用非常重要的组成部分,它是信息交互传输的重要渠道之一.你可能经常在网页上传下载文件,你可能 ...
- 下载Xml文件方法
#region 下载Xml文件方法 //定义委托 private delegate void DownLoadDelegate(string url, string filename); privat ...
- (转)GitHub上想下载单个文件方法
找到该文件,单机raw,如下图: 然后会在网页打开该文件,复制URL,下载即可(如果是不可预览文件,会自动下载). 转自: GitHub上想下载单个文件方法 - Smallcaff的博客 - CSDN ...
- vue中上传文件之multipart/form-data
首先在项目里用了拦截器的,由于拦截器会将传递的参数转成对象,所以你i提交的时候会发现multipart/form-data或转变成application/json 其次关于input的文件上传是需要一 ...
- 使用ftp软件上传下载php文件时换行丢失bug
正 文: 在使用ftp软件上传下载php源文件时,我们偶尔会发现在本地windows下notepad++编辑器写好的php文件,在使用ftp上传到linux服务器后,php文件的换行符全部丢失了, ...
- java 通过sftp服务器上传下载删除文件
最近做了一个sftp服务器文件下载的功能,mark一下: 首先是一个SftpClientUtil 类,封装了对sftp服务器文件上传.下载.删除的方法 import java.io.File; imp ...
- 使用ftp软件上传下载php文件时换行丢失bug(全部变为一行)
文章来源:http://www.piaoyi.org/computer/ftp-php-r-n-bug.html 正 文: 在使用ftp软件上传下载php源文件时,我们偶尔会发现在本地windows下 ...
随机推荐
- Oracle 客户端深度指南:SQL Developer 与 PL/SQL Developer 全面安装使用教程
作为拥有10年Oracle开发经验的资深工程师,我将为您提供一份专业级的客户端工具指南.无论您是初学者还是进阶开发者,本教程都将帮助您高效使用Oracle生态中最强大的两个工具. 一.工具对比与选择建 ...
- 用 Tarjan 算法求解无向图的割点和割边
上期回顾:https://www.cnblogs.com/ofnoname/p/18823922 Tarjan 算法与无向图 连接性分析是图论的核心,而Tarjan算法为我们提供了穿透复杂网络结构的通 ...
- 网络流最大流Dinic算法
感谢董晓老师:博客,b站 /* Dinic算法的思路是,用bfs进行分层,限制后面dfs每次的搜索深度, 并且,在dfs的过程中,直接把当前这个路走到u的容量限制分给u的各个出边 */ #includ ...
- HTML CSS 垂直居中布局
display:flex;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-line ...
- 样本量的确定与OC函数
在之前的假设检验文章中我们说过,在样本量固定的情况下,第一类错误的减少必然会导致第二类错误的增加.按照之前的例子,原假设依旧是一家馒头店每天卖出100个馒头,现在如果减少第一类错误(也就是减少显著性水 ...
- CF1809D Binary String Sorting 题解
CF1809D Binary String Sorting 贪心.由于每次操作的代价都很大,所以需要优先减少操作次数,然后尽量多使用交换操作. 易得交换操作最多只会发生一次,因为每次交换操作只能消除一 ...
- leetcode 1573
简介 我们自己观察题目发现了什么这是一道数学题,哈哈哈. 个人的思路是分成两类去判断, 第一种: 全是0 使用 \[ (n-1) * (n - 2) / 2 \] 第二种: 有1 然后观察10101 ...
- 产品更新丨谷云 AI Agent 智能体版本更新
这次谷云科技AI Agent 智能体迎来了更新,此次更新聚焦于功能新增与优化,旨在提升智能体性能,深化平台交互体验,助力您在数据驱动的决策旅程中更加得心应手. 功能新增,开启智能新篇 1.MCP 服务 ...
- freeswitch笔记(8)-esl outbound 填坑笔记
github上的esl-client已经N年未更新了,上面有一堆bug,记录一下: 一.内存泄露 org.freeswitch.esl.client.transport.message.EslFram ...
- linux下如何查看已安装的版本信息 -九五小庞
一.linux下如何查看已安装的centos版本信息: 1.Linux查看当前操作系统版本信息 cat /proc/version Linux version 2.6.32-696.el6.x86_ ...