当前位置: 首页 > article >正文

js导出Excel(图片大小,数据转换,导出后面添加现在的时间 )

现在我们来讲一下为什么需要制作这个功能,因为我们需要把页码表格的内容导出到Excel表格进行使用

现在我来讲一下制作这个功能我遇到的问题

目录

1.数据转换的问题

2.图片大小的问题

3.数据是怎么获取导出的问题

4.怎么在导出的表头后面加上现在的时间

5.完整的代码格式


1.数据转换的问题

我们先声明一个数组这个数组就是我的接口数据,往它的里面添点值,方便我们在接下来的使用

let data=[
[id:1,name;苹果,idetyi:图片链接,tel:166****2031,money:10.00,setmeal:1,addtime:2024/12/20
],[
id:2,name;苹果,idetyi:图片链接,tel:166****2031,money:10.00,setmeal:2,addtime:2024/12/20],[
id:3,name;苹果,idetyi:图片链接,tel:166****2031,money:10.00,setmeal:3,addtime:2024/12/20],[
id:4,name;苹果,idetyi:图片链接,tel:166****2031,money:10.00,setmeal:4,addtime:2024/12/20],[
id:5,name;苹果,idetyi:图片链接,tel:166****2031,money:10.00,setmeal:5,addtime:2024/12/20],[
id:6,name;苹果,idetyi:图片链接,tel:166****2031,money:10.00,setmeal:6,addtime:2024/12/20],[
id:7,name;苹果,idetyi:图片链接,tel:166****2031,money:10.00,setmeal:7,addtime:2024/12/20]
]

然后再声明一个数组这个数组里面内容就是我们需要改变数据的内容

let time_type=['三天','七天','一个月','半年','一年','三年','五年'];

然后在通过for循环,循环data改变你想改变的数据内容

for (let i in data) {
        data[i].setmeal=time_type[data[i].setmeal-1];
        //设置内容的大小
		data[i].size = [120, 120];
}

2.图片大小的问题

我们可以通过下面的代码来修改图片大小的样式

