1. 安装 xlsx  和  xlsx-style
  2. src下创建文件夹utils , utils文件夹下创建index.js文件,index.js文件内容如下:
 * Created by Anqi on 16/11/18.
*/ /**
* Parse the time to string
* @param {(Object|string|number)} time
* @param {string} cFormat
* @returns {string | null}
*/
// import XLSX from 'xlsx-style';
import XLSX from 'yxg-xlsx-style' export function parseTime(time, cFormat) {
if (arguments.length === 0) {
return null;
}
const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}';
let date;
if (typeof time === 'object') {
date = time;
} else {
if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
time = parseInt(time);
}
if ((typeof time === 'number') && (time.toString().length === 10)) {
time = time * 1000;
}
date = new Date(time);
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
};
const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
const value = formatObj[key];
// Note: getDay() returns 0 on Sunday
if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ]; }
return value.toString().padStart(2, '0');
});
return time_str;
} /**
* @param {number} time
* @param {string} option
* @returns {string}
*/
export function formatTime(time, option) {
if (('' + time).length === 10) {
time = parseInt(time) * 1000;
} else {
time = +time;
}
const d = new Date(time);
const now = Date.now(); const diff = (now - d) / 1000; if (diff < 30) {
return '刚刚';
} else if (diff < 3600) {
// less 1 hour
return Math.ceil(diff / 60) + '分钟前';
} else if (diff < 3600 * 24) {
return Math.ceil(diff / 3600) + '小时前';
} else if (diff < 3600 * 24 * 2) {
return '1天前';
}
if (option) {
return parseTime(time, option);
} else {
return (
d.getMonth() +
1 +
'月' +
d.getDate() +
'日' +
d.getHours() +
'时' +
d.getMinutes() +
'分'
);
}
} /**
* @param {string} url
* @returns {Object}
*/
export function param2Obj(url) {
const search = url.split('?')[1];
if (!search) {
return {};
}
return JSON.parse(
'{"' +
decodeURIComponent(search)
.replace(/"/g, '\\"')
.replace(/&/g, '","')
.replace(/=/g, '":"')
.replace(/\+/g, ' ') +
'"}'
);
} export function downloadFile(fileName, res) {
const blob = new Blob([res.data], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
});
const link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = fileName;
link.click();
URL.revokeObjectURL(link.href);
} export function resizeListener(chart) {
window.addEventListener('resize', function() {
chart.resize();
});
}
// 为合并项添加边框
export const addRangeBorder = (range, ws) => {
const arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
range.forEach(item => {
const startColNumber = Number(item.s.r); const endColNumber = Number(item.e.r); // 0-0
const startRowNumber = Number(item.s.c); const endRowNumber = Number(item.e.c); // 0-16
const test = ws[arr[startRowNumber] + (startColNumber + 1)]; // 合并项第一个单元格中的内容
for (let col = startColNumber; col <= endColNumber; col++) { // 0-0
for (let row = startRowNumber; row <= endRowNumber; row++) { // 0-16
ws[arr[row] + (col + 1)] = test; // A1-P1
}
}
});
return ws;
};
// 将一个sheet转成最终的excel文件的blob对象
export const sheet2blob = (sheet, sheetName) => {
// console.log(sheet, sheetName, 'sheet, sheetName')
sheetName = sheetName || 'sheet1';
console.log(sheetName, 'sheetName');
var workbook = {
SheetNames: [sheetName],
Sheets: {}
};
workbook.Sheets[sheetName] = sheet; // 生成excel的配置项 var wopts = {
bookType: 'xlsx', // 要生成的文件类型
bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
type: 'binary'
};
var wbout = XLSX.write(workbook, wopts);
var blob = new Blob([s2ab(wbout)], {
type: 'application/octet-stream'
}); // 字符串转ArrayBuffer
function s2ab(s) {
var buf = new ArrayBuffer(s.length);
var view = new Uint8Array(buf);
for (var i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
return buf;
}
return blob;
}; export const openDownloadDialog = (url, saveName) => {
if (typeof url === 'object' && url instanceof Blob) {
url = URL.createObjectURL(url); // 创建blob地址
}
var aLink = document.createElement('a');
aLink.href = url;
aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
var event;
if (window.MouseEvent) event = new MouseEvent('click');
else {
event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
}
aLink.dispatchEvent(event);
};

  3.  注意!!!!!!!直接引用  import XLSX from 'xlsx-style'   会报错,报错信息如下图:

 

