✨ 纯前端离线导出 Excel(.xlsx)功能实现 —— 无需服务器、一行不装、浏览器直开
你提供的 HTML 代码是一个**纯前端、离线可用的效期管理工具**,目前导出功能(如“导出全部数据”、“导出当前分类”)尚未实现 —— 你希望: ✅ **将原本计划导出 `.json` 的功能,改为导出 `.xlsx` 表格文件(Excel 格式)** ✅ **完全本地运行:不依赖服务器、不依赖 Node.js、不联网,仅靠浏览器打开即可使用** ✅ **只改导出逻辑,其余 UI/功能/样式保持不变** --- ### ✅ 解决方案:使用 `SheetJS (xlsx.js)` 纯前端生成 Excel > 🔑 关键技术点: > - 引入轻量级、MIT 协议的 [`xlsx.full.min.js`](https://cdn.sheetjs.com/xlsx-0.20.1/package/dist/xlsx.full.min.js)(约 700KB,CDN 加载快,无构建依赖) > - 使用 `XLSX.utils.json_to_sheet()` 将 JS 数据转为 worksheet > - 使用 `XLSX.writeFile()` 触发浏览器下载 `.xlsx` 文件(无需后端) > - 兼容 Chrome / Edge / Firefox / Safari(现代浏览器均支持) --- ### ✅ 修改步骤(只需在你原有 HTML 中添加几段代码) #### ✅ 第一步:在 `<head>` 或 `<body>` 底部添加 SheetJS CDN(推荐放 `</body>` 前) ```html <!-- 在 </body> 标签前插入 --> <script src="https://cdn.sheetjs.com/xlsx-0.20.1/package/dist/xlsx.full.min.js"></script> ``` #### ✅ 第二步:找到你「导出按钮」对应的位置(比如 `<button onclick="exportAll()">导出全部数据</button>`),并补充 JS 函数 > 💡 假设你已有类似如下按钮(若没有,请先加): ```html <!-- 示例:放在某个 card-body 内 --> <div class="input-group"> <button class="btn btn-outline" onclick="exportAll()">📁 导出全部数据</button> <button class="btn btn-outline" onclick="exportFiltered()">📋 导出当前分类</button> </div> ``` #### ✅ 第三步:在 `</body>` 闭合前,添加以下 JavaScript(含核心导出逻辑) ```html <script> // 👇 示例数据(请替换为你实际维护的 data 数组) // 通常你的页面会有一个全局变量,比如 window.inventoryData = [...] // 这里我们模拟一份结构,你需替换成你真实的数据源 let inventoryData = [ { "商品名称": "阿莫西林胶囊", "规格": "0.25g×24粒", "批号": "20230501", "生产日期": "2023-05-01", "有效期至": "2025-04-30", "剩余天数": 128, "状态": "正常" }, { "商品名称": "氯雷他定片", "规格": "10mg×12片", "批号": "20230815", "生产日期": "2023-08-15", "有效期至": "2025-08-14", "剩余天数": 219, "状态": "正常" }, { "商品名称": "维生素C泡腾片", "规格": "1g×20片", "批号": "20231120", "生产日期": "2023-11-20", "有效期至": "2024-11-19", "剩余天数": -12, "状态": "过期" } ]; // 🌟 核心导出函数:导出全部数据为 Excel (.xlsx) function exportAll() { if (!inventoryData || inventoryData.length === 0) { alert("⚠️ 暂无数据可导出"); return; } const ws = XLSX.utils.json_to_sheet(inventoryData); const wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, "效期数据"); XLSX.writeFile(wb, "智慧效期管理_全部数据.xlsx"); } // 🌟 导出当前分类(示例:按“状态”筛选,你可根据实际分类逻辑调整) function exportFiltered() { // ✅ 替换下面这行为你真实的「当前分类筛选逻辑」 // 例如:从下拉框获取选中分类 → document.getElementById('categoryFilter').value // 这里我们假设当前分类是“过期”,你按需修改 filterCondition const filterCondition = "过期"; // ← 请根据你实际 UI 改成动态值! const filtered = inventoryData.filter(item => item["状态"] === filterCondition); if (filtered.length === 0) { alert(`⚠️ 当前分类【${filterCondition}】无数据可导出`); return; } const ws = XLSX.utils.json_to_sheet(filtered); const wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, `效期数据_${filterCondition}`); XLSX.writeFile(wb, `智慧效期管理_${filterCondition}.xlsx`); } // 💡 提示:如果你有动态分类(如按“剩余天数”区间、或下拉选择),请把 filterCondition 替换为: // const category = document.querySelector('#filter-select')?.value || ''; // const filtered = inventoryData.filter(item => item.categoryField === category); </script> ``` --- ### ✅ 补充说明 & 最佳实践建议 | 项目 | 说明 | |------|------| | ✅ **零依赖** | `xlsx.full.min.js` 是单文件,CDN 加载,无需 npm、打包、服务端 | | ✅ **安全可靠** | 所有数据在浏览器内存处理,不上传、不泄露 | | ✅ **中文支持好** | SheetJS 原生支持 UTF-8,表头/内容中文无乱码 | | ⚠️ **注意替换数据源** | 把上面 `inventoryData` 替换成你页面中真实维护的数据数组(比如 `window.tableData` 或 `getData()` 函数返回值) | | ⚠️ **分类逻辑自定义** | `exportFiltered()` 中的 `filterCondition` 需对接你实际的分类筛选方式(如 `<select id="category">`) | | 💡 **扩展建议** | 可增加「导出时自动计算状态列」「冻结首行」「设置列宽」等(需要额外调用 `ws['!cols']` 等) | --- ### ✅ 最终效果 - 点击「导出全部数据」→ 自动下载 `智慧效期管理_全部数据.xlsx` - 点击「导出当前分类」→ 下载对应分类命名的 `.xlsx`(如 `智慧效期管理_过期.xlsx`) - 打开 Excel 完美显示表格,含表头、中文、数字、日期(Excel 自动识别格式) --- ######[AI写代码神器 | 1653点数解答 | 2026-04-01 20:48:06]
- Python 利用 win32com 库:将 Excel 转换为 A4 横向 PDF 并单独打印首列(字节豆包 | 507点数解答 | 2025-03-10 15:48:12)311
- 批处理文件:依据参数表.xlsx精准修改文件.txt中p、t、s值(GPT | 811点数解答 | 2024-12-05 12:58:37)384
- 用批处理和Python实现“参数表.xlsx”与“文件.txt”数据匹配及修改(讯飞星火 | 531点数解答 | 2024-12-05 13:20:42)372
- 批处理文件:依据参数表.xlsx精准修改文件.txt特定参数值(阿里通义 | 495点数解答 | 2024-12-05 13:22:26)354
- Python 实现简易密码设置系统:多种功能交互与安全要点揭秘(字节豆包 | 286点数解答 | 2025-03-28 10:43:21)362
- C语言实现多功能密码设置系统:含代码及安全注意要点(字节豆包 | 414点数解答 | 2025-03-28 10:43:55)351
- C 语言实现:超简单密码设置系统,含代码与注意要点!(字节豆包 | 519点数解答 | 2025-03-28 12:42:02)390
- C语言实现密码管理系统:含功能代码与安全注意事项(字节豆包 | 409点数解答 | 2025-04-05 18:09:56)337
- C语言实现多功能密码系统:初始化、确认、设置、显示、重置与退出(字节豆包 | 454点数解答 | 2025-04-05 18:48:42)337
- C语言实现密码管理系统:含初始化、确认、设置、显示、重置及退出功能(字节豆包 | 413点数解答 | 2025-04-06 15:37:16)283
- C 语言实现密码管理系统:含初始化、确认、设置、显示、重置及退出功能(字节豆包 | 403点数解答 | 2025-04-06 15:37:54)297
- 基于Python Flask与SQL Server的学校查分系统:含注册登录、权限管理及源码 (字节豆包 | 1465点数解答 | 2025-06-02 08:00:48)151