导出的使用
在web开发中,导出是很常见的一个功能,当我进行个人项目练习的时候,导出的时候无法控制列宽以及居中样式,后续发现导出插件无法进行修改,整个插件较为简便易懂的同时,对于EX的控制较为简陋,很多东西并不能设置,根据我的搜索,更改为ExcelJS插件来控制样式以及列宽,截止于现在,我们可以通过引用
<script src="https://cdn.jsdelivr.net/npm/exceljs@4.4.0/dist/exceljs.min.js"></script>
来获得对应的方法进行使用
在实现导出功能之前,我们需要对一些配置进行初始化。下面是配置对象的内容,其中包括了导出字段、表头映射、状态映射和样式配置等:
// 导出配置
const exportConfig = {// 选择导出的字段路径selectedHeaders: ["id","user.nickname","card","tel","depart.name","doctor_name","money","status","visit_status","order_code","create_time","yes_time",],// 表头映射关系customHeaders: {id: "订单ID","user.nickname": "就诊人",card: "就诊卡号",tel: "手机号","depart.name": "挂号科室",doctor_name: "医生姓名",money: "支付金额",status: "缴费状态",visit_status: "就诊状态",order_code: "订单号",create_time: "创建时间",yes_time: "最后缴费时间",},// 状态映射配置statusMappings: {status: {2: "欠费",1: "缴费完成",null: "未知",undefined: "未知",},visit_status: {2: "就诊中",1: "就诊完成",null: "未知",undefined: "未知",},},// 样式配置columnWidth: 18,styles: {header: {fill: {type: "pattern",pattern: "solid",fgColor: { argb: "FFD3D3D3" },},font: {bold: true,name: "微软雅黑",size: 12,},alignment: {vertical: "middle",horizontal: "center",},},body: {font: {name: "微软雅黑",size: 11,},alignment: {vertical: "middle",horizontal: "center",},},},
};
- selectedHeaders: 这是一个包含了需要导出的字段路径的数组。每个路径指向数据对象中的一个字段,可以是嵌套的字段(例如:"user.nickname")。
- customHeaders: 这是字段的映射,用于将字段路径映射到Excel表格中的实际表头名称。
- statusMappings: 配置字段状态的映射,如"缴费状态"和"就诊状态"的数值映射为具体的状态描述。
- styles: 设置Excel表格的样式,如字体、对齐方式、填充色等。
工具函数
为了从数据源中提取嵌套值,我们编写了以下工具函数:
getNestedValue
该函数用于从对象中根据路径提取嵌套的值:
function getNestedValue(obj, path) {return path.split(".").reduce((acc, key) => {if (acc === null || acc === undefined) return undefined;return acc[key];}, obj);
}
formatDate
该函数将时间戳转换为易读的日期格式:
数据处理与Excel生成
在数据导出的核心函数exportData中,我们首先对数据源进行有效性检查和预处理。数据的每一项都会通过配置进行映射和处理,特别是数字格式、日期格式和状态映射。
async function exportData(dataSource) {try {if (!dataSource || !Array.isArray(dataSource)) {throw new Error("无效的数据源");}if (dataSource.length === 0) {showAlerts(".ErrorModal", "5%", "警告:没有可导出的数据");return;}const processedData = dataSource.map((item) => {const rowData = {};exportConfig.selectedHeaders.forEach((fieldPath) => {const displayName = exportConfig.customHeaders[fieldPath];let rawValue = getNestedValue(item, fieldPath);// 状态映射处理if (exportConfig.statusMappings[fieldPath]) {rawValue =exportConfig.statusMappings[fieldPath][rawValue] ?? "未知状态";}// 特殊字段处理if (fieldPath === "money") {const numericString = String(rawValue).replace(/[^0-9.]/g, "");const numericValue = parseFloat(numericString);if (!isNaN(numericValue) && isFinite(numericValue)) {rawValue = numericValue;} else {rawValue = "金额异常";showAlerts(".ErrorModal", "5%", "金额异常");}}if (["create_time", "yes_time"].includes(fieldPath)) {rawValue = formatDate(rawValue);}// 默认空值处理if ([null, undefined, ""].includes(rawValue)) {rawValue = fieldPath.includes("time") ? "时间未记录" : "未知";}rowData[displayName] = rawValue;});return rowData;});// 创建Excel工作簿const workbook = new ExcelJS.Workbook();const worksheet = workbook.addWorksheet("门诊缴费记录", {properties: { tabColor: { argb: "FF00FF00" } },});// 添加表头const headers = Object.values(exportConfig.customHeaders);const headerRow = worksheet.addRow(headers);headerRow.eachCell((cell) => {cell.style = exportConfig.styles.header;});// 添加数据行processedData.forEach((dataItem) => {const rowValues = headers.map((header) => dataItem[header]);const dataRow = worksheet.addRow(rowValues);dataRow.eachCell((cell) => {cell.style = exportConfig.styles.body;});});// 设置列宽worksheet.columns = headers.map(() => ({width: 20,style: { numFmt: "@" },}));// 生成文件const buffer = await workbook.xlsx.writeBuffer();const blob = new Blob([buffer], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",});const downloadLink = document.createElement("a");downloadLink.href = URL.createObjectURL(blob);downloadLink.download = `门诊缴费记录_${new Date().toISOString().slice(0, 10)}_${hours}:${minutes}:${seconds}.xlsx`;document.body.appendChild(downloadLink);downloadLink.click();// 清理资源setTimeout(() => {URL.revokeObjectURL(downloadLink.href);downloadLink.remove();}, 1000);} catch (error) {console.error("导出过程中发生错误:", error);alert(`导出失败: ${error.message}`);}
}
核心步骤
- 数据预处理: 根据配置映射数据字段,并处理特殊字段(如金额、日期等)。
- Excel生成: 使用ExcelJS创建工作簿,并设置表头和数据行的样式。
- 导出功能: 生成Excel文件并通过Blob触发下载。
用户交互与事件处理
在页面交互中,我们提供了全选、反选和导出选中项/全部数据的功能。用户可以根据需求选择需要导出的数据,或选择导出全部数据。
事件处理代码
$(document).ready(function () {$(".select-all").on("change", function () {$(".row-checkbox").prop("checked", this.checked);});$(".choice_export").on("click", async function () {const selectedIndexes = $(".notice .checkbox_id input:checked").map(function () {return $(this).attr("dataIndex");}).get();if (selectedIndexes.length === 0) {showAlerts(".ErrorModal", "5%", "请至少选择一条有效记录");return;}try {const selectedData = globalData.filter((item) =>selectedIndexes.includes(item.id.toString()));await exportData(selectedData);showAlerts(".correctModal", "5%", `成功导出 ${selectedData.length} 条数据`, "success");} catch (error) {showAlerts(".ErrorModal", "5%", `导出失败: ${error.message}`, "error");}});$(".all_export").on("click", async function () {if (!globalData || globalData.length === 0) {showAlerts(".ErrorModal", "5%", "当前没有可导出的数据");return;}try {await exportData(globalData);showAlerts(".correctModal", "5%", "成功导出全部数据");} catch (error) {showAlerts(".ErrorModal", "5%", `导出失败: ${error.message}`, "error");}});
});
本文介绍了如何使用ExcelJS库进行数据导出,涵盖了如何处理数据映射、设置自定义表头、实现状态映射、格式化日期和金额、以及如何生成和下载Excel文件。通过这些步骤,你可以轻松实现复杂的Excel导出功能,并根据不同的业务需求进行调整和扩展。
相关文章:
导出的使用
在web开发中,导出是很常见的一个功能,当我进行个人项目练习的时候,导出的时候无法控制列宽以及居中样式,后续发现导出插件无法进行修改,整个插件较为简便易懂的同时,对于EX的控制较为简陋,很多东…...
博客图床 VsCode + PigGo + 阿里云OSS
关键字 写博客,图床,VsCode,PigGo,阿里云OSS 背景环境 我想把我在本地写的markdown文档直接搬到CSDN上和博客园上,但是图片上传遇到了问题。我需要手动到不同平台上传文件,非常耗费时间和经历。 为了解决…...
鸿蒙开源硬件:重构万物智联生态的底层基座与未来机遇
一、从生态裂变到产业重构:开源鸿蒙的崛起之路 自 2020 年开源至今,OpenHarmony 社区以惊人的发展速度重塑智能终端操作系统格局。数据显示,其代码量已从初始的 700 万行激增至 1.2 亿行,汇聚超 8200 名开发者及 70 余家核心共建…...
C++之list类及模拟实现
目录 list的介绍 list的模拟实现 定义节点 有关遍历的重载运算符 list的操作实现 (1)构造函数 (2)拷贝构造函数 (3)赋值运算符重载函数 (4)析构函数和clear成员函数 (5)尾…...
SwinTransformer 改进:添加DoubleAttention模块提升上下文语义提取能力
目录 1. DoubleAttention模块 2. SwinTransformer + DoubleAttention 3. 完整代码 Tips:融入模块后的网络经过测试,可以直接使用,设置好输入和输出的图片维度即可 1. DoubleAttention模块 DoubleAttention 是一种用于计算机视觉任务的注意力机制,旨在通过双重注意力机制…...
在Electron中实现实时下载进度显示的完整指南
在开发Electron应用时,提供良好的用户体验至关重要,尤其是在下载大文件时。用户需要知道下载进度、预计完成时间以及当前下载速度。本文将详细介绍如何在Electron应用中实现实时下载进度显示功能,从主进程到渲染进程的完整流程。 技术栈是ele…...
java生成一个可以下载的word文件
在 Java 里,你能够借助 Apache POI 库来生成 Word 文件,并且实现文件下载功能。下面为你详细介绍实现步骤和示例代码。 1. 添加依赖 若使用 Maven 项目,需在 pom.xml 里添加 Apache POI 的依赖: <dependencies><depen…...
MacBook部署达梦V8手记
背景 使用Java SpringBootDM开发Web应用,框架有License,OSX加载dll失败,安装了Windows 11,只有一个C盘,达梦安装后因为C盘权限问题,创建数据库失败,遂采用Docker容器方式部署。 下载介质 官网在…...
外贸 B2B 平台没落?多语言批发系统正在崛起
近年来,全球外贸行业正在发生快速变化,传统的 B2B 平台正面临越来越多的挑战,尤其是在面对新兴的多语言批发系统时。这种变化不仅影响了供应商和买家之间的交易方式,也正在推动外贸行业的数字化升级和转型。今天,让我们…...
[spring] Spring JPA - Hibernate 多表联查 1
[spring] Spring JPA - Hibernate 多表联查 之前在 [spring] spring jpa - hibernate 名词解释&配置 和 [spring] spring jpa - hibernate CRUD 简单的学习了一下怎么使用 Hibernate 实现 CRUD 操作,不过涉及到的部分都是逻辑上比较简单的实现——只在一张表上…...
鸿蒙Next开发实战教程—电影app
最近忙忙活活写了不少教程,但是总感觉千篇一律,没什么意思,大家如果有感兴趣的项目可以私信给幽蓝君写一写。 今天分享一个电影App。 这个项目也比较简单,主要是一些简单页面的开发和本地视频的播放以及横竖屏切换。 页面搭建以…...
共享栈 线程局部存储 线程互斥 线程同步 消费者生产者模型
共享栈 第一个主线程会在栈区 而当其他线程创建时实在共享区动态申请的栈区 线程局部存储 __thread 关键字 与编译有关 全局变量是被线程共享的 每个线程都能看到 修改 但是如果对该全局变量加上__thread关键字后 该全局变量就不会被共享 将变量在库中的每一个线程的属…...
停车场停车位数据集,标注停车位上是否有车,平均正确识别率99.5%,支持yolov5-11, coco json,darknet,xml格式标注
停车场停车位数据集,标注停车位上是否有车,平均正确识别率98.0%,支持yolov5-11, coco json,darknet,xml格式标注 数据集-识别停车场所有车辆的数据集 数据集分割 一共184张图片 训练组 89&am…...
【Go】运算符笔记
基本数学运算 Go 语言支持常见的 算术运算符,用于执行数学计算。 运算符说明加法-减法*乘法/除法%取余自增--自减 整数运算只能得到整数部分 package mainimport ("fmt""math" )func main() {go_math() }func go_math() {x, y : 8, 5fmt.Pr…...
ssm框架之mybatis框架讲解
1,Mybatis 1.1 Mybatis概述 1.1.1 Mybatis概念 MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发 MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2…...
CEF 多进程模式时,注入函数,获得交互信息
CEF 控制台添加一函数,枚举 注册的供前端使用的CPP交互函数有哪些-CSDN博客 上篇文章,是在模拟环境,单进程中设置的,这篇文章,将其改到正常多进程环境中设置。 对应于工程中的 CEF_RENDER项目 一、多进程模式中,改写 修改步骤 1、注入函数 client_app_render.cpp 在…...
Androidstudio出现警告warning:意外的元素
这些警告信息通常与 Android SDK 或系统镜像的配置文件有关,可能是由于 SDK 工具或系统镜像的版本不兼容或配置文件格式发生了变化。以下是解决这些警告的步骤: 1. 更新 Android SDK 工具 确保你使用的是最新版本的 Android SDK 工具: 打开…...
深入了解Linux —— git三板斧
版本控制器git 为了我们方便管理不同版本的文件,就有了版本控制器; 所谓的版本控制器,就是能够了解到一个文件的历史记录(修改记录);简单来说就是记录每一次的改动和版本迭代的一个管理系统,同…...
Vala编程语言教程-运算符
运算符 赋值操作。左操作数必须为标识符,右操作数必须为适当的值或引用。 , -, /, *, % 基础算术运算,作用于左右操作数。 运算符也可用于字符串拼接。 , -, /, *, % 左右操作数间算术运算,左操作数必须为标识符,运…...
C#本地将labelme数据集转换为机器视觉yolo数据集格式
C#本地,将labelme数据集转换为机器视觉yolo数据集格式 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.Encodings.Web; using System.Text.RegularExpressions; using System.Text.U…...
【软件系统架构】单体架构
一、引言 在软件开发的漫长历程中,架构的选择一直是至关重要的决策。单体架构作为一种经典的架构模式,曾经在许多项目中发挥着不可替代的作用。虽然如今微服务等架构逐渐流行,但理解单体架构对于深入掌握软件架构体系仍然有着重要意义。 二、…...
【求助】【建议放弃】【谷粒商城版】Kubernetes
本文作者: slience_me 文章目录 Kubernetes【谷粒商城版】【建议放弃】1. docker安装2. kubernetes安装前3. kubeadm,kubelet,kubectl3.1 简介kubeadmkubeletkubectl常用指令 3.2 安装3.3 kubeadm初始化3.4 加入从节点(工作节点)3.5 安装Pod网络插件(CNI…...
uniapp 实现微信小程序电影选座功能
拖动代码 /*** 获取点击或触摸事件对应的座位位置* 通过事件对象获取座位的行列信息* param {Event|TouchEvent} event - 点击或触摸事件对象* returns {Object} 返回座位位置对象,包含行(row)和列(col)信息,若未找到有效位置则返回 {row: -1, col: -1}*…...
python+flask实现360全景图和stl等多种格式模型浏览
1. 安装依赖 pip install flask 2. 创建Flask应用 创建一个基本的Flask应用,并设置路由来处理不同的文件类型。 from flask import Flask, render_template, send_from_directory app Flask(__name__) # 设置静态文件路径 app.static_folder static app.r…...
IntelliJ 配置文件plugin.xml
在 IntelliJ IDEA 插件开发中,plugin.xml 是插件的配置文件,它包含了关于插件的所有基本信息、扩展点、依赖关系等。该文件使用 XML 格式进行定义。以下是 plugin.xml 中常见的元素及其用途: <idea-plugin><!-- 插件的基本信息 --&…...
C# Unity 唐老狮 No.10 模拟面试题
本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho C# 1. 内存中,堆和…...
数据库系统——规范化1NF~BCNF
数据库规范化完全指南:从零到BCNF,中学生也能秒懂!📚✨ 一、什么是数据库规范化? 科学定义 🔍 数据库规范化是通过一系列规则(范式)将数据库表结构分解为更小、更高效、无冗余的表…...
第十五届蓝桥杯2024JavaB组省赛试题A:报数游戏
简单的找规律题目。题目给得数列,第奇数项是20的倍数,第偶数项时24的倍数。题目要求第n 202420242024 项是多少。这一项是偶数,所以答案一定是24的倍数,并且偶数项的个数和奇数项的个数各占一半,所以最终的答案ans( n…...
Matlab 汽车二自由度转弯模型
1、内容简介 Matlab 187-汽车二自由度转弯模型 可以交流、咨询、答疑 2、内容说明 略 摘 要 本文前一部分提出了侧偏角和横摆角速度作为参数。描述了车辆运动的运动状态,其中文中使用的参考模型是二自由度汽车模型。汽车速度被认为是建立基于H.B.Pacejka的轮胎模…...
关于 2>/dev/null 的作用以及机理
每个进程都有三个标准文件描述符:stdin(标准输入)、stdout(标准输出)和stderr(标准错误)。默认情况下,stderr会输出到终端。使用2>可以将stderr重定向到其他地方,比如…...
