文章目录

      • 1. 基础配置
        • 1.1 单元格内容
        • 1.2 单元格合并、列宽、行高
        • 1.3 单元格样式
      • 2. sheet 配置、多个 sheet
      • 3. excel 导出
      • 4. 数据插入(进阶)

1. 基础配置

1.1 单元格内容

注:xlsx、xlsx-style 都存在 write 方法,xlsx 设置单元格样式没有效果,xlsx-style 设置行高没有效果

// 首选需要安装 npm i xlsx xlsx-style
imoprt XLSX from "xlsx"let arr = [{date: "2016-05-02",name: "王小虎",address: "上海市普陀区金沙江路 1518 弄",},{date: "2016-05-04",name: "王小虎",address: "上海市普陀区金沙江路 1517 弄",}
];// 处理成 XLSX 认识的格式
XLSX.utils.json_to_sheet(arr);
/** 可以看到自动把 key 变为第一行的标题了,value 依此排列* { // 这里的对象也可以手动自行配置*     "!ref": "A1:C3", // 表示表格内容范围A1: { t: "s", v: "date" }, // t: 格式  v: 内容A2: { t: "s", v: "2016-05-02" },A3: { t: "s", v: "2016-05-04" },B1: { t: "s", v: "name" },B2: { t: "s", v: "王小虎" },B3: { t: "s", v: "王小虎" },C1: { t: "s", v: "address" },C2: { t: "s", v: "上海市普陀区金沙江路 1518 弄" },C3: { t: "s", v: "上海市普陀区金沙江路 1517 弄" }}*/
1.2 单元格合并、列宽、行高
let worksheet = {"!cols": [{ wpx: 140 }, { wpx: 80 }],"!rows": [{ hpx: 14 }, { hpx: 14 }],"!ref": "A1:C3","!merges": [{ s: { r: 0, c: 0 }, e: { r: 0, c: 2 } }] // 合并第一行的 1~3 列
}
1.3 单元格样式
let cell = {t: "s",v: "测试"s: {alignment: {vertical: "center", // 垂直居中horizontal: "center", // 水平居中wrapText: "true", // 文本换行readingOrder: "2", // 阅读顺序,从右往左textRotation: "180" // 文本旋转},border: {top: { style: "边框样式", color: { rgb: "边框颜色" }}bottom: {}...},font: {name: "字体", sz: "字体大小",color: { rgb: "字体颜色" },bold: "是否加粗"},fill: {bgColor: { rgb: "背景颜色" }}}
}

2. sheet 配置、多个 sheet

import XLSX from "xlsx" // 只能使用 xlsx
const wb = XLSX.utils.book_new(); // 创建工作簿
const sheet1 = XLSX.utils.json_to_sheet(arr1)
const sheet2 = XLSX.utils.json_to_sheet(arr2)
XLSX.utils.book_append_sheet(wb1, sheet, 'sheet1名称');
XLSX.utils.book_append_sheet(wb2, sheet, 'sheet2名称');
// 这个时候的 wb 的数据就完整了

3. excel 导出

// 将 workbook 装化成 blob 对象
// 这里用到了 XLSX.write,注意是使用的哪种 import XLSX from "xlsx"/"xlsx-style"
function workbook2blob(workbook) {// 生成excel的配置项var wopts = {// 要生成的文件类型bookType: "xlsx",// 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性bookSST: false,type: "binary",};var wbout = XLSX.write(workbook, wopts);// 将字符串转 ArrayBufferfunction 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;}var blob = new Blob([s2ab(wbout)], {type: "application/octet-stream",});return blob;
}// 将 blob 对象创建 bloburl,然后用 a 标签实现弹出下载框
function openDownloadDialog(blob, fileName) {if (typeof blob == "object" && blob instanceof Blob) {blob = URL.createObjectURL(blob); // 创建blob地址}var aLink = document.createElement("a");aLink.href = blob;// HTML5 新增的属性,指定保存文件名,可以不要后缀,注意,有时候 file:///模式下不会生效aLink.download = fileName || "";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);
}openDownloadDialog(workbook2blob(wb), "excel下载.xlsx");

4. 数据插入(进阶)

// 数据的更新(插入行,向下平移)
// 插入指定行同理 修改循环时的初始值就好了
function insertRowsBeforeData(worksheet, rowLen = 1, callback) {// 获取当前工作表范围const range = worksheet["!ref"] ? XLSX.utils.decode_range(worksheet["!ref"]) : null;// 计算要插入的行数const insertRows = rowLen;// 处理合并单元格 - 下移现有合并区域if (worksheet["!merges"]) {worksheet["!merges"] = worksheet["!merges"].map((merge) => {const newMerge = { ...merge };// 移动合并区域的起始行和结束行newMerge.s.r += insertRows;newMerge.e.r += insertRows;return newMerge;});}//  处理数据,下移现有数据if (range) {// 从最后一行开始向上移动,避免覆盖for (let row = range.e.r; row >= range.s.r; row--) {for (let col = range.s.c; col <= range.e.c; col++) {const cellAddress = XLSX.utils.encode_cell({ r: row, c: col });if (worksheet[cellAddress]) {// 计算新位置(向下移动insertRows行)const newRow = row + insertRows;const newAddress = XLSX.utils.encode_cell({ r: newRow, c: col });// 移动单元格worksheet[newAddress] = worksheet[cellAddress];// 删除原始位置的单元格delete worksheet[cellAddress];}}}// 更新工作表范围range.e.r += insertRows;worksheet["!ref"] = XLSX.utils.encode_range(range);}// 插入数据callback && callback();
}this.insertRowsBeforeData(worksheet, 1, () => {worksheet.A1 = { t: "s", v: "我是新插入的数据1" }worksheet.B1 = { t: "s", v: "我是新插入的数据2" }
});

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

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

相关文章

算法第38天|322.零钱兑换\139. 单词拆分

322.零钱兑换 题目 思路与解法 class Solution { public:int coinChange(vector<int>& coins, int amount) {// dp数组&#xff1a;// dp[i]: 凑成总金额i&#xff0c;所需的最少硬币个数vector<int> dp(amount 1, INT_MAX);dp[0] 0;for (int i 0; i &l…

使用MobileNetV3训练水果分类模型并用Flask部署

前言 在计算机视觉领域&#xff0c;图像分类是一个基础且重要的任务。本文将介绍如何使用MobileNetV3预训练模型来训练一个水果分类模型&#xff0c;并通过Flask框架进行部署。MobileNetV3作为轻量级网络&#xff0c;在保持较高精度的同时&#xff0c;具有较快的推理速度&…

SCADA技术与市场全景解析

SCADA系统作为工业自动化领域的关键组成部分&#xff0c;成为了工业企业推进数字化转型的有力抓手。本文将重点介绍SCADA系统的发展历程、系统构成及工作原理、发展趋势&#xff0c;分析其行业应用差异&#xff0c;以及与物联网和组态软件的区别&#xff0c;梳理其在不同行业的…

在线教学课程视频AI智能大纲代码与演示

AI根据视频内容自动生成视频大纲&#xff0c;极大地提高了视频内容的管理效率、可访问性和用户体验&#xff0c;是推动视频内容智能化发展的重要一环。AI根据视频内容自动生成视频内容大纲。这种功能&#xff0c;应用场景有哪些&#xff1f; 应用场景&#xff1a; 在线教育平台…

动态WCMP+Flowlet ALB:双引擎驱动智算网络负载均衡

传统网络架构的困境 在 AI 算力爆发的今天&#xff0c;数据中心网络正经历前所未有的流量形态变革。传统 Clos 网络架构依赖逐流 ECMP 均衡算法&#xff0c;其设计逻辑基于 “大量短流” 假设&#xff0c;通过五元组 HASH 实现负载分担。然而 AI 训练场景呈现出鲜明的流量特征…

软件测试题

选择题 1、导致软件缺陷的原因有很多&#xff0c;①—④是可能的原因&#xff0c;其中最主要的原因包括( )。 ①软件需求说明书编写的不全面&#xff0c;不完整&#xff0c;不准确&#xff0c;而且经常更改 ②软件设计说明书 ③软件操作人员的水平 ④开发人员不能很好的…

微信小程序页面容器弹出层

效果图 .JS Page({data: {show: false,duration: 300,position: right,round: false,overlay: true,customStyle: ,overlayStyle: },popup(e) {const position e.currentTarget.dataset.positionlet customStyle let duration this.data.durationswitch(position) {case to…

Excel批量计算时间差

执行以下操作&#xff0c;将自定义格式代码应用到单元格&#xff1a; 选择相应的单元格。在"开始"选项卡上的"数字"组中&#xff0c;单击"常规"框旁边的箭头&#xff0c;然后单击"其他数字格式"。在"设置单元格格式"对话框…

shell脚本--变量

1.变量是什么 2.变量类型 3.动态&#xff0c;静态&#xff0c;强弱类型 4.变量的命名 5.变量的定义和引用 5.1三种变量类型 普通变量 环境变量 局部变量 5.2单引号&#xff0c;双引号&#xff0c;强弱引用 双引号对变量赋值的影响01:59&#xff1a;给变量加双引号&#x…

大模型Text2SQL之在CentOS上使用yum安装与使用MySQL

前言 学习大模型的时候需要一个mysql&#xff0c;原因还是在公司使用电脑的时候不允许按照Docker-Desktop&#xff0c;我的宿主机其实是MAC&#xff0c;我习惯上还是在centsos上面安装,就发现这件过去很简单的事情居然捣鼓了我蛮久&#xff0c;记录一下。 容器环境 我直接安…

机器人大脑的进化:Physical Intelligence如何用“知识隔离“破解VLA模型三大难题

目录 引言&#xff1a;当GPT遇上机器人手臂 第一章&#xff1a;VLM 与 VLA的介绍 VLM (Vision-Language Model) - 视觉语言模型 VLA (Vision-Language Agent) - 视觉语言智能体 VLM和VLA的对比 第二章&#xff1a;VLA模型的进化史 - 从"口述指挥"到"精确控…

LeetCode 662. 二叉树的最大宽度

文章目录 LeetCode 662. 二叉树的最大宽度题目描述思路Golang 代码 LeetCode 662. 二叉树的最大宽度 记录一次刷题的感悟。这道题目是我人生第一次面试的时候的手撕题目&#xff0c;但临场的时候面试官没有为难我&#xff0c;他考察的问题是求二叉树的最大宽度&#xff0c;但是…

【linux】bash脚本中括号问题

在 Bash 脚本里&#xff0c;中括号 [ ] 其实是 test 命令的同义词&#xff0c;[ 是一个命令&#xff0c;] 是该命令的最后一个参数&#xff0c;所以中括号内外的空格会影响命令执行&#xff0c;下面详细说明&#xff1a; 中括号内侧空格 中括号内侧与操作数之间必须有空格&…

Ruoyi(若依)整合websocket实现信息推送功能(消息铃铛)

实现消息推送功能 来了&#xff0c;来了&#xff0c;大家做系统应该是最关心这个功能。 【思路】 需求&#xff1a;对全系统【所有的业务操作】进行消息推送&#xff0c;有【群发】、【私发】功能、处理【消息状态&#xff08;未读/已读&#xff09;】&#xff0c;websocket持…

小白的进阶之路系列之十五----人工智能从初步到精通pytorch综合运用的讲解第八部分

torch.nn 究竟是什么? PyTorch 提供了设计精良的模块和类,如 torch.nn、torch.optim、Dataset 和 DataLoader,帮助你创建和训练神经网络。为了充分利用它们的能力并根据你的问题进行定制,你需要真正理解它们到底在做什么。为了帮助你理解这一点,我们将首先在不使用这些模…

JavaScript 数据结构详解

最近在复习JavaScript的基础知识&#xff0c;和第一次学确实有了很不一样的感受&#xff0c;第一次学的比较浅&#xff0c;但是回头再进行学习的时候&#xff0c;发现有很多遗漏的东西&#xff0c;所以今天想分享一下新学到的知识&#xff0c;后面会一点一点补充更新 JavaScrip…

c++面试题(14)------顺时针打印矩阵

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 输入一个矩阵&#xff0c;按照从外向里以顺时针的顺序依次打印出每一个元素。 例如&#xff1a; 输入矩阵&#xff1a; [[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ] ]输出&…

《Go语言圣经》defer

《Go语言圣经》defer 核心概念&#xff1a;defer语句的执行时机 defer是Go语言的一个关键字&#xff0c;它的作用是&#xff1a;延迟执行一个函数调用&#xff0c;该调用会在包围它的函数返回前一刻执行。 关键点&#xff1a; defer语句会在函数即将返回时执行&#xff0c;…

WEB3 的 WebSocket Provider连接方式

1. 什么是 WebSocket Provider? WebSocket Provider 是 web3.js 中用于通过 WebSocket 协议 与以太坊节点(如 Infura、Geth、Parity)建立持久化连接的通信方式。它允许双向实时数据传输,适用于需要实时监听区块链事件的场景。 核心特点 双向通信:客户端和服务器可以主动…

三国大模型:智能重构下的乱世文明图谱

引言&#xff1a;当赤壁烽烟遇见深度学习 一件动态的《全本三国演义》正通过全息投影技术演绎群雄逐鹿的史诗。这个虚实交融的场景&#xff0c;恰似三国大模型技术的隐喻——以人工智能为纽带&#xff0c;连接起汉末三国的烽火狼烟与数字时代的文明重构。作为人工智能与历史学…