首页 > 其他分享 >SheetJs 导出数据

SheetJs 导出数据

时间:2023-12-21 15:58:32浏览次数:27  
标签:index worksheet utils 单元格 导出 SheetJs list range 数据

1.Excel数据导出

根据后端数据导出

数据源样式

list = [     { code: '610230', name: '长尺', num: 2, price: 3.5, amount: 7, type: 1, status: 2 },     { code: '610230', name: '圆规', num: 6, price: 5, amount: 30, type: 1, status: 1 },     { code: '610230', name: '板材12*12', num: 100, price: 23.5, amount: 2350, type: 1, status: 2 }   ];

导出

exportBasicInfo(list: any[]) {
    let datas = [];
    //根据数据源中数据列名来定义展示的顺序
    const header = [
      'index',
      'code',
      'name',
      'num',
'price', 'amount' ]; //#region 表头组合 根据header中选中显示的数据列来对应定义数据表中列显示的数据 const headerDisplay1 = { index: `XXXX${DateTime.fromJSDate(new Date()).toFormat('MM')}-月盘点` }; //#endregion //#region 表尾 const headerDisplay2 = { index: '序号', code: '编码', name: '名称', num: '数量',
price: '单价', amount: '金额' }; const endDisplay = { code: '制表人:', amount: '审核人:' }; //#endregion //增加序号列,若源数据中含有header中定义以外的数据列,且不展示,需要将其他数据列移除掉 for (let index = 0; index < list.length; index++) { datas.push({ index: index + 1, code: list[index].gode, name: list[index].name, num: list[index].num,
price: list[index].price, amount: list[index].amount }); } //表头要放数据数组的前面,表尾要放在数据数组的后面 const newData = [headerDisplay1, headerDisplay2, ...datas, endDisplay]; //header与datas中的属性对应,skipHeader为true表示忽略原来的表头(忽略源数据datas中除header以外的数据表头) var worksheet = utils.json_to_sheet(newData, { header: header, skipHeader: true }); //第一行标题 this.setCellStyle(worksheet, 0, 0, 0, 5, '16', true); //第二行标题 this.setCellStyle(worksheet, 1, 1, 0, 5, '12', true); //数据行 this.setCellStyle(worksheet, 4, 4 + datas.length - 1, 0, 5, '9', false); //末尾行 this.setCellStyle(worksheet, 4 + datas.length, 4 + datas.length, 0, 5, '9', true); //表格样式 this.initSheetStyle(worksheet); /* 生成Excel文件 */ var workbook = utils.book_new(); /* 将工作簿添加到工作簿集合中 */ utils.book_append_sheet(workbook, worksheet, `${DateTime.fromJSDate(new Date(form.stockTakingDate)).toFormat('yyyy-MM-dd')}盘点表`); /* 导出Excel文件 */ writeFile(workbook, `备品备件${DateTime.fromJSDate(new Date(form.stockTakingDate)).toFormat('MM')}-月盘点.xlsx`); }

单元格样式

 /**
   * 设置单元格样式
   * @param worksheet 工作单元
   * @param firstRow 开始行
   * @param lastRow 结束行
   * @param firstCol 开始列
   * @param lastCol 结束列
   * @param font 字号
   * @param blod 是否加粗
   */
  setCellStyle(worksheet: WorkSheet, firstRow, lastRow, firstCol, lastCol, font, blod) {
    //金额列
    var cols1 = new Set([4, 5]);
    for (var i = firstRow; i <= lastRow; i++) {
      for (var j = firstCol; j <= lastCol; j++) {
        //根据单元格地址转换为A1样式
        var cell = utils.encode_cell({ c: j, r: i });
        if (worksheet[cell]) {
          worksheet[cell].s = {
            font: {
              sz: font,
              bold: blod
            },
            alignment: {
              horizontal: 'center',
              vertical: 'center'
              //是否自动换行 默认值false
              //   wrapText: true
            },
            border: {
              top: { style: 'thin' },
              right: { style: 'thin' },
              bottom: { style: 'thin' },
              left: { style: 'thin' }
            },
            //'@' 文本格式 第三行开始4、5列以金额格式显示,第3列以数字格式展示
            numFmt: i > 1 && cols1.has(j)? '0.00' : i > 1 && j==3 ? '0' : '@'
          };
        } else {
          //为空的单元格设置空值并加上边框
          worksheet[cell] = {
            s: {
              border: {
                top: { style: 'thin' },
                right: { style: 'thin' },
                bottom: { style: 'thin' },
                left: { style: 'thin' }
              }
            },
            v: ''
          };
        }
      }
    }
  }

表格样式

