如何使用ember-cli-data-export在单个Excel文件中生成多工作表?
如何用ember-cli-data-export生成多工作表的test.xlsx文件
我之前也碰到过和你一模一样的问题——默认只能导出单个工作表,试了好几种方法才搞定多sheet的需求。其实ember-cli-data-export底层依赖SheetJS(xlsx库),我们可以直接利用它的核心API来实现多工作表导出,下面是亲测可行的步骤:
1. 整理多工作表的数据结构
首先把每个工作表的内容整理成包含name(工作表名称)和data(对应数据)的对象数组,比如:
const multiSheetData = [ { name: '用户信息表', data: [ ['ID', '姓名', '注册时间'], [101, '张三', '2023-01-15'], [102, '李四', '2023-02-20'] ] }, { name: '订单明细表', data: [ ['订单ID', '商品名称', '金额'], ['OD2023001', '无线耳机', 399], ['OD2023002', '机械键盘', 299] ] } ];
2. 自定义导出逻辑(核心步骤)
ember-cli-data-export的默认方法只处理单个sheet,所以我们需要手动创建工作簿,逐个添加工作表,最后生成文件。在你的Ember组件或控制器里可以这么写:
import { inject as service } from '@ember/service'; import Component from '@ember/component'; export default class ExportButtonComponent extends Component { @service dataExport; // 触发导出的方法 exportMultiSheetExcel() { const multiSheetData = [/* 上面定义的多sheet数据 */]; // 创建空的Excel工作簿 const workbook = this.dataExport.xlsx.utils.book_new(); // 遍历每个工作表数据,添加到工作簿 multiSheetData.forEach(sheetItem => { // 将二维数组转换为SheetJS的工作表对象 const worksheet = this.dataExport.xlsx.utils.aoa_to_sheet(sheetItem.data); // 把工作表添加到工作簿,并指定名称 this.dataExport.xlsx.utils.book_append_sheet(workbook, worksheet, sheetItem.name); }); // 生成并下载test.xlsx文件 this.dataExport.xlsx.writeFile(workbook, 'test.xlsx'); } }
3. 一些注意点
- 确保你的ember-cli-data-export版本支持直接访问
xlsx对象(新版本基本都支持,要是老版本不行就升级到最新版试试) - 如果你的数据是对象数组(不是二维数组),可以用
this.dataExport.xlsx.utils.json_to_sheet()方法转换 - 工作表名称别用特殊字符(比如
:/\?*[]),不然Excel会自动替换成下划线
按这个方法操作,就能成功导出包含多个工作表的test.xlsx了,我自己用这个方案解决了当时的问题,应该没问题。
内容的提问来源于stack exchange,提问作者user3345791
相关产品推荐
相关产品推荐

