node 根据xlsx表格数据,批量生成表格文件,并且设置样式和行高
假如我们有这么一个数据的表格文件
任务目标就是 根据数据1的字段 相同的每条的数据,去生成一个表格文件(数据1的值为1的全放一个表格文件里,数据1的值为2的放下一个文件里,以此类推)
下面先来进行准备操作
npm init
随便初始化一个项目
然后安装一下依赖
npm i @michaelray/style-xlsx -S
npm i xlsx-style -S
npm i xlsx -S
新建一个 output
文件夹用于后续输出
新建空的app.js
文件
由于style-xlsx
的一些问题,会导致行高没效果,还需要进行下面的操作
在node_modules\@michaelray\style-xlsx\src
文件夹找到hepler.js 打开编辑
在136行添加代码
if (options['!rows']) {workSheet['!rows'] = options['!rows'];}
然后去另一个地方
在node_modules\xlsx-style
文件夹找到xlsx.js 打开编辑
找到 write_ws_xml_data
方法
将下面的代码对其进行替换
var DEF_PPI = 96,PPI = DEF_PPI;function px2pt(px) {return (px * 96) / PPI;}function write_ws_xml_data(ws, opts, idx, wb) {var o = [],r = [],range = safe_decode_range(ws["!ref"]),cell,ref,rr = "",cols = [],R,C,rows = ws["!rows"];for (C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C);for (R = range.s.r; R <= range.e.r; ++R) {r = [];rr = encode_row(R);for (C = range.s.c; C <= range.e.c; ++C) {ref = cols[C] + rr;if (ws[ref] === undefined) continue;if ((cell = write_ws_xml_cell(ws[ref],ref,ws,opts,idx,wb)) != null)r.push(cell);}if (r.length > 0) {params = { r: rr };if (rows && rows[R]) {row = rows[R];if (row.hidden) params.hidden = 1;height = -1;if (row.hpx) height = px2pt(row.hpx);else if (row.hpt) height = row.hpt;if (height > -1) {params.ht = height;params.customHeight = 1;}if (row.level) {params.outlineLevel = row.level;}}o[o.length] = writextag("row", r.join(""), params);}}if (rows)for (; R < rows.length; ++R) {if (rows && rows[R]) {params = { r: R + 1 };row = rows[R];if (row.hidden) params.hidden = 1;height = -1;if (row.hpx) height = px2pt(row.hpx);else if (row.hpt) height = row.hpt;if (height > -1) {params.ht = height;params.customHeight = 1;}if (row.level) {params.outlineLevel = row.level;}o[o.length] = writextag("row", "", params);}}return o.join("");}
准备完成了,我们可以开始写表格生成的代码了
在app.js
进行代码编辑
const fs = require('fs')
const path = require('path')
const nodexlsx = require('@michaelray/style-xlsx');
const xls = require('xlsx')const workbook = xls.readFile("./data.xlsx") //获取data表格
const sheetNames = workbook.SheetNames; // 返回 ['sheet1', 'sheet2']//根据表名获取对应某张表
const worksheet = workbook.Sheets[sheetNames[0]]
const dataList = xls.utils.sheet_to_json(worksheet)let distData = {}
let hetongName = "数据1"; //根据名称进行数据整合for (let index = 0; index < dataList.length; index++) {const element = dataList[index];if (!distData[element[hetongName]]) {distData[element[hetongName]] = []}distData[element[hetongName]].push(element)
}
// 得到了根据“数据1”整合后的数据
for (let model in distData) {// 标题样式const titleStyle = {font: {name: '宋体',bold: true,sz: '18'},alignment: {horizontal: 'center',vertical: 'center',},}// 表头样式const headerStyle = {font: {name: '宋体',bold: true,sz: '11'},alignment: {// horizontal: 'center',vertical: 'center',},border: {top: {style: 'thin',color: { rgb: '000000' }},bottom: {style: 'thin',color: { rgb: '000000' }},left: {style: 'thin',color: { rgb: '000000' }},right: {style: 'thin',color: { rgb: '000000' }},}}// 内容样式const contStyle = {font: {name: '宋体',// bold: true,sz: '11'},alignment: {horizontal: 'center',vertical: 'center',},border: {top: {style: 'thin',color: { rgb: '000000' }},bottom: {style: 'thin',color: { rgb: '000000' }},left: {style: 'thin',color: { rgb: '000000' }},right: {style: 'thin',color: { rgb: '000000' }},}}// 合并控制const titleRange = {// 起始坐标s: {r: 0, // 行c: 0, // 列},// 结束坐标e: {r: 0,c: 4,},};// 行高设置const rowsTemp = [{ hpx: 26 }, { hpx: 20 }]let dataContList = [];dataContList = [[{ v: '我是标题', s: titleStyle }, null, null, null, null ],[{ v: '标题1数据', s: headerStyle }, { v: '标题2数据', s: headerStyle }, { v: '标题3数据', s: headerStyle }, { v: '标题4数据', s: headerStyle }, { v: '标题5数据', s: headerStyle }],];let allNum = 0// 循环内容for (let index = 0; index < distData[model].length; index++) {const element = distData[model][index];let arr = []arr = [{ v: element['数据1'], s: contStyle },{ v: element['数据2'], s: contStyle },{ v: element['数据3'], s: contStyle },{ v: element['数据4'], s: contStyle },{ v: element['数据5'], s: contStyle },]dataContList.push(arr)// 每次循环都添加数据和对应行高rowsTemp.push({ hpx: 30 })// 根据数据5 进行累计合计allNum += parseFloat(element['数据5'])}// 合计dataContList.push([{ v: '合计', s: contStyle }, { v: '', s: contStyle }, { v: '', s: contStyle },{ v: '', s: contStyle }, { v: parseFloat(allNum.toFixed(2)), s: contStyle },])rowsTemp.push({ hpx: 16 })//由于各列数据长度不同,可以设置一下列宽const sheetOptions = {'!cols': [{ wch: 22 }, { wch: 13 }, { wch: 8.3 }, { wch: 8.6 }, { wch: 9 }],'!rows': rowsTemp,'!merges': [titleRange],}//生成表格let buffer = nodexlsx.build([{ name: 'sheet1', data: dataContList, options: sheetOptions }]);let filePath = path.join(`${__dirname}/output/`, `${distData[model][0]['数据1']}.xlsx`); // 存储路径和文件名fs.writeFileSync(filePath, buffer, { 'flag': 'w' }); //console.log(`创建完成--${distData[model][0]['数据1']}.xlsx`)
}
console.log("创建完成")
(代码中有不太了解的地方,可以留言问我哈)
终端执行 node app.js
进行生成文件
生成完成
参考:
Node利用@michaelray/style-xlsx生成带样式的复杂excel
node(koa2+ejs) 通过 node-xlsx xlsx-style xlsx 生成带有格式的 excel
node 根据xlsx表格数据,批量生成表格文件,并且设置样式和行高相关推荐
- 腾讯云文字识别API提取表格数据并生成Excel文件
腾讯云文字识别API提取表格数据并生成Excel文件 本文主要介绍了利用腾讯云表格文字识别API提取图片表格数据并生成Excel文件.主要涉及的知识点有:腾讯云API的调用.json文件的处理以及Ex ...
- html中循环生成表格数据,动态生成表格(简单实现)
1.案例分析 1.利用对象生成假的数据,用来模拟数据库的数据. 2.核心算法:利用createElement生成表格(生成 tr , td ),注意逻辑关系. 1.css代码 table th { w ...
- 【文字识别】腾讯云API:提取表格数据并生成Excel文件
一.使用工具及python包介绍 腾讯云API 国内大型互联网公司都提供云服务,如阿里.百度.腾讯等.本文选择腾讯云服务,是因为提供的API说明比较详细,看一遍就能用.更良心的是,提供了在线测试的功能 ...
- 根据数据批量生成excel文件
第一步导入依赖: <!--excel支持--> <dependency><groupId>org.apache.poi</groupId><art ...
- 如何从Excel表格导入数据批量生成二维码
目前二维码应用渐趋广泛,二维码具有储存量大.保密性高.追踪性高.抗损性强.备援性大.成本便宜等特性,这些特性特别适用于表单.安全保密.追踪.证照.存货盘点.资料备援等方面.那么我们怎么用条码打印软件从 ...
- 如何从Excel表格导入数据批量生成二维码 1
目前二维码应用渐趋广泛,二维码具有储存量大.保密性高.追踪性高.抗损性强.备援性大.成本便宜等特性,这些特性特别适用于表单.安全保密.追踪.证照.存货盘点.资料备援等方面.那么我们怎么用条码打印软件从 ...
- ElementUI表格数据批量选中操作
ElementUI表格数据批量选中操作 最近做项目时碰到个需求,要对表格中的数据批量处理,花了点时间最终解决了这个问题 elementui表格中封装了多选框,在el-column中选择type为sel ...
- Excel 数据批量生成SQL语句
假设excel表格中有三列(A.B.C)数据,我们希望可以利用这三列数据批量生成SQL语句 第一步:新增D列,在D1中输入公式:=CONCATENATE("insert into user ...
- 如何通过Excel数据批量生成DM码
DM码指的就是最常用的Data Matrix 二维码,Data Matrix二维码原名Data code,是由美国国际资料公司于1989年发明.DM码需要选择编码容量大的二维码,而Data Matri ...
最新文章
- opencv根据直线方程求交点坐标
- 面试定心丸:AI知识点备忘录(包括ML、DL、Python、Pandas等)
- java 包含汉字,【转载】Java判断字符串中是不是包含汉字
- VS新建工程或者新建项时 出现未定义标识符号
- 第四章-分布式数据库HBase
- c语言溢出该怎么算,解决整数运算溢出方法——C语言
- php 修改html文件内容吗,请问你们怎么将html的文件的内容改变为php
- Java—BIO模型
- 牛客16589 机器翻译
- Docker上部署MariaDB
- shell变量(包含标准shell)
- LookupError: unknown encoding: cp65001及命令行无法输入中文问题(转)
- 【Hadoop Summit Tokyo 2016】基于Apache Spark的数据科学
- 今天加班做了昨天晚上要写的页面,用到了一些之前用过但还不熟悉需要上网搜索才能用的知识点:...
- 豆瓣9.4!《深度学习入门》笔记总结,带你从感知机入门深度学习!(连载)...
- linux学习之文件操作
- 使用线程池管理线程!
- HDU-1009 做个骑士,以梦为马
- 如何系统整理需求调研报告
- Android性能专项测试之Batterystats
热门文章
- JavaScript知识点-周2.md
- android中奖名单轮播,iOS模拟中奖名单循环滚动效果
- VUE 获奖名单滚动显示的两种方式
- CTF之萌新web学习(命令执行2)
- Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释【转】
- Line营销机器人2019版
- 强生单剂新冠疫苗对“德尔塔”有效;赛诺菲巴斯德将每年投资4亿欧元建mRNA疫苗中心 | 美通社头条...
- jpa mysql_Spring boot通过JPA访问MySQL数据库
- 微信、tim文件访问失败解决方法
- 个人开发者可以申请微信支付了