xlsx-js-style前端组装表格数据下载到本地

news/2024/11/18 12:15:29/文章来源:https://www.cnblogs.com/shyhuahua/p/18374376

1.数据格式:

对象:key/value

const data1 = {'合同 主体信息':'{\n  "合同编号": "FWTsAEY-S1T-2023-01",\n  "项目编号": "FTCG2023000265A",\n  "项目名称": "福田区第二人民医院食堂服务采购项直",\n  "总计/价款": "6,200,000.00元/年",\n  "甲方(采购)单位": "深圳市福田区第二人民医院",\n  "甲方法定代表人": "赵蓉",\n  "甲方单位地址": "深圳市福田区上梅林中康路25、27号,梅林街道龙尾社区梅亭路1号4栋",\n  "乙方(供应)单位": "深圳市润浣餐饮服务管理有限公司",\n  "乙方法定代表人": "刘鹏飞",\n  "乙方单位地址": "深圳市福田区沙头街道天安社区泰然八路深业泰然大厦24C01,24C02-1",\n  "合同签订时间": "2023年8月2日"\n}','中标 主体信息':'{\n  "项目编号": "FWCGHTCG2023000265",\n  "项目名称": "福田区第二人民医院食堂服务采购",\n  "中标金额": "0.98",\n  "甲方(采购)单位": "深圳市福田区第二人民医院",\n  "甲方单位地址": "深圳市福田区上梅林中康路27号",\n  "乙方(供应)单位": "深圳市润沅餐饮服务管理有限公司",\n  "乙方单位地址": "深圳市福田区沙头街道天安社区泰然八路深业泰然大厦24C01、24C02-1",\n  "通知书发布时间/公告期限": "2023年08月09日至2023年08月12日",\n  "合同签订事宜": null\n}','合同-中标 主体信息一致性比对': '{\n  "偏离情况": "无偏离",\n  "判断依据": "中标主体信息与合同主体信息均为undefined,无法进行有效对比"\n}',
};

2. 实现效果如图(包含表格样式)

(1)纵向的表格

(2)横向的表格

3. 具体实现

  • 用到插件  "xlsx-js-style": "^1.2.0" + vue3
  • 下载:npm install xlsx-js-style
  • 引入:

 

import * as XLSXStyle from 'xlsx-js-style';

 

具体代码:

  • html:
<el-button type="primary" @click="exportToExcel(data1)">导出</el-button>
  • 源数据:
const data1 = {'合同 主体信息':'{\n  "合同编号": "FWTsAEY-S1T-2023-01",\n  "项目编号": "FTCG2023000265A",\n  "项目名称": "福田区第二人民医院食堂服务采购项直",\n  "总计/价款": "6,200,000.00元/年",\n  "甲方(采购)单位": "深圳市福田区第二人民医院",\n  "甲方法定代表人": "赵蓉",\n  "甲方单位地址": "深圳市福田区上梅林中康路25、27号,梅林街道龙尾社区梅亭路1号4栋",\n  "乙方(供应)单位": "深圳市润浣餐饮服务管理有限公司",\n  "乙方法定代表人": "刘鹏飞",\n  "乙方单位地址": "深圳市福田区沙头街道天安社区泰然八路深业泰然大厦24C01,24C02-1",\n  "合同签订时间": "2023年8月2日"\n}','中标 主体信息':'{\n  "项目编号": "FWCGHTCG2023000265",\n  "项目名称": "福田区第二人民医院食堂服务采购",\n  "中标金额": "0.98",\n  "甲方(采购)单位": "深圳市福田区第二人民医院",\n  "甲方单位地址": "深圳市福田区上梅林中康路27号",\n  "乙方(供应)单位": "深圳市润沅餐饮服务管理有限公司",\n  "乙方单位地址": "深圳市福田区沙头街道天安社区泰然八路深业泰然大厦24C01、24C02-1",\n  "通知书发布时间/公告期限": "2023年08月09日至2023年08月12日",\n  "合同签订事宜": null\n}','合同-中标 主体信息一致性比对': '{\n  "偏离情况": "无偏离",\n  "判断依据": "中标主体信息与合同主体信息均为undefined,无法进行有效对比"\n}',
};
  • 横向表格代码:
