前端导出excel,前端纯数据导出excel

非常符合前端直接的使用

使用

先看看使用

表格数据

const tableData = [{"id": 1,"firstName": "John","lastName": "Doe","email": "john.doe@example.com","age": 28,"address": { "street": "123 Main St", "city": "Springfield", "state": "IL", "zip": "62701" }},{"id": 2,"firstName": "Jane","lastName": "Smith","email": "jane.smith@example.com","age": 34,"address": { "street": "456 Elm St", "city": "Shelbyville", "state": "IL", "zip": "62565" }},{"id": 3,"firstName": "Bob","lastName": "Johnson","email": "bob.johnson@example.com","age": 23,"address": { "street": "789 Oak St", "city": "Ogdenville", "state": "IL", "zip": "62075" }}
]

使用方法

// 导出方法
exportExcel(tableData, // 你的表格数据[{title: 'ID', // 表头wpx: 120, // 宽度render: row => row.id, // 你要渲染的数据},{title: '邮箱', // 表头render: row => row.email, // 你要渲染的数据},{title: '年龄',wpx: 120,render: row => (row.age < 18 ? '未成年' : '成年了'),},{title: '地址',wpx: 300,render: row => row.address.street + '/' + row.address.city,},],'用户数据.xlsx' // 导出的表名)

封装

我们使用 xlsx 库的导出 Excel 功能

  1. 使用表格数据: tableData 作为数据源,你通过一个配置对象数组定义了如何渲染每一列。每个配置对象包括表头、宽度和渲染函数等信息。

  2. 渲染函数: 通过 render 函数,你可以对每一行的数据进行自定义渲染,例如年龄列的情况,你区分了未成年和成年人。

  3. 列宽度: 通过 wpx 属性,你可以为每一列设置特定的宽度。

  4. 动态导入: 你使用了动态导入 (import('xlsx').then(XLSX => {...})) 来导入 xlsx 库,这有助于代码分割和按需加载,提高了前端应用的性能。

  5. 文件名: 导出的文件名可以作为函数的参数传入,使其具有更好的灵活性。

安装xlsx

npm install xlsx -S

获取列名

通过 getColumnName来

function getColumnName(n) {let columnName = "";while (n > 0) {const index = (n - 1) % 26;columnName = String.fromCharCode(65 + index) + columnName;n = Math.floor((n - 1) / 26);}return columnName;
}getColumnName(1) // 返回 'A'getColumnName(27) // 返回 'AA'

获取文本的宽度,用来给列的,要不然会出现列没有宽度的情况

const getWordCh = (val) => {/* 先判断是否为null/undefined */// eslint-disable-next-line eqeqeqif (val == null) {return 10;} else if (val.toString().charCodeAt(0) > 255) {/* 再判断是否为中文 */return val.toString().length * 2;} else {return val.toString().length;}
};

导出封装

import("xlsx") 动态引入 xlsx

const exportExcel = (dataSource, columns, filename) => {import("xlsx").then((XLSX) => {const sheet = {};const defaultColumnCh = new Array(columns.length || 2);const cols = [];columns.forEach((item, index) => {const letter = getColumnName(index + 1);sheet[`${letter}1`] = { v: item.title };defaultColumnCh[index] = 0;});dataSource.forEach((item, rowIndex) => {columns.forEach((column, columIndex) => {// @ts-ignore next-lineconst value = column.render ? column.render(item) : item[column.field];const letter = getColumnName(columIndex + 1);sheet[letter + (rowIndex + 2)] = { v: value };defaultColumnCh[columIndex] = Math.max(defaultColumnCh[columIndex] || 0,getWordCh(value));});});columns.forEach((item, index) => {// @ts-ignore next-lineconst { render, title, field, ...ret } = item;cols.push({wch: Math.max(defaultColumnCh[index] || 0, getWordCh(title)),...ret,});});// 获取所有单元格的位置const outputPos = Object.keys(sheet);// 计算出范围 ,["A1",..., "H2"]const ref = `${outputPos[0]}:${outputPos[outputPos.length - 1]}`;sheet["!cols"] = cols;sheet["!ref"] = ref;console.log(" sheet: ", sheet);// 导出 ExcelXLSX.writeFileXLSX({SheetNames: ["Sheet1"],Sheets: {Sheet1: sheet,},},filename);});
};

完整代码


/*** 获取列名@param {number}n 第几列,从1开始
@examplegetColumnName(1) // 返回 'A'getColumnName(27) // 返回 'AA'*/
function getColumnName(n) {let columnName = "";while (n > 0) {const index = (n - 1) % 26;columnName = String.fromCharCode(65 + index) + columnName;n = Math.floor((n - 1) / 26);}return columnName;
}const getWordCh = (val) => {/* 先判断是否为null/undefined */// eslint-disable-next-line eqeqeqif (val == null) {return 10;} else if (val.toString().charCodeAt(0) > 255) {/* 再判断是否为中文 */return val.toString().length * 2;} else {return val.toString().length;}
};/*** 导出excel* @exampleexportExcel(tableData, // 你的表格数据[{title: 'ID', // 表头wpx: 120, // 宽度render: row => row.id, // 你要渲染的数据},{title: '邮箱', // 表头render: row => row.email, // 你要渲染的数据},{title: '年龄',wpx: 120,render: row => (row.age < 18 ? '未成年' : '成年了'),},{title: '地址',wpx: 300,render: row => row.address.street + '/' + row.address.city,},],'用户数据.xlsx' // 导出的表名)
*/
export const exportExcel = (dataSource, columns, filename) => {import("xlsx").then((XLSX) => {const sheet = {};const defaultColumnCh = new Array(columns.length || 2);const cols = [];columns.forEach((item, index) => {const letter = getColumnName(index + 1);sheet[`${letter}1`] = { v: item.title };defaultColumnCh[index] = 0;});dataSource.forEach((item, rowIndex) => {columns.forEach((column, columIndex) => {// @ts-ignore next-lineconst value = column.render ? column.render(item) : item[column.field];const letter = getColumnName(columIndex + 1);sheet[letter + (rowIndex + 2)] = { v: value };defaultColumnCh[columIndex] = Math.max(defaultColumnCh[columIndex] || 0,getWordCh(value));});});columns.forEach((item, index) => {// @ts-ignore next-lineconst { render, title, field, ...ret } = item;cols.push({wch: Math.max(defaultColumnCh[index] || 0, getWordCh(title)),...ret,});});// 获取所有单元格的位置const outputPos = Object.keys(sheet);// 计算出范围 ,["A1",..., "H2"]const ref = `${outputPos[0]}:${outputPos[outputPos.length - 1]}`;sheet["!cols"] = cols;sheet["!ref"] = ref;console.log(" sheet: ", sheet);// 导出 ExcelXLSX.writeFileXLSX({SheetNames: ["Sheet1"],Sheets: {Sheet1: sheet,},},filename);});
};

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

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

相关文章

Detector定位算法在FPGA中的实现——section1 原理推导

关于算法在FPGA中的实现&#xff0c;本次利用业余的时间推出一个系列章节&#xff0c;专门记录从算法的推导、Matlab的实现、FPGA的移植开发与仿真做一次完整的FPGA算法开发&#xff0c;在此做一下相关的记录和总结&#xff0c;做到温故知新。 这里以Detector在Global Coordina…

Ansible从入门到精通【六】

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 专栏名称&#xff1a;Ansible从入门到精通 立志成为ansible大佬 ansible templates 模板&#xff08;templa…

flask处理token的装饰器

以下是在 Flask 中基于 token 实现的登录验证装饰器的示例代码&#xff1a; import jwt from functools import wraps from flask import request, jsonify, current_appdef login_required(f):wraps(f)def decorated_function(*args, **kwargs):token request.headers.get(A…

深入理解设计模式面经

1 讲讲工厂方法模式&#xff0c; 1.1 给我一个java的demo 工厂方法模式是一种创建型设计模式&#xff0c;它提供了一个接口用于创建对象&#xff0c;但允许子类修改将要创建的对象类型。这种模式抽象了对象的创建过程&#xff0c;使得代码可以在不知道创建的对象具体类的情况…

利用状态监测和机器学习提高冷却塔性能的具体方法

在现代工业生产中&#xff0c;冷却塔扮演着至关重要的角色&#xff0c;它们的性能直接影响着工艺流程的稳定性和效率。为了确保冷却塔的正常运行和减少系统故障&#xff0c;状态监测和机器学习成为了关键技术。 图.冷却塔&#xff08;PreMaint&#xff09; 在前文《基于人工智…

MySQL_约束、多表关系

约束 概念&#xff1a;就是用来作用表中字段的规则&#xff0c;用于限制存储在表中的数据。 目的&#xff1a;保证数据库中数据的正确性&#xff0c;有效性和完整性。 约束演示 #定义一个学生表&#xff0c;表中要求如下&#xff1a; #sn 表示学生学号&#xff0c;要求使用 …

Python测试框架pytest:常用参数、查找子集、参数化、跳过

Pytest是一个基于python的测试框架&#xff0c;用于编写和执行测试代码。pytest主要用于API测试&#xff0c;可以编写代码来测试API、数据库、UI等。 pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要有以下几个优点&#xff1a; 简单灵活&#xff0c;容易上手。…

【input】关于input 元素的type类型及相关作用

传统类型&#xff1a; text&#xff1a;用于输入单行文本。 <input type"text" name"username">password&#xff1a;用于输入密码&#xff0c;输入的内容会被隐藏。 <input type"password" name"password">checkbox&a…

React Native 样式布局基础知识

通过此篇笔记能够学习到如下的几个知识点 在 React Native 中使用样式的一些细节了解 React Native 的 Flex 布局概念了解 React Native 的 flex 布局属性React Native 如何添加多样式属性React Native 中绝对布局和相对布局 React Native 中的 Flex 布局概念 1、主轴和交叉…

树莓派命令行运行调用音频文件的函数,不报错,没有声音解决办法

树莓派接上音频首先需要切换音频不是HDMI&#xff0c;然后可以双击运行wav文件可以播放&#xff0c;但是&#xff1a; 命令行直接运行wav文件报错&#xff1a; Playing WAVE twzc.wav : Signed 16 bit Little Endian, Rate 16000 Hz, Mono命令行运行main方法也是无法播放&am…

用excel格式书写的接口用例执行脚本

创建测试用例和测试结果集文件夹&#xff1a; excel编写的接口测试用例如下&#xff1a; 1 encoding 响应的编码格式。所测项目大部分是utf-8&#xff0c;有一个特殊项目是utf-8-sig 2 params 对应requests的params 3 data&#xff0c;对应requests的data 有些参数是动态的&a…

1034:计算三角形面积

【题目描述】 平面上有一个三角形&#xff0c;它的三个顶点坐标分别为(x1,y1),(x2,y2),(x3,y3)&#xff0c;那么请问这个三角形的面积是多少&#xff0c;精确到小数点后两位。 【输入】 输入仅一行&#xff0c;包括6个单精度浮点数&#xff0c;分别对应x1,y1,x2,y2,x3,y3。 …

java+springboot+mysql小区宠物管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的小区宠物管理系统&#xff0c;系统包含超级管理员&#xff0c;系统管理员、用户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;用户管理&#xff1b;宠物分类&#xff1b;宠物管理&…

Python3中typing模块

Python类型注解是Python 3.5版本之后引入的新特性&#xff0c;它可以让开发者在函数、变量等声明时为其指定类型。typing模型能够声明类型&#xff0c;防止运行时出现参数和返回值类型不符合的问题。 ### 1. 基本类型注解 def hello(name: str) -> str:return (Hello, na…

自建机房还是选择云服务器?以腾讯云为例

大企业是选择自购服务器自建机房还是使用腾讯云服务器&#xff1f;都说企业上云是趋势&#xff0c;自建机房是一次性支出&#xff0c;上云租赁云服务器等产品需要年年续费&#xff0c;大型企业有必要把数据中心迁移上云吗&#xff1f;腾讯云服务器网想说&#xff0c;自建机房购…

28 玻尔兹曼机

文章目录 28 玻尔兹曼机28.1 模型定义28.2 梯度推导28.3 梯度上升28.4 基于VI[平均场理论]求解后验概率 28 玻尔兹曼机 28.1 模型定义 玻尔兹曼机是一张无向图&#xff0c;其中的隐节点和观测节点可以有任意连接如下图&#xff1a; 我们给其中的节点、连线做出一些定义&#…

Vue 转 React 指南

JSX 先介绍 React 唯一的一个语法糖&#xff1a;JSX。 理解 JSX 语法并不困难&#xff0c;简单记住一句话&#xff0c;遇到 {} 符号内部解析为 JS 代码&#xff0c;遇到成对的 <> 符号内部解析为 HTML 代码。 当你写下这个 React 组件时&#xff1a; import React fr…

软件功能测试有什么注意事项?功能测试报告起到什么作用?

软件功能测试是软件开发过程中至关重要的一环&#xff0c;它用于评估软件功能的质量和稳定性&#xff0c;并确保软件能够按照预期进行工作。然而&#xff0c;在进行功能测试时&#xff0c;有一些注意事项需要特别关注&#xff0c;以确保测试的准确性和有效性。 一、软件功能测…

Java8 Stream 之groupingBy 分组讲解

本文主要讲解&#xff1a;Java 8 Stream之Collectors.groupingBy()分组示例 Collectors.groupingBy() 分组之常见用法 功能代码: /** * 使用java8 stream groupingBy操作,按城市分组list */ public void groupingByCity() { Map<String, List<Em…