xlsx xlsx-style 使用和坑记录

1 安装之后报错

npm install xlsx --savenpm install xlsx-style --save

Umi运行会报错

自己代码

import XLSX from "xlsx";
import XLSXStyle from "xlsx-style";const data = [["demo1","demo2","demo3","demo4","demo5","是否开启(填写注意: 0为否,1为是)",],["1", "2", "3", "4", "5", "0"],
];
const wsWidths = [20, 20, 20, 20, 20, 20];const book = XLSX.utils.book_new(); //没有工作表的空工作簿
const workSheet = XLSX.utils.aoa_to_sheet(data);
if (Array.isArray(wsWidths) && wsWidths.length === columnNames[0].length) {workSheet["!cols"] = wsWidths.map((width) => ({ wch: width }));
}
if (merge) {/***合并单元格:// s 意为 start ,即开始的单元格// r 是 row ,表示行号,从 0 计起// c 是 col ,表示列号,从 0 计起const merge = [// 纵向合并,范围是第1列的行1到行2{ s: { r: 0, c: 0 }, e: { r: 1, c: 0 } },// 纵向合并,范围是第2列的行1到行2{ s: { r: 0, c: 1 }, e: { r: 1, c: 1 } },// 横向合并,范围是第1行的列3到列5{ s: { r: 0, c: 2 }, e: { r: 0, c: 4 } },// 横向合并,范围是第1行的列6到列11{ s: { r: 0, c: 5 }, e: { r: 0, c: 10 } },// 横向合并,范围是第1行的列12到列17{ s: { r: 0, c: 11 }, e: { r: 0, c: 16 } },// 横向合并,范围是第1行的列18到列23{ s: { r: 0, c: 17 }, e: { r: 0, c: 22 } },// 横向合并,范围是第1行的列24到列29{ s: { r: 0, c: 23 }, e: { r: 0, c: 28 } },// 横向合并,范围是第1行的列30到列35{ s: { r: 0, c: 29 }, e: { r: 0, c: 34 } }];*/workSheet["!merges"] = merge;
}
const colKeys = Object.keys(workSheet).filter((k) => /[A-Z]/.test(k[0]));
styles.forEach((s, i) => {const t = columnNames[0][i];const j = colKeys.findIndex((k) => workSheet[k].v === t);if (s && j > -1) {workSheet[colKeys[j]].s = s;}
});
XLSX.utils.book_append_sheet(book, workSheet, sheetName);
XLSXStyle.writeFile(book, filename, {defaultCellStyle /* {font: { name: "Verdana", sz: 14, color: {rgb: "FFFF0000"}},fill: {fgColor: {rgb: "FF00FF00"}},alignment: {vertical: 'center'}} */,
});

解决方案1:配置webpack

externals: {'./cptable': 'var cptable',
},

Umi在config.ts中配置。

解决方案2:删除两个导入 (最佳方案)

import XLSX from "xlsx";
import XLSXStyle from "xlsx-style";

删除之后,上面的代码就能正常使用,编译也不报错了,也不需要进行webpack配置。

因为这两个库不支持ES 6的导出,导出的值是undefined。

解决方案3

使用方案1生成表格时候报错:

意思就是

XLSX为undefined,我去这不是import导入进来了吗,怎么就undefined了。

直接进入XLSX源码查看。

源码里面根本就没有导出XLSX。直接挂在window上面的,什么玩意啊。

修改自己的代码