//  导出表格 --- 横向排布的
function exportToExcel2(data) {console.log('表格数据组装', data);const borderStyle = {top: { style: 'thin', color: { rgb: '000000' } },right: { style: 'thin', color: { rgb: '000000' } },bottom: { style: 'thin', color: { rgb: '000000' } },left: { style: 'thin', color: { rgb: '000000' } },};const headerStyle = {font: { bold: true },fill: { fgColor: { rgb: 'e6f4ff' } },alignment: { vertical: 'center', horizontal: 'center' },border: borderStyle,};const contentStyle = {font: { bold: false },border: borderStyle,alignment: { wrapText: true, vertical: 'top', horizontal: 'left' },};// 构建表格数据const headers = ['标题', ...Object.keys(data)];const contents = ['内容', ...Object.values(data)];const sheetData = [headers, contents];const worksheet = XLSXStyle.utils.aoa_to_sheet(sheetData);// 设置单元格样式// 设置标题样式for (let col = 0; col < headers.length; col++) {const cell = worksheet[XLSXStyle.utils.encode_cell({ r: 0, c: col })];cell.s = headerStyle;}// 设置内容样式for (let col = 0; col < contents.length; col++) {const cell = worksheet[XLSXStyle.utils.encode_cell({ r: 1, c: col })];cell.s = col === 0 ? headerStyle : contentStyle; // 第一列使用 headerStyle,其他列使用 contentStyle
    }// 设置列宽worksheet['!cols'] = [{ wch: 25 }, // 第一列宽度固定为50...Array(headers.length - 1).fill({ wch: 80 }), // 其他列宽度固定为200
    ];// 设置行高worksheet['!rows'] = [{ hpx: 30 }, // 标题行高度{ hpx: 300 }, // 内容行高度
    ];const workbook = XLSXStyle.utils.book_new();XLSXStyle.utils.book_append_sheet(workbook, worksheet, '比对结果');XLSXStyle.writeFile(workbook, '比对结果表格.xlsx');proxy.$modal.msgSuccess('比对结果已下载到本地');
}
  • 纵向表格代码:
//  导出表格 --- 纵向排布的
function exportToExcel(data) {const borderStyle = {top: { style: 'thin', color: { rgb: '000000' } },right: { style: 'thin', color: { rgb: '000000' } },bottom: { style: 'thin', color: { rgb: '000000' } },left: { style: 'thin', color: { rgb: '000000' } },};const headerStyle = {font: { bold: true },fill: { fgColor: { rgb: 'e6f4ff' } },alignment: { vertical: 'center', horizontal: 'center' },border: borderStyle,};const contentStyle = {font: { bold: false },border: borderStyle,alignment: { wrapText: true, vertical: 'top', horizontal: 'left' },};const sheetData = [[{ v: '标题', s: headerStyle },{ v: '内容', s: headerStyle },],...Object.entries(data).map(([key, value]) => [{ v: key, s: headerStyle },{ v: value, s: contentStyle },]),];const worksheet = XLSXStyle.utils.aoa_to_sheet(sheetData);// 设置列宽worksheet['!cols'] = [{ wch: 40 }, { wch: 100 }];// 设置行高worksheet['!rows'] = [{ hpx: 40 }, // 标题行高度
    ];const workbook = XLSXStyle.utils.book_new();XLSXStyle.utils.book_append_sheet(workbook, worksheet, '比对结果');XLSXStyle.writeFile(workbook, '比对结果表格.xlsx');proxy.$modal.msgSuccess('比对结果已下载到本地');
}

 

 

 

 

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

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

相关文章

Cookie,Session Filter,Listener详解

HTTP请求的无状态性HTTP的无状态性是其一个重要的特征,指的是HTTP协议本身并不保留客户端与服务器交互的历史信息,换而言之,即每次的HTTP请求都是独立的,服务器在处理每一个请求时都不会记住前一个请求的状态无状态的含义独立性:每次的HTTP请求都是独立的,不依赖于之前的请求,即…

探索风扇产品模型的3D可视化魅力

在这个科技日新月异的时代,每一个细微的创新都能为我们的生活带来前所未有的便捷与享受。今天,就让我们一起踏入一场视觉与科技的盛宴,探索风扇产品模型如何通过3D可视化技术,重新定义家居生活的舒适与美学。想象一下,在炎炎夏日,你无需亲临实体店,只需轻点鼠标或滑动指…

