告别后端转换:高质量批量导出实战

对于 100 条这种量级的数据,虽然内存压力不大,但格式的标准化导出的顺滑度是区分"初级实现"和"资深工具"的关键。

在应用场景下,用户导出数据通常有两个目的:备份/迁移(JSON)或分享/离线审阅(Excel)


1. 方案选择:JSON vs. XLSX

格式 优势 劣势 资深开发建议
JSON 结构化、无损、浏览器原生支持。 对非技术人员不友好。 用于系统备份、数据迁移。
XLSX 可读性极强、支持排序筛选。 需要第三方库、体积较大。 用于周报汇报、团队分享。

2. 导出 JSON:最纯粹的无损备份

这是最简单的方案,不需要任何库,直接利用 BlobURL.createObjectURL

JavaScript

javascript 复制代码
/**
 * 导出为 JSON 文件
 * @param {Array} data - Prompt 数组
 */
function exportToJSON(data) {
  // 1. 序列化,添加 2 个空格缩进方便阅读
  const content = JSON.stringify(data, null, 2);
  
  // 2. 创建 Blob 
  const blob = new Blob([content], { type: 'application/json' });
  
  // 3. 触发下载
  downloadFile(blob, `Prompts_Backup_${new Date().getTime()}.json`);
}

3. 导出 XLSX:专业的表格方案

对于 Excel 导出,SheetJS (xlsx) 是行业标准。作为 8 年老兵,我会建议你使用 动态引入(Dynamic Import) ,因为这个库体积较大(数百 KB),没必要在首屏加载。

实战代码(按需加载型)

JavaScript

javascript 复制代码
async function exportToXLSX(data) {
  // 1. 动态加载 SheetJS
  const XLSX = await import('https://cdn.sheetjs.com/xlsx-0.20.1/package/dist/xlsx.full.min.js');

  // 2. 数据扁平化(如果你的 Prompt 包含嵌套对象,需要先处理)
  const worksheet = XLSX.utils.json_to_sheet(data);
  
  // 3. 创建工作簿
  const workbook = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(workbook, worksheet, "MyPrompts");

  // 4. 写入并触发下载
  XLSX.writeFile(workbook, `Prompt_Export_${new Date().toLocaleDateString()}.xlsx`);
}

4. 资深开发的"性能与健壮性"补丁

① 统一的下载触发器(避免内存泄漏)

频繁导出时,如果不销毁 ObjectURL,会导致页面内存占用持续攀升。

JavaScript

ini 复制代码
function downloadFile(blob, fileName) {
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = fileName;
  document.body.appendChild(a);
  a.click();
  
  // 关键:延迟移除和销毁,确保下载任务已交给浏览器
  setTimeout(() => {
    document.body.removeChild(a);
    URL.revokeObjectURL(url);
  }, 100);
}

② 数据清洗(避免 Excel 报错)

Excel 对某些特殊字符或过长的单个单元格(超过 32767 字符)会报错。

  • 对策 :在 json_to_sheet 之前,遍历数据,对超长 Prompt 进行截断或分块,或者至少给用户一个提示。

③ 导出时的"防抖"与"状态反馈"

100 条数据虽然快,但如果是 10000 条,UI 可能会卡死。

  • 对策 :点击导出后,按钮立即进入 Loading 状态,并使用 Web Worker 处理数据序列化,最后再回到主线程触发下载。

5. 加分项

  1. 文件名命名规范 :不要只叫 data.json。推荐 [应用名]_[分类]_[日期].xlsx
  2. 表头国际化:如果你的工具面向国际,导出的 Excel 表头(如:标题、内容、创建时间)应该根据当前 UI 语言动态映射。
  3. CSV 降级 :如果不想引几十 KB 的 xlsx 库,且数据结构简单,导出 CSV 是最高性能的方案。但要注意加上 BOM (Byte Order Mark) 头(\ufeff),否则 Excel 打开中文会乱码。

JavaScript

ini 复制代码
// CSV 乱码修正技巧
const csvContent = "\ufeff" + convertToCSV(data);
const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });

相关推荐
Cao_Ron7 分钟前
用 SVG image symbol 画 ECharts graph 圆形节点
前端
hxy060111 分钟前
React-Call让你的React组件像异步函数一样调用
前端·react.js
Hilaku12 分钟前
为什么 AI 写前端时,总是优先选择 React,而不是 Vue?
前端·javascript·程序员
京东云开发者14 分钟前
GPT-5.6、ChatGPT Work 与 Codex 更新食用指南
前端
Cao_Ron25 分钟前
用 ECharts graph 画出卡片式矩形节点
前端
skiyee34 分钟前
换个底座的 Wot Starter 居然让 AI 更懂项目!
前端·ai编程
anyup40 分钟前
这一套绝了!AI 大模型写故事,星云 SDK 驱动 3D 数字人实时演绎
前端·人工智能·aigc
耀耀切克闹灬1 小时前
短链跳转
前端
孟陬1 小时前
高质量全方位的 AI 工具 sse-stuntman — Mock SSE 接口
前端·node.js·openai
Cao_Ron1 小时前
给 ECharts 6 graph 节点叠加角标:从原理到性能优化
前端