const data = [["demo1","demo2","demo3","demo4","demo5","是否开启(填写注意: 0为否,1为是)",],["1", "2", "3", "4", "5", "0"],
];
const wsWidths = [20, 20, 20, 20, 20, 20];const book = window.XLSX.utils.book_new(); //没有工作表的空工作簿
const workSheet = window.XLSX.utils.aoa_to_sheet(data);
if (Array.isArray(wsWidths) && wsWidths.length === columnNames[0].length) {workSheet["!cols"] = wsWidths.map((width) => ({ wch: width }));
}
if (merge) {/***合并单元格:// s 意为 start ,即开始的单元格// r 是 row ,表示行号,从 0 计起// c 是 col ,表示列号,从 0 计起const merge = [// 纵向合并,范围是第1列的行1到行2{ s: { r: 0, c: 0 }, e: { r: 1, c: 0 } },// 纵向合并,范围是第2列的行1到行2{ s: { r: 0, c: 1 }, e: { r: 1, c: 1 } },// 横向合并,范围是第1行的列3到列5{ s: { r: 0, c: 2 }, e: { r: 0, c: 4 } },// 横向合并,范围是第1行的列6到列11{ s: { r: 0, c: 5 }, e: { r: 0, c: 10 } },// 横向合并,范围是第1行的列12到列17{ s: { r: 0, c: 11 }, e: { r: 0, c: 16 } },// 横向合并,范围是第1行的列18到列23{ s: { r: 0, c: 17 }, e: { r: 0, c: 22 } },// 横向合并,范围是第1行的列24到列29{ s: { r: 0, c: 23 }, e: { r: 0, c: 28 } },// 横向合并,范围是第1行的列30到列35{ s: { r: 0, c: 29 }, e: { r: 0, c: 34 } }];*/workSheet["!merges"] = merge;
}
const colKeys = Object.keys(workSheet).filter((k) => /[A-Z]/.test(k[0]));
styles.forEach((s, i) => {const t = columnNames[0][i];const j = colKeys.findIndex((k) => workSheet[k].v === t);if (s && j > -1) {workSheet[colKeys[j]].s = s;}
});window.XLSX.utils.book_append_sheet(book, workSheet, sheetName);window.XLSXStyle.writeFile(book, filename, {defaultCellStyle /* {font: { name: "Verdana", sz: 14, color: {rgb: "FFFF0000"}},fill: {fgColor: {rgb: "FF00FF00"}},alignment: {vertical: 'center'}} */,});

直接使用window点对应的方法。

生成文件内容

2 文件解析


import { Upload } from "antd";
<Uploadaccept=".xlsx"fileList={[]}beforeUpload={(file) => onBeforeUpload(file)}
><Button>批量上传</Button>
</Upload>;

