前端实现Excel导出 以及 样式调整

625 阅读2分钟

在最近一个需求中,有几个数据导出的功能,有一个需要前端导出的功能。

xlsx-js-style VS xlsxjs

xlsx-js-style

样式支持:

xlsx-js-style 的最大优势是其提供了对 Excel 单元格样式的支持。用户可以轻松地设置单元格的字体、颜色、背景色、边框等样式。 这使得生成的 Excel 文件不仅包含数据,还可以美观地展示数据。

API 接口设计:

提供了类似于 CSS 的样式设置方式,开发者在设置样式时可以更加直观和便捷。 社区和维护:

由于它是基于 xlsx 库的扩展,拥有良好的兼容性和较为活跃的维护。

xlsxjs (即 xlsx)

功能全面:

xlsxjs 是一个非常成熟和全面的库,支持 Excel 文件的读写、数据解析、公式计算等功能。 对于纯数据处理和文件转换任务,它非常高效且稳定。 社区支持和文档:

作为一个老牌库,拥有广泛的社区支持和详细的文档,用户可以方便地找到解决方案和示例代码。 性能:

xlsxjs 在处理大量数据和大文件时表现出色,性能优化做得很好。

如果你的需求不仅限于数据处理,还需要对生成的 Excel 文件进行美化和样式设置,那么 xlsx-js-style 是一个更好的选择。 如果你更注重于 Excel 文件的数据操作、解析和转换,且不需要复杂的样式支持,那么 xlsxjs 是一个功能更全面、更成熟的库。 选择哪个库主要取决于你的具体需求。如果你需要结合两者的优势,可以使用 xlsxjs 进行数据操作,然后使用 xlsx-js-style 进行样式设置。

使用 xlsx-js-style 封装一个表头加粗显示导出函数:

const XLSX = require('xlsx-js-style');

/**
 * TODO: 如有需要可以添加样式配置,option
 * @param {*} json 要下载的数据,格式为{[key]: value}[],key为表头,value为每一行数据
 * @param {*} sheetName 下载的名字
 */

const jsonToExcel = (json, sheetName = '数据下载') => {
	const workbook = XLSX.utils.book_new();
	const jsonData = json;
	// 提取表头
	const headers = Object.keys(jsonData[0]);
	// 手动添加表头行
	const dataWithHeader = [
		headers, // 表头
		...jsonData.map((row) => headers.map((header) => row[header])) // 数据行
	];
	// 将数据转换为工作表
	const worksheet = XLSX.utils.aoa_to_sheet(dataWithHeader);
	// 确保单元格已定义并设置样式
	const setCellStyle = (cell, style) => {
		if (!worksheet[cell]) worksheet[cell] = {}; // 如果单元格未定义,则初始化它
		worksheet[cell].s = style;
	};

	// 表头样式
	const headerStyle = {
		font: { bold: true, sz: 14, color: { rgb: 'FFFFFF' } },
		fill: { fgColor: { rgb: '888888' } }
	};

	// 应用表头样式
	headers.forEach((header, index) => {
		const cellAddress = XLSX.utils.encode_cell({ c: index, r: 0 });
		setCellStyle(cellAddress, headerStyle);
	});

	// 设置列宽(可选)
	worksheet['!cols'] = headers.map(() => ({ wpx: 100 }));

	// 添加工作表到工作簿
	XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');

	// 写入 Excel 文件
	XLSX.writeFile(workbook, `${sheetName}.xlsx`);
};

export default jsonToExcel;

效果如下:

image.png

参考链接