js下载excel表格

1. 安装依赖

进入项目文件夹,安装 xlsx

npm install xlsx
2. 在项目中引入
import * as XLSX from 'xlsx';

 3. 表格数据生成为excel并下载到本地

            //数据

             this.ExcelData = [{name:'我是名称'}]

             let arr=this.ExcelData.map(item=>{
                    return {
                        型号:1,
                        名称:item.name,
                    };
                });
                let sheet=XLSX.utils.json_to_sheet(arr),
                book=XLSX.utils.book_new();
                XLSX.utils.book_append_sheet(book,sheet,"sheet1");
                // user开头加时间戳的文件名,可以修改成其它名字
                XLSX.writeFile(book,`列表.xls`);
 

<think>我们正在使用JavaScript实现下载Excel表格文件的功能。根据引用内容,我们可以采用几种方法: 1. 使用Blob对象和a标签创建下载链接(如引用[2]所示) 2. 将table标签转换成Excel文件(如引用[4]所述) 这里我们主要介绍两种常见方式: 方式一:通过后端接口返回的Excel文件流进行下载(即引用[2]的方法) 方式二:纯前端生成Excel文件(可以使用第三方库如SheetJS,或者自己生成XML格式的字符串) 由于用户没有明确是否有后端支持,我们将分别介绍: 一、通过后端接口返回文件流下载(适用于有后端接口的情况) 假设我们有一个后端接口,返回的是Excel文件的二进制数据流(blob),我们可以使用以下代码: 二、纯前端生成Excel文件(使用SheetJS库) 使用SheetJS(xlsx)库可以方便地在前端生成Excel文件。首先需要引入该库,然后创建工作簿、工作表,最后导出。 如果没有使用库,也可以手动生成XML格式的字符串(即生成符合Excel的XML Spreadsheet格式的文件),但较为复杂。这里我们使用SheetJS库为例。 由于用户要求使用JavaScript实现下载,我们将分别给出两种方法的代码示例。 注意:引用[4]提到自己手搓代码,但通常我们推荐使用成熟的库,因为自己处理各种格式和兼容性较为复杂。 下面分别展示两种方法的代码: 方法一:通过Blob下载后端返回的Excel流(参考引用[2]) ```javascript // 假设我们通过axios等库发起请求,这里只展示如何处理返回的response function exportExcel(response, fileName) { // 从响应中获取数据,这里假设response是axios的响应对象 const blob = new Blob([response.data], { type: response.headers['content-type'] // 使用获取的excel格式,如'application/vnd.ms-excel'或'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); const downloadElement = document.createElement('a'); const url = window.URL.createObjectURL(blob); downloadElement.href = url; let name = fileName || 'EXCEL导出'; downloadElement.download = `${name}.xlsx`; // 下载后文件名 document.body.appendChild(downloadElement); downloadElement.click(); // 点击下载 document.body.removeChild(downloadElement); // 下载完成移除元素 window.URL.revokeObjectURL(url); // 释放blob对象 } ``` 方法二:使用SheetJS库(xlsx)纯前端生成并下载Excel文件 首先,需要引入SheetJS库,可以通过CDN引入: ```html <script src="https://cdn.sheetjs.com/xlsx-0.20.0/package/dist/xlsx.full.min.js"></script> ``` 然后,编写生成和下载代码: ```javascript // 假设我们有一个数据数组 function exportExcel() { // 创建工作簿 const wb = XLSX.utils.book_new(); // 假设我们有一个数据数组 const data = [ ["姓名", "年龄", "性别"], ["张三", 25, "男"], ["李四", 30, "女"] ]; // 将数据转换为工作表 const ws = XLSX.utils.aoa_to_sheet(data); // 将工作表添加到工作簿,并命名为"Sheet1" XLSX.utils.book_append_sheet(wb, ws, "Sheet1"); // 生成Excel文件并下载 XLSX.writeFile(wb, "导出.xlsx"); } ``` 如果不想引入整个库,也可以使用简单的XML方式,但只支持较旧的格式(.xls): ```javascript function exportToExcel() { // 创建一个表格数据的二维数组 let data = [ ['姓名', '年龄', '性别'], ['张三', 25, '男'], ['李四', 30, '女'] ]; // 创建XML字符串 let xml = '<?xml version="1.0"?><ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">'; xml += '<ss:Worksheet ss:Name="Sheet1">'; xml += '<ss:Table>'; // 遍历数据行 for (let i = 0; i < data.length; i++) { xml += '<ss:Row>'; // 遍历每行的单元格 for (let j = 0; j < data[i].length; j++) { xml += '<ss:Cell>'; xml += `<ss:Data ss:Type="String">${data[i][j]}</ss:Data>`; xml += '</ss:Cell>'; } xml += '</ss:Row>'; } xml += '</ss:Table></ss:Worksheet></ss:Workbook>'; // 创建Blob const blob = new Blob([xml], { type: 'application/vnd.ms-excel' }); const downloadLink = document.createElement('a'); const url = URL.createObjectURL(blob); downloadLink.href = url; downloadLink.download = '导出.xls'; document.body.appendChild(downloadLink); downloadLink.click(); document.body.removeChild(downloadLink); URL.revokeObjectURL(url); } ``` 注意:XML方式生成的是旧版Excel文件(.xls),而SheetJS库可以生成新版(.xlsx)且功能更强大。 根据需求选择合适的方法。如果有后端接口,推荐使用方法一;如果纯前端生成,推荐使用SheetJS库。 相关问题: 1. 如何设置Excel导出的样式(如单元格颜色、字体等)? 2. 如何将HTML表格(table元素)直接导出为Excel文件? 3. 使用SheetJS库导出Excel时,如何处理大量数据以避免内存问题?</think>### JavaScript 实现 Excel 文件下载 以下是两种主流实现方式,分别适用于不同场景: #### 方法一:纯前端生成 Excel(推荐) 使用 [SheetJS](https://sheetjs.com/) 库实现前端数据导出: ```html <!-- 引入 SheetJS 库 --> <script src="https://cdn.sheetjs.com/xlsx-0.20.0/package/dist/xlsx.full.min.js"></script> <button onclick="exportExcel()">导出 Excel</button> <script> function exportExcel() { // 1. 准备数据(二维数组) const data = [ ["姓名", "年龄", "部门"], ["张三", 28, "技术部"], ["李四", 32, "市场部"] ]; // 2. 创建工作簿和工作表 const ws = XLSX.utils.aoa_to_sheet(data); const wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, "员工数据"); // 3. 生成文件并下载 XLSX.writeFile(wb, "员工数据.xlsx"); } </script> ``` **优点**: - 纯前端实现,无需后端支持 - 支持复杂格式(合并单元格、样式等) - 兼容所有现代浏览器 - 支持大数据量(SheetJS 使用流式处理) #### 方法二:通过 API 下载文件流 当从后端获取 Excel 文件流时: ```javascript async function downloadExcel() { try { // 1. 调用后端 API const response = await fetch('/api/export-excel', { method: 'GET', headers: { Authorization: 'Bearer your_token' } }); // 2. 创建 Blob 对象 const blob = await response.blob(); // 3. 创建下载链接 const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = '报表.xlsx'; // 设置文件名 document.body.appendChild(a); // 4. 触发下载 a.click(); // 5. 清理资源 setTimeout(() => { document.body.removeChild(a); URL.revokeObjectURL(url); }, 100); } catch (error) { console.error('下载失败:', error); } } ``` ### 关键注意事项 1. **文件类型**: - 新版 Excel 使用 `.xlsx` (MIME: `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`) - 旧版 Excel 使用 `.xls` (MIME: `application/vnd.ms-excel`) 2. **移动端兼容**: ```javascript // 部分安卓设备需特殊处理 if (navigator.userAgent.match(/Android/i)) { const fileReader = new FileReader(); fileReader.onload = () => { window.location.href = fileReader.result; }; fileReader.readAsDataURL(blob); } ``` 3. **大数据优化**: - 使用 `Web Worker` 防止界面卡顿 - 分块生成数据(SheetJS 支持增量写入) 4. **安全限制**: - 浏览器禁止直接保存本地文件 - 必须通过用户交互(如按钮点击)触发下载 - 跨域资源需配置 `Access-Control-Allow-Origin` ### 示例效果 实现功能后,用户点击按钮将直接下载 Excel 文件: ``` 员工数据.xlsx ├── 姓名 年龄 部门 ├── 张三 28 技术部 └── 李四 32 市场部 ``` > **提示**:对于复杂报表需求,推荐使用 SheetJS + [ExcelJS](https://github.com/exceljs/exceljs) 组合方案,后者提供更丰富的样式控制 API[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值