Tree组件的快速定位更新节点的状态,以及修改节点的数据属性等操作

当我们点击树节点的时候我们常常只能获得树的id,那么我么如何获快速定位到树节点的内容呢,除此之外,当树已经存在时,但是缺少我们想要的内容时,我们想在树节点上添加我们需要的额外的内容时该怎么办,那么就是用以下方法可以快速定位到我们需要的节点并可以快速添加内容当…

供应链管理系统(SCM) —— 企业物流的智能枢纽

SAP 供应链管理系统以打造数字化和集成化的供应链管理平台为使命,将传统的仓储管理系统、制造执行系统、产品管理系统等软件进行升级和上云管理,为企业提供面向客户、合作伙伴及员工的数字化SCM系统平台。SAP SCM系统从设计到运维,全面优化供应链,规避风险 供应链管理模式日…

Flannel IPsec 模式

Flannel IPsec 模式Flannel IPSec 模式 一、环境信息主机 IPubuntu 172.16.94.141软件 版本docker 26.1.4helm v3.15.0-rc.2kind 0.18.0clab 0.54.2kubernetes 1.23.4ubuntu os Ubuntu 20.04.6 LTSkernel 5.11.5 内核升级文档二、安装服务 kind 配置文件信息 $ cat install.sh#…

[Mysql]执行一条语句的过程

执行一条 select 语句,期间发生了什么? 学习 SQL 的时候,大家肯定第一个先学到的就是 select 查询语句了,比如下面这句查询语句: // 在 product 表中,查询 id = 1 的记录 select * from product where id = 1;但是有没有想过,MySQL 执行一条 select 查询语句,在 MySQL …

Free Online 1080P Youtube Video Downloader All In One

Free Online 1080P Youtube Video Downloader All In One 免费在线 1080P Youtube 视频下载器IELTS 雅思Free Online 1080P Youtube Video Downloader All In One免费在线 1080P Youtube 视频下载器https://yt5s.io/en93https://yt5s.biz/enxj100/ demosIELTS 雅思https://www.…

基于UltraScaleKU115的高性能PCIe3.0 x8-FMC+接口卡

基于UltraScaleKU115的高性能PCIe3.0 x8-FMC+接口卡,是一款高性能的PCIe 3.0 X8板卡。主控芯片采用Xilinx 公司Kintex UltraScale系列FPGA 家族中的XCKU115-FLVA1517(兼容XCKU085-FLVA1517)。板卡含有2 组共8GB(单组4GB)的DDR4 内存颗粒,支持JTAG 口和QSFP+光纤接口以及F…

数字集成电路设计实践 IIC-Slave接口芯片的全流程设计

数字集成电路设计实践 IIC-Slave接口芯片的全流程设计 一、 芯片设计方案 IIC原理 1. I2C协议 I2C协议由Philips公司推出。 1.1. 端口名称及含义 标准I2C只有2根信号线。 SCL:Serial CLock:串行时钟线,由主机产生并分享给从机。 SDA:Serial DAta:串行数据线,连接在主从机…

反序列化刷题(二)

反序列化刷题 web259(SSRF) 1、explod(,,"hello,ju,hey"):把字符串以逗号为判断点分为若干个数组,hello ju hey 2、array_pop($x):删除数组中的最后一个元素1、$_SERVER[HTTP_X_FORWARDED_FOR]用来获取数据包的IP地址;我们目标要ip=127.0.0.1; 这里可以用x-fo…

POD基本操作

一.Pod生命周期 在Kubernetes中,Pod的生命周期经历了几个重要的阶段。下面是Pod生命周期的详细介绍: 1.Pending(待处理):调度: Pod被创建后,首先进入“Pending”状态。此时,Kubernetes的调度器(Scheduler)会选择一个合适的节点来运行Pod。资源分配: 在调度器选择了节点…

C++ SPFA算法解析

前言 将了解 C++ 求最短路中 SPFA 的算法 SPFA SPFA的一些说明 SPFA:适用于权值有负值,且没有负圈的图的单源最短路径,论文中的复杂度O(kE),k为每个节点进入Queue的次数,且k一般<=2,但此处的复杂度证明是有问题的,其实SPFA的最坏情况应该是O(VE).! 引例: 输入格式 给…