const isBinary =typeof FileReader !== "undefined" &&typeof FileReader.prototype !== "undefined" &&typeof FileReader.prototype.readAsBinaryString !== "undefined";let myParseWorker;function formatData(data) {var o = "",l = 0,w = 10240;for (; l < data.byteLength / w; ++l)o += String.fromCharCode.apply(null,new Uint8Array(data.slice(l * w, l * w + w)));o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)));return o;
}
function parseWorker(data) {if (!myParseWorker) {myParseWorker = new Worker(`${window.location.protocol +"//" +window.location.host +window.location.pathname}xlsx.worker.js`);}return new Promise((resolve, reject) => {myParseWorker.onmessage = function (e) {switch (e.data.type) {case "error":reject(e.data.data);break;case "xlsx":return resolve(JSON.parse(e.data.data));}};data = isBinary ? data : btoa(formatData(data));myParseWorker.postMessage({ data, binary: isBinary });});
}const onBeforeUpload = async (file) => {try {const res = new Promise((resolve, reject) => {const myFileReader = new FileReader();myFileReader.onload = (e) => {try {parseWorker(e.target.result).then((res) => {//if里面可以增加自己的校验方法if (true) {return resolve(file);}return reject(e);}).catch((error) => {console.log(error);reject(error);});} catch (error) {console.log(error);reject(error);}};if (isBinary) {myFileReader.readAsBinaryString(file);} else {myFileReader.readAsArrayBuffer(file);}});return file;} catch (error) {console.log(error);} finally {}
};

parseWorker里面then中res

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

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

相关文章

linux中的gdb调试

gdb是在程序运行的结果与预期不符合时&#xff0c;可以使用gdb进行调试 注意&#xff1a;使用gdb调试时要在编译上加-g参数 gcc -g -c hello.c 启动gdb调试&#xff1a; gdb file 对gdb进行调试 设置运行参数&#xff1a; set args 可指定运行参数 show args 可以查…

群晖NAS开启FTP服务结合内网穿透实现公网远程访问本地服务

⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 文章目录 ⛳️ 推荐1. 群晖安装Cpolar2. 创建FTP公网地址3. 开启群晖FTP服务4. 群晖FTP远程连接5. 固定FTP公网地址6. 固定FTP…

【C语言】static关键字的使用

目录 一、静态本地变量 1.1 静态本地变量的定义 1.2 静态本地变量和非静态本地变量的区别 二、静态函数 2.1 静态函数的定义 2.2 静态函数与非静态函数的区别 三、静态全局变量 3.1 静态全局变量的定义 3.2 静态全局变量和非静态全局变量的区别 四、静态结构体变量 …

数据库管理phpmyadmin

子任务1-PHPmyadmin软件的使用 本子任务讲解phpmyadmin的介绍和使用操作。 训练目标 1、掌握PHPmyadmin软件的使用方法。 步骤1 phpMyAdmin 介绍 phpmyadmin是一个用PHP编写的软件工具&#xff0c;可以通过web方式控制和操作MySQL数据库。通过phpMyAdmin可以完全对数据库进行…

使用pandas将excel转成json格式

1.Excel数据 2.我们想要的JSON格式 {"0": {"raw_data1": "Sam","raw_data2": "Wong","raw_data3": "Good","layer": "12v1"},"1": {"raw_data1": "Lucy…

渗透测试练习题解析 2(CTF web)

题目均来自 BUUCTF 1、[极客大挑战 2019]Upload 1 考点&#xff1a;文件上传漏洞 进入靶场 一看就知道是考察文件上传漏洞&#xff0c;看源码有没有敏感信息 没有什么敏感信息&#xff0c;那我们试着按要求传一张图片看看结果&#xff0c;但是传了 png、jpg 类型的图片后发现上…

Dijkstra算法(求最短路)

简介&#xff1a; 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的&#xff0c;因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法&#xff0c;解决的是有权图中最短路径问题。 特点&#xff1a; 迪杰斯特拉算法采用的是一种贪心策略&a…

深度神经网络中的BNN和DNN:基于存内计算的原理、实现与能量效率

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言引言内存计算体系结构深度神经网络&#xff08;DNN&#xff09;随机梯度的优…

kvm qemu 优化 windows 虚拟机速度

主要优化磁盘 io 和网络 io 都选为 virtio windows 驱动下载 https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.185-2/virtio-win-0.1.185.iso I also had incredibly slow performance with my virtual HDD. The followin…

IP地址信息在保险行业的创新应用与解决方案

随着数字化时代的来临&#xff0c;保险行业正积极探索新的技术手段&#xff0c;以提升服务效能、降低风险&#xff0c;并更好地满足客户需求。IP地址信息作为一种重要的数字化工具&#xff0c;在保险行业中展现了广泛的应用前景。IP数据云将深入探讨IP地址信息在保险行业中的创…

C# Socket通信从入门到精通(21)——Tcp客户端判断与服务器断开连接的三种方法以及C#代码实现

前言 我们开发的tcp客户端程序在连接服务器以后,经常会遇到服务器已经关闭但是作为客户端的我们不知道,这时候应该应该有一个机制我们可以实时监测客户端和服务器已经断开连接,如果已经断开了连接,我们应该及时报警提示用户客户端和服务器已经断开连接,本文介绍三种可以监…

VM安装Centos7

目标&#xff1a; 一&#xff0c;安装Centos7 二&#xff0c;ssh可以连接 1 新建虚拟机 一直下一步 2 直到此处&#xff0c;选择稍后安装 一直下一步直到完成。 3 选中虚拟机&#xff0c;点击设置 选择CD/DVD&#xff0c;选取ISO映像文件。 4 等待安装 并且设置root密码 5…