JS 将数据保存为 Excel(xls、xlsx)文件

it2023-01-22  81

一、简介

最简单的XML格式Excel表格文件

csv、xls、xlsx、文件通过 JavaScript 解析成为 JSON 数据 - DZMFormJson

本文章已封装成库,直接使用即可 DZMExcelDownload,支持前端原生或Vue等任何框架使用。

二、 DZMExcelDownload 使用

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <!-- 导入组件 --> <script src="./excel-download.js"></script> <!-- 使用 --> <script> // 服务器获取到的数据源 const dataSource = [ { id: 1, name: 'dzm', // (可选)如果列表数据有子列表数据,也是支持的 children: [ { id: 4, name: 'dzm1' }, { id: 5, name: 'dzm2' } ] }, { id: 2, name: 'xyq' }, { id: 3, name: 'djy' } ] // 将要保存的 sheets 数据源 const sheets = [ { // 单个 sheet 名字 name: '用户数据', // 单个 sheet 数据源 data: dataSource } ] // Excel 每一列的列头名字跟字段key,通过列名展示,列key获取数据源中对应的值 const columns = [ { name: '用户ID', field: 'id' }, { name: '用户名称', field: 'name' } ] // 开始下载 EXDownloadManager(sheets, columns) </script> </body> </html>

下面是内部实现,可以不用看。


三、 DZMExcelDownload 内部实现

拷贝放入 JS 文件即可使用方法

/* 需要传入的 data(XMLSheets) 数据格式: [ // ---> sheet(表) 数据 { name: 'Sheet名称', rows: [ // ---> row(行) 数据 [ // ---> cell(单元格) 数据 { // 展示数据 data: 123, // 数据类型,首字母大写 (可选值,可不传,可为空,默认会使用 data 的数据类型) dataType: 'Number' // Number 类型长度最大只能 11 位数字,超过会自动转换为 String 存储 } ] ] }, { name: 'Sheet名称', rows: [ [ { data: '123', dataType: 'String' } ] ] }, { name: 'Sheet名称', rows: [ [ { data: '123' } ] ] } ] */ /** * * 将指定数据保存为 XML * * @param {*} data XML数据格式 (必填) * @param {*} fileName 文件名(可选)(默认会使用Sheet名称拼接: xxx-xxx-xxx.xls) */ export function XMLDownload (data, fileName) { // XML 数据 const XMLSheets = data // 检查是否有数据 if (!XMLSheets || !XMLSheets.length) { return } // XML 文件名 var XMLFileName = fileName || '' // XML 头部 var XMLString = ` <?xml version="1.0" encoding="UTF-8"?> <?mso-application progid= "Excel.Sheet"?>` // Workbook 头部 XMLString += `<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">` // 便利 Worksheet XMLSheets.forEach((sheet, index) => { // 拼接名称 if (!fileName) { XMLFileName += `${sheet.name}${index ? '-' : ''}` } // Worksheet 头部 XMLString += `<Worksheet ss:Name="${sheet.name}">` // Table 头部 XMLString += '<Table>' // 便利 Row sheet.rows.forEach((row) => { // Row 头部 XMLString += '<Row>' // 便利 Cell row.forEach((cell) => { // 获取数据类型 var dataType = cell.dataType || typeof(cell.data) // 类型首字母大写 dataType = dataType.replace(dataType[0],dataType[0].toUpperCase()) // 超过 11 位的数字需要转成字符串 if (dataType === 'Number' && cell.data > 10000000000) { dataType = 'String' } // Cell 头部 XMLString += '<Cell>' // Data 头部 XMLString += `<Data ss:Type="${dataType}">` // Data 数据 XMLString += `${cell.data}` // Data 尾部 XMLString += '</Data>' // Cell 尾部 XMLString += '</Cell>' }) // 便利 Cell // Row 尾部 XMLString += '</Row>' }) // 便利 Cell // Table 尾部 XMLString += '</Table>' // Worksheet 尾部 XMLString += '</Worksheet>' }) // 便利 Worksheet // Workbook 尾部 XMLString += '</Workbook>' // 创建 a 标签 let alink = document.createElement('a') // 设置下载文件名,大部分浏览器兼容,IE10及以下不兼容 alink.download = `${XMLFileName}.xls` // 将数据包装成 Blob let blob = new Blob([XMLString]) // 根据 Blob 创建 URL alink.href = URL.createObjectURL(blob) // 将 a 标签插入到页面 // document.body.appendChild(alink) // 自动点击 alink.click() // 移除 a 标签 // document.body.removeChild(alink) }

自己在项目中使用(例子)仅供参考:

const columns = [ { name: '姓名', // Sheet里面一列单元格头部名称 field: 'name' // Sheet里面当前这列单元格数据Key,其实就是通过这个key去传入的Sheet数据列表中获取值 }, { name: '手机号码', field: 'phone' } ] const sheets = [ { name: '单个Sheet名称'', // 一个 .xls 文件里面会存在多个Sheet, 这里是单个Sheet数据 // 也就是你请求回来的单个表数据,到时候会用 columns 里面的每个 field 字段去取下面 data 中的值 data: sheet } ] XMLDownload_AD(sheets, columns, '下载出来的 .xls 文件名称') import { XMLDownload } from './xml' // 示例代码,该方法就是相当于将数据转成上面JS方法中需要的数据格式 export function XMLDownload_AD (data, columns, fileName) { // 检查数据 if (!data || !data.length || !columns || !columns.length) { return } // 设置空数据 const XMLSheets = [] // 遍历数据 data.forEach((item) => { // XMLRows 数据 const XMLRows = [] // 行标题数据 // XMLRow 数据 var XMLRow = [] // 通过便利列数据获得字段数据 columns.forEach((column) => { XMLRow.push({ data: column.name }) }) // 放到 XMLRows 里面 XMLRows.push(XMLRow) // 行数据 const dataSource = item.data || [] // 便利数据源 dataSource.forEach((item) => { // XMLRow 数据 var XMLRow = [] // 通过便利列数据获得字段数据 columns.forEach((column) => { XMLRow.push({ data: item[column.field] }) }) // 放到 XMLRows 里面 XMLRows.push(XMLRow) }) // XMLSheet 数据 var XMLSheet = { name: item.name, rows: XMLRows } // 放到 XMLSheets 里面 XMLSheets.push(XMLSheet) }) // 开始下载 XMLDownload(XMLSheets, fileName) // 开始下载(不传文件名也可以) // XMLDownload(XMLSheets) }
最新回复(0)