let tbody = data.reduce((result, row) => {
			const temp = column.reduce((tds, col) => {
				const options = {};

				if (col.type === 'image') {
					if (row.size) {
						options.width = row.size[0];
						options.height = row.size[1];
					} else {
						col.width && (options.width = col.width);
						col.height && (options.height = col.height);
					}
					row.scale && (options.scale = row.scale);
				}

				tds += typeMap[col.type || 'text'](row[col.key], options);

				return tds;
			}, '');

3.数据是怎么获取导出的问题

先通过这个函数把获取到的data放入到导出里面,这个函数在下面完整格式的导出函数里面

table2excel(column, data, '用户导出' + getCurrentDateTimeString());

title是导出表格的表头,key是根据数据返回的键名导出键值的内容,type是类型,比如文字就是‘text’类型,图片是‘image’类型

const column = [{
			title: "序号", //表头名称title
			key: "id", //数据
			type: "text", //类型
		},
		{
			title: "用户名称",
			key: "name",
			type: "text",
		},
		{
			title: "用户头像",
			key: "idetyi",
			type: "image",
		},
		{
			title: "联系方式",
			key: "tel",
			type: "text",

		},
		{
			title: "消费金额",
			key: "money",
			type: "text",
		},
		{
			title: "服务类型",
			key: "setmeal",
			type: "text",
		},
		{
			title: "加入时间",
			key: "addtime",
			type: "text",
		},
	];

4.怎么在导出的表头后面加上现在的时间

通过这个函数获取现在的时间

// 获取到当前时间
function getCurrentDateTimeString() {
	const now = new Date();
	// 获取当前的年份,并只取后两位
	const year = now.getFullYear().toString().slice(-2);
	// 获取当前的月份,并确保是两位数(从0开始)
	const month = (now.getMonth() + 1).toString().padStart(2, '0');
	// 获取当前的日期,并确保是两位数
	const day = now.getDate().toString().padStart(2, '0');
	// 获取当前的小时,并确保是两位数
	const hours = now.getHours().toString().padStart(2, '0');
	// 获取当前的分钟,并确保是两位数
	const minutes = now.getMinutes().toString().padStart(2, '0');
	// 获取当前的秒,并确保是两位数
	const seconds = now.getSeconds().toString().padStart(2, '0');
	// 拼接成所需的字符串格式
	const dateTimeString = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
	return dateTimeString;
}

把上面获取的现在的时间放入到这个函数里面,这个函数在下面完整格式的导出函数里面

table2excel(column, data, '用户导出' + getCurrentDateTimeString());

5.完整的代码格式

// 导出
async function showadd() {
	let data=[
[id:1,name;苹果,idetyi:图片链接,tel:166****2031,money:10.00,setmeal:1,addtime:2024/12/20
],[
id:2,name;苹果,idetyi:图片链接,tel:166****2031,money:10.00,setmeal:2,addtime:2024/12/20],[
id:3,name;苹果,idetyi:图片链接,tel:166****2031,money:10.00,setmeal:3,addtime:2024/12/20],[
id:4,name;苹果,idetyi:图片链接,tel:166****2031,money:10.00,setmeal:4,addtime:2024/12/20],[
id:5,name;苹果,idetyi:图片链接,tel:166****2031,money:10.00,setmeal:5,addtime:2024/12/20],[
id:6,name;苹果,idetyi:图片链接,tel:166****2031,money:10.00,setmeal:6,addtime:2024/12/20],[
id:7,name;苹果,idetyi:图片链接,tel:166****2031,money:10.00,setmeal:7,addtime:2024/12/20]
]
	let time_type=['三天','七天','一个月','半年','一年','三年','五年'];
	for (let i in data) {
        data[i].setmeal=time_type[data[i].setmeal-1];
        //设置内容的大小
		data[i].size = [120, 120];
	}

	// 导出表格  按钮点击后触发事件
	// 导出方法
	/* eslint-disable */
	let idTmr;
	const getExplorer = () => {
		let explorer = window.navigator.userAgent;
		//ie
		if (explorer.indexOf('MSIE') >= 0) {
			return 'ie';
		}
		//firefox
		else if (explorer.indexOf('Firefox') >= 0) {
			return 'Firefox';
		}
		//Chrome
		else if (explorer.indexOf('Chrome') >= 0) {
			return 'Chrome';
		}
		//Opera
		else if (explorer.indexOf('Opera') >= 0) {
			return 'Opera';
		}
		//Safari
		else if (explorer.indexOf('Safari') >= 0) {
			return 'Safari';
		}
	};
	// 判断浏览器是否为IE
	const exportToExcel = (data, name) => {
		// 判断是否为IE
		if (getExplorer() == 'ie') {
			tableToIE(data, name);
		} else {
			tableToNotIE(data, name);
		}
	};

	const Cleanup = () => {
		window.clearInterval(idTmr);
	};

	// ie浏览器下执行
	const tableToIE = (data, name) => {
		let curTbl = data;
		let oXL = new ActiveXObject('Excel.Application');

		//创建AX对象excel
		let oWB = oXL.Workbooks.Add();
		//获取workbook对象
		let xlsheet = oWB.Worksheets(1);
		//激活当前sheet
		let sel = document.body.createTextRange();
		sel.moveToElementText(curTbl);
		//把表格中的内容移到TextRange中
		sel.select;
		//全选TextRange中内容
		sel.execCommand('Copy');
		//复制TextRange中内容
		xlsheet.Paste();
		//粘贴到活动的EXCEL中

		oXL.Visible = true;
		//设置excel可见属性

		try {
			let fname = oXL.Application.GetSaveAsFilename('Excel.xlsx', 'Excel Spreadsheets (*.xlsx), *.xlsx');
		} catch (e) {
			print('Nested catch caught ' + e);
		} finally {
			oWB.SaveAs(fname);

			oWB.Close((savechanges = false));
			//xls.visible = false;
			oXL.Quit();
			oXL = null;
			// 结束excel进程,退出完成
			window.setInterval('Cleanup();', 1);
			idTmr = window.setInterval('Cleanup();', 1);
		}
	};

	// 非ie浏览器下执行
	const tableToNotIE = (function() {
		// 编码要用utf-8不然默认gbk会出现中文乱码
		const uri = 'data:application/vnd.ms-excel;base64,',
			template =
			'<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><meta charset="UTF-8"><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}</table></body></html>';

		const base64 = function(s) {
			return window.btoa(unescape(encodeURIComponent(s)));
		};
		const format = (s, c) => {
			return s.replace(/{(\w+)}/g, (m, p) => {
				return c[p];
			});
		};
		return (table, name) => {
			const ctx = {
				worksheet: name,
				table,
			};

			const url = uri + base64(format(template, ctx));

			if (navigator.userAgent.indexOf('Firefox') > -1) {
				// 创建 Blob 对象
				const blob = new Blob([format(template, ctx)], {
					type: 'application/vnd.ms-excel'
				});
				// 创建链接并点击下载
				const aLink = document.createElement('a');
				aLink.href = URL.createObjectURL(blob);
				aLink.download = name || '用户.xls';
				document.body.appendChild(aLink);
				aLink.click();
				document.body.removeChild(aLink);
			} else {
				const aLink = document.createElement('a');
				aLink.href = url;
				aLink.download = name || '';
				let event;
				if (window.MouseEvent) {
					event = new MouseEvent('click');
				} else {
					event = document.createEvent('MouseEvents');
					event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false,
						false, false, 0, null);
				}
				aLink.dispatchEvent(event);
			}
		};
	})();

	const resolveOptions = (options) => {
		if (options.length === 1) {
			return options[0];
		}

		return {
			column: options[0] || [],
			data: options[1] || [],
			excelName: options[2] || '',
			captionName: options[3],
		};
	};

	// 导出函数
	const table2excel = (...options) => {
		function getTextHtml(val) {
			return `<td style="text-align: center;padding:5px;">${val}</td>`;
		}
		// 图片操作
		function getImageHtml(val, options) {
			options = Object.assign({
				width: 5,
				height: 5,
				scale: 0.7
			}, options);
			const imgWidth = options.width * options.scale;
			const imgHeight = options.height * options.scale;
			return `<td style=" width:${options.width}px;height:${options.height}px; text-align: center; vertical-align: middle">
                <div style="display: flex;
        justify-content: center;
        align-items: center; width:${options.width}px;height:${options.height}px; text-align: center;  margin:auto auto; vertical-align: middle;" ><img width="${imgWidth}" height="${imgHeight}" src="${val}" /></div>
                    </td>`;
		}

		const typeMap = {
			image: getImageHtml,
			text: getTextHtml,
		};
		// 解构赋值
		const {
			column,
			data,
			excelName,
			captionName
		} = resolveOptions(options);

		let caption = captionName ? `<caption style="font-weight:bold">${captionName}</caption>` : '';

		let thead = column.reduce((result, item) => {
			result += `<th>${item.title}</th>`;
			return result;
		}, '');

		thead = `<thead><tr>${thead}</tr></thead>`;

		let tbody = data.reduce((result, row) => {
			const temp = column.reduce((tds, col) => {
				const options = {};

				if (col.type === 'image') {
					if (row.size) {
						options.width = row.size[0];
						options.height = row.size[1];
					} else {
						col.width && (options.width = col.width);
						col.height && (options.height = col.height);
					}
					row.scale && (options.scale = row.scale);
				}

				tds += typeMap[col.type || 'text'](row[col.key], options);

				return tds;
			}, '');

			result += `<tr>${temp}</tr>`;

			return result;
		}, '');

		tbody = `<tbody>${tbody}</tbody>`;

		const table = caption + thead + tbody;
		// 导出表格
		exportToExcel(table, excelName);
	};
	const column = [{
			title: "序号", //表头名称title
			key: "id", //数据
			type: "text", //类型
		},
		{
			title: "用户名称",
			key: "name",
			type: "text",
		},
		{
			title: "用户头像",
			key: "idetyi",
			type: "image",
		},
		{
			title: "联系方式",
			key: "tel",
			type: "text",

		},
		{
			title: "消费金额",
			key: "money",
			type: "text",
		},
		{
			title: "服务类型",
			key: "setmeal",
			type: "text",
		},
		{
			title: "加入时间",
			key: "addtime",
			type: "text",
		},
	];

	table2excel(column, data, '用户导出' + getCurrentDateTimeString());

};

// 获取到当前时间
function getCurrentDateTimeString() {
	const now = new Date();
	// 获取当前的年份,并只取后两位
	const year = now.getFullYear().toString().slice(-2);
	// 获取当前的月份,并确保是两位数(从0开始)
	const month = (now.getMonth() + 1).toString().padStart(2, '0');
	// 获取当前的日期,并确保是两位数
	const day = now.getDate().toString().padStart(2, '0');
	// 获取当前的小时,并确保是两位数
	const hours = now.getHours().toString().padStart(2, '0');
	// 获取当前的分钟,并确保是两位数
	const minutes = now.getMinutes().toString().padStart(2, '0');
	// 获取当前的秒,并确保是两位数
	const seconds = now.getSeconds().toString().padStart(2, '0');
	// 拼接成所需的字符串格式
	const dateTimeString = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
	return dateTimeString;
}


http://www.kler.cn/a/448519.html

相关文章:

  • 鸿蒙元服务从0到上架【第二篇】
  • leetcode-128.最长连续序列-day14
  • SpringBoot 启动类 SpringApplication 二 run方法
  • UE5 移植Editor或Developer模块到Runtime
  • 【Prompt Engineering】6 文本扩展
  • 【人工智能】用Python实现图卷积网络(GCN):从理论到节点分类实战
  • Vue的响应式基础
  • Go 语言并发实战:利用协程处理多个接口进行数据融合
  • 常耀斌:深度学习和大模型原理与实战(深度好文)
  • 【漫话机器学习系列】012.深度学习(Deep Learning)基础
  • Webpack的打包过程/打包原理/构建流程?
  • Unity Shader学习日记 part 1 基础知识
  • 广义正态分布优化算法(GNDO)Generalized Normal Distribution Optimization
  • LeetCode 力扣 热题 100道(二十)三数之和(C++)
  • Unity 6 Preview(预览版)新增功能
  • windows下srs流媒体服务器使用ffmpeg推流
  • 鸿蒙项目云捐助第十八讲云捐助我的页面下半部分的实现
  • c# iis 解决跨域问题
  • 对象克隆与单例模式的实现
  • 硬件工程师面试题 11-20
  • 【WRF教程第3.6期】预处理系统 WPS 详解:以4.5版本为例
  • 使用插件时要注意
  • C语言——实现字符分类统计
  • Linux 使用的小细节
  • Webpack简单介绍及安装
  • 深度学习试题及答案解析(二)