假如我们有这么一个数据的表格文件

任务目标就是 根据数据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表格数据,批量生成表格文件,并且设置样式和行高相关推荐

  1. 腾讯云文字识别API提取表格数据并生成Excel文件

    腾讯云文字识别API提取表格数据并生成Excel文件 本文主要介绍了利用腾讯云表格文字识别API提取图片表格数据并生成Excel文件.主要涉及的知识点有:腾讯云API的调用.json文件的处理以及Ex ...

  2. html中循环生成表格数据,动态生成表格(简单实现)

    1.案例分析 1.利用对象生成假的数据,用来模拟数据库的数据. 2.核心算法:利用createElement生成表格(生成 tr , td ),注意逻辑关系. 1.css代码 table th { w ...

  3. 【文字识别】腾讯云API:提取表格数据并生成Excel文件

    一.使用工具及python包介绍 腾讯云API 国内大型互联网公司都提供云服务,如阿里.百度.腾讯等.本文选择腾讯云服务,是因为提供的API说明比较详细,看一遍就能用.更良心的是,提供了在线测试的功能 ...

  4. 根据数据批量生成excel文件

    第一步导入依赖: <!--excel支持--> <dependency><groupId>org.apache.poi</groupId><art ...

  5. 如何从Excel表格导入数据批量生成二维码

    目前二维码应用渐趋广泛,二维码具有储存量大.保密性高.追踪性高.抗损性强.备援性大.成本便宜等特性,这些特性特别适用于表单.安全保密.追踪.证照.存货盘点.资料备援等方面.那么我们怎么用条码打印软件从 ...

  6. 如何从Excel表格导入数据批量生成二维码 1

    目前二维码应用渐趋广泛,二维码具有储存量大.保密性高.追踪性高.抗损性强.备援性大.成本便宜等特性,这些特性特别适用于表单.安全保密.追踪.证照.存货盘点.资料备援等方面.那么我们怎么用条码打印软件从 ...

  7. ElementUI表格数据批量选中操作

    ElementUI表格数据批量选中操作 最近做项目时碰到个需求,要对表格中的数据批量处理,花了点时间最终解决了这个问题 elementui表格中封装了多选框,在el-column中选择type为sel ...

  8. Excel 数据批量生成SQL语句

    假设excel表格中有三列(A.B.C)数据,我们希望可以利用这三列数据批量生成SQL语句 第一步:新增D列,在D1中输入公式:=CONCATENATE("insert into user  ...

  9. 如何通过Excel数据批量生成DM码

    DM码指的就是最常用的Data Matrix 二维码,Data Matrix二维码原名Data code,是由美国国际资料公司于1989年发明.DM码需要选择编码容量大的二维码,而Data Matri ...

最新文章

  1. opencv根据直线方程求交点坐标
  2. 面试定心丸:AI知识点备忘录(包括ML、DL、Python、Pandas等)
  3. java 包含汉字,【转载】Java判断字符串中是不是包含汉字
  4. VS新建工程或者新建项时 出现未定义标识符号
  5. 第四章-分布式数据库HBase
  6. c语言溢出该怎么算,解决整数运算溢出方法——C语言
  7. php 修改html文件内容吗,请问你们怎么将html的文件的内容改变为php
  8. Java—BIO模型
  9. 牛客16589 机器翻译
  10. Docker上部署MariaDB
  11. shell变量(包含标准shell)
  12. LookupError: unknown encoding: cp65001及命令行无法输入中文问题(转)
  13. 【Hadoop Summit Tokyo 2016】基于Apache Spark的数据科学
  14. 今天加班做了昨天晚上要写的页面,用到了一些之前用过但还不熟悉需要上网搜索才能用的知识点:...
  15. 豆瓣9.4!《深度学习入门》笔记总结,带你从感知机入门深度学习!(连载)...
  16. linux学习之文件操作
  17. 使用线程池管理线程!
  18. HDU-1009 做个骑士,以梦为马
  19. 如何系统整理需求调研报告
  20. Android性能专项测试之Batterystats

热门文章

  1. JavaScript知识点-周2.md
  2. android中奖名单轮播,iOS模拟中奖名单循环滚动效果
  3. VUE 获奖名单滚动显示的两种方式
  4. CTF之萌新web学习(命令执行2)
  5. Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释【转】
  6. Line营销机器人2019版
  7. 强生单剂新冠疫苗对“德尔塔”有效;赛诺菲巴斯德将每年投资4亿欧元建mRNA疫苗中心 | 美通社头条...
  8. jpa mysql_Spring boot通过JPA访问MySQL数据库
  9. 微信、tim文件访问失败解决方法
  10. 个人开发者可以申请微信支付了