想要解决此错误需要修改model包里源码,需要修改源码:在\node_modules\xlsx-style\dist\cpexcel.js 807行 的 var cpt = require(’./cpt’ + ‘able’); 改成 var cpt = cptable;,修改之后问题解决可以解决,但是另一个问题就来了,

因为修改了xlsx-style源码所以我们npm i的时候不能获取修改后的包,但是其实可以将修改后的源码上传自己的npm再下载自己修改后的包。但是由于本人实在懒得可怕,找了一位博主上传好的直接下载了!!!!!!!!!

下载   npm install --save yxg-xlsx-style ,   页面引入 :import XLSX from 'yxg-xlsx-style'

vue页面使用如下:

    exportFn() {

         var wb = XLSX2.utils.table_to_sheet(document.querySelector('#table'));// mytable为表格的id名
console.log(wb);
if (!wb['!fullref']) {
this.$message.warning('无法导出:报表无数据');
return;
}
// 设置列宽(这里用到列的数量是用来设置不同列的不同宽度的)
const sum = 8; // 列的数量,根据自身项目进行数据的更改
for (var i = 0; i < sum; i++) {
wb['!cols'][i] = { wpx: 160 };
}
for (const key in wb) {
if (key.indexOf('!') === -1) { // 排除带!的字段,只要单元格字段
wb[key].s = {
font: { // 字体设置
sz: 13,
bold: false,
color: {
rgb: '000000'// 十六进制,不带#
}
},
border: { // 设置边框
top: { style: 'thin' },
bottom: { style: 'thin' },
left: { style: 'thin' },
right: { style: 'thin' }
},
alignment: { // 文字居中 //字体水平居中、垂直居中、自动换行
horizontal: 'center',
vertical: 'center',
wrap_text: true
}
};
}
}
// var data = addRangeBorder(wb['!merges'], wb); // 合并项添加边框
let a = dayjs(this.queryParams.time[0]).format('YYYYMMDDHHmmss');
let b = dayjs(this.queryParams.time[1]).format('YYYYMMDDHHmmss');
var filedata = sheet2blob(wb); // 将一个sheet转成最终的excel文件的blob对象
openDownloadDialog(filedata, `数据_${a}_${b}.xlsx`); // 下载报表
},

别忘记在el-table 上定义 ID !!!!!!!!!!!!!!!