initSheetStyle(worksheet: WorkSheet) {
    //列宽
    worksheet['!cols'] = [
      { wpx: 80 }, //设置第1列列宽为80像素
      { wpx: 100 },
      { wpx: 100 },
      { wpx: 80 },
      { wpx: 80 },
      { wpx: 80 }
    ];
    //行高
    worksheet['!rows'] = [{ hpx: 21 }, { hpx: 20 }];
//合并单元格 //获取工作表的范围 const range = utils.decode_range(worksheet['!ref']); worksheet['!merges'] = [ { s: { c: 0, r: 0}, //A1 e: { c: 5, r: 0} //F1 }, //末尾行 { s: { c: 0, r: range.e.r - 1 }, e: { c: 1, r: range.e.r - 1 } } ]; }

合并单元格的另外一种方式,通过单元格名称指定单元格区域

 //表示合并第一行的第1列到第6列
 worksheet['!merges'].push(utils.decode_range('A1:F1'));

单元格地址转换

根据单元格行列序号转换为A1样式

//转换为A2
var a1_addr = XLSX.utils.encode_cell({r:1, c:0});

将A1样式转换单元格为行号列号

//{c: 0, r: 1}
var address = XLSX.utils.decode_cell("A2");

单元格区域转换

根据单元格行列序号转换为A1样式区域

//A1:D3
var a1_range = XLSX.utils.encode_range({ s: { c: 0, r: 0 }, e: { c: 3, r: 2 } });

将A1样式转换单元格区域行号列号

//{ s: { c: 0, r: 0 }, e: { c: 3, r: 2 } }
 var range = XLSX.utils.decode_range("A1:D3");

 

标签:index,worksheet,utils,单元格,导出,SheetJs,list,range,数据
From: https://www.cnblogs.com/sugarwxx/p/17919248.html

相关文章

  • SheetJs 导入数据
    html<a(click)="import()">导入</a><input#importExcelInput[hidden]="true"type="file"(change)="onFileChange($event)"multiple="false"/>tsimport(){letinput=this.importE......
  • 一些数据可以验证测试使用功能的
    INSERTINTOoffline_news(id,status,create_time)VALUES(15455114757359,0,"),2023-08-3111:24:43"),);INSERTINTOoffline_news(id,status,create_time)VALUES(24709425874357,0,"),2023-08-3111:24:43"),);INSERTINTOofflin......
  • 前端导出export2Excel-多级表头
    1,export2Excel.js/*eslint-disable*///import{saveAs}from"file-saver";constsaveAs=require("file-saver");//importXLSXfrom"xlsx";importXLSXfrom"yxg-xlsx-style";importmomentfrom"moment&qu......
  • 大模型:高质量对话数据生成,Enhancing Chat Language Models by Scaling High-quality I
    EnhancingChatLanguageModelsbyScalingHigh-qualityInstructionalConversations论文地址1.导读不少工作已经意识到ChatGPT的秘密在于将指令微调和对其微调做到了极致,是继GPT-3后的又一次大力出奇迹。这篇文章来自清华大学5月份的工作,目的在于生成高质量的指令微调......
  • MDM主数据平台如何实现质量管控
    当企业业务以及信息化建设发展到一定阶段后,都不可避免地要进行信息化和数据的治理工作,而主数据治理则是数据治理的基础。随着信息系统和业务的增加,系统打通与数据集成共享必然会成为企业信息化建设的瓶颈,而要实现系统集成,就要保证系统中共享数据的准确性,而主数据就是最重要的共享数......
  • MDM主数据平台如何管理参考数据
    MDM基础数据管理平台是进行清洗和治理企业的主数据,使企业的主数据具有唯一性、准确性、一致性、及时性,通过主数据数据清洗功能将错误数据和重复数据进行清洗,从而保证企业数据能够做到以上那几点,然后再分发至下游系统,使企业信息化更加完善。MDM主数据管理平台作为数通的一款核心产品......
  • Matlab 之 数据元素访问
    Matlab的含义是矩阵实验室,其特征之一就是数据的向量化操作,借此提升软件运行效率。那么,必然会涉及数据元素的访问。Matlab主要支持下面一些形式的访问:(1)array-inde:A(i)(2)cell-index:C{i}(3)structfield:S.fieldname不同的访问方式,效率差别很大,我们以单个元素或者域的访问为例,探讨......
  • 数据类型
     ......
  • IoTDB数据库的使用
    网址:https://iotdb.apache.org/zh/快速上手https://iotdb.apache.org/zh/UserGuide/V1.2.x/QuickStart/QuickStart.html服务端服务端的下载页面:https://iotdb.apache.org/Download/我下载了最新的1.2.2版本。下载完整后执行批处理文件:sbin\start-standalone.bat运行时报......
  • PageOffice保存文件同时保存文件中的数据
    转载:保存数据区域数据同时保存文档保存数据区域数据同时保存文档本示例关键代码的编写位置Vue+Springboot注意本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名等做适当修改即可使用。在实际应用中,例如在线签订合同的时候,合同的签订日期,......