vue 导出xlsx (报错./cptable in ./node modules/xlsx-style/dist/cpexcel.js)的更多相关文章

  1. 【poi xlsx报错】使用POI创建xlsx无法打开

    如果使用的XSSFWorkbook创建的xls,打开的时候会有这样的提示: 这样 XSSFWorkbook 和HSSFWorkbook的区别. HSSF - 提供读写Microsoft Excel X ...

  2. webpack搭建项目时出现的报错“Module build failed (from ./node_modules/css-loader/dist/cjs.js) CssSyntaxError”

    控制台出现的错误如下: webpack.config.js中的配置如下: module.exports={ entry:'./src/main.js', output:{ path:__dirname ...

  3. vue解决启动报错cjs loader.js Error: Cannot find module '../config'问题

    vue解决启动报错cjs loader.js Error: Cannot find module '../config'问题 今天下载了一个开源项目一直运行不了,折腾了半天才找到问题所在,config ...

  4. vue项目启动报错 spawn cmd ENOENT errno: -4058

    vue项目启动报错 spawn cmd ENOENT errno: -4058 运行vue项目(npm run dev)报错 提示 'npm' 不是内部或外部命令 cmd输入node -v 有版本号 ...

  5. 解决vue安装less报错Failed to compile with 1 errors的问题

    1.创建vue项目后安装less,执行 npm install less less-loader --save-dev 下载版本为:less-loader@6.1.0 , less@3.11.3,重启 ...

  6. java导出excel报错:getOutputStream() has already been called for this response

    对于java导出excel报错的问题,查了很多都说是在使用完输出流以后调用以下两行代码即可 out.clear(); out = pageContext.pushBody(); 但这也许是页面上输出时 ...

  7. weblogic 12c下jxls导出excel报错Could not initialize class org.apache.poi.xssf.usermodel.XSSFVMLDrawing

    周一,开发反馈weblogic 12c下jxls导出excel报错,公司环境和UAT环境均报错,看日志如下: 2016-06-08 09:16:55,825 ERROR org.jxls.util.T ...

  8. EXP导出aud$报错EXP-00008,ORA-00904 解决

    主题:EXP导出aud$报错EXP-00008,ORA-00904 解决 环境:Oracle 11.2.0.4 问题:在自己的测试环境,导出sys用户下的aud$表报错. 1.故障现场 2.跟踪处理 ...

  9. Vue自定义指令报错:Failed to resolve directive: xxx

    Vue自定义指令报错 Failed to resolve directive: modle 这个报错有2个原因: 1.指令单词拼错 2.Vue.directive() 这个方法没有写在 new Vue ...

  10. kibana启动及导出PDF报错

    kibana启动及导出PDF报错,可能是由于kibana需要的系统依赖没有安装 CentOS/RHEL系统需要安装以下依赖: ipa-gothic-fonts xorg-x11-fonts-100dp ...

随机推荐

  1. Jenkins自动化部署-----持续交付

    前言: 感谢之前带领过我的leader,让我能够知道什么是好的开发方法. 在很早之前就接触过敏捷开发.什么是敏捷开发,简单来说就是让软件可靠地,快速地发布出来的一种开发方法和技巧. 而敏捷开发中有许多 ...

  2. manim边做边学--参数化曲线

    在数学可视化领域,参数方程提供了一种灵活描述曲线的方式. Manim库中的ParametricFunction类正是为此而生,它允许用户通过参数方程创建各种复杂的二维和三维曲线. Parametric ...

  3. LLM 上下文长度详细介绍

    1.概述 在<Token:大语言模型的"语言乐高",一切智能的基石>与<LLM 输出配置 (LLM output configuration)>这两篇博文中 ...

  4. 鸿蒙Next仓颉语言开发实战教程:懒加载

    今天要分享的是仓颉开发语言中的懒加载. 先和初学者朋友们解释一下什么是懒加载.懒加载在代码中叫做LazyForEach,看到名字你一定能猜到它和ForEach的功能类似.只不过和ForEach的一次性 ...

  5. 使用 xUnit 快速编写 .NET 应用单元测试

    前言 在当今快速迭代的软件开发环境中,单元测试已成为保障代码质量和项目可靠性的重要基石,通过验证程序最小单元(如函数.方法.类等)的独立行为,能够在开发阶段快速发现逻辑错误或边界条件问题.今天大姚将带 ...

  6. 本地搭建一个对嘴AI工具

    图片+音频=说话视频 这就是本次需要实现的功能. 一:环境 window10电脑(GPU越大越好,我的是专享8G,有点小了). Python 3.11.9. CUDA Version: 12.9.(驱 ...

  7. 字节开源的AI Coding Agent —— Trae Agent深入浅出

    1. 项目概述 从Cursor到Trae,从claude code到gemini cli,AI Coding都是火热的战场,现在字节开源了新的trae-agent(https://github.com ...

  8. json\jquery入门

    一)什么是JSON (1)JSON(Java Script Object Notation(记号,标记))是一种轻量级的数据交换语言, 以文本字符串为基础,且易于让人阅读 注意:XML就是一个重量级的 ...

  9. CF1332E Height All the Same 题解

    CF1332E Height All the Same 考虑到可以在一个格子上码上两个方块,易得如果每个格子奇偶性相同,则一定可以到达同样高度.对于任意点对 \((x,y)\),我们可以通过找到一条路 ...

  10. leetcode 92 翻转链表 II

    简介 直接使用reverse, 进行值的替换, 链表翻转实在是太烦了 code class Solution { public: ListNode* reverseBetween(ListNode* ...