You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Suitelet脚本中导出SuiteQL结果为多工作表XLS/XLSX文件?

在NetSuite Suitelet中导出多工作表XLSX文件的解决方案

NetSuite Suitelet运行在服务器端,ExcelJS的writeBuffer()方法因异步特性和环境限制无法直接使用。以下是两种可行的实现方案,优先推荐原生模块方案:

方法1:使用NetSuite原生N/Excel模块(推荐)

NetSuite内置的N/excel模块专门用于创建多工作表Excel文件,无需引入外部库,兼容性和稳定性拉满。

实现步骤

  • 创建工作簿和多个工作表
  • 通过SuiteQL查询获取数据,填充到对应工作表
  • 导出工作簿并通过Suitelet响应返回给用户

代码示例

/**
 * @NApiVersion 2.x
 * @NScriptType Suitelet
 */
define(['N/excel', 'N/query', 'N/response'], function(excel, query, response) {
    function onRequest(context) {
        if (context.request.method === 'GET') {
            // 1. 创建工作簿
            const workbook = excel.createWorkbook();

            // 2. 第一个工作表:销售订单数据
            const salesSheet = workbook.addWorksheet({name: '销售订单'});
            // 执行SuiteQL查询
            const salesResults = query.runSuiteQL({
                query: 'SELECT tranid, entity, total FROM transaction WHERE type = "SalesOrd"'
            }).asMappedResults();
            // 写入表头
            salesSheet.insertRows({rows: [['订单编号', '客户', '订单总额']], startingRow: 1});
            // 写入数据行
            const salesRows = salesResults.map(res => [res.tranid, res.entity, res.total]);
            salesSheet.insertRows({rows: salesRows, startingRow: 2});

            // 3. 第二个工作表:客户数据
            const customerSheet = workbook.addWorksheet({name: '客户列表'});
            const customerResults = query.runSuiteQL({
                query: 'SELECT entityid, email FROM customer WHERE isinactive = F'
            }).asMappedResults();
            customerSheet.insertRows({rows: [['客户名称', '邮箱']], startingRow: 1});
            const customerRows = customerResults.map(res => [res.entityid, res.email]);
            customerSheet.insertRows({rows: customerRows, startingRow: 2});

            // 4. 导出并返回文件
            const excelFile = workbook.export({format: excel.FormatType.XLSX});
            response.setHeader({name: 'Content-Type', value: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});
            response.setHeader({name: 'Content-Disposition', value: `attachment; filename="自定义报表_${new Date().toISOString().slice(0,10)}.xlsx"`});
            response.writeFile({file: excelFile, isInline: false});
        }
    }
    return {onRequest: onRequest};
});

方法2:适配ExcelJS在Suitelet中使用

若坚持使用ExcelJS,需先将库部署到NetSuite文件柜,再通过同步写入逻辑适配服务器环境。

实现步骤

  1. 将ExcelJS的minified版本上传到NetSuite文件柜,设置为可用于脚本
  2. 在Suitelet中引入该库
  3. 创建工作簿、填充数据后,同步写入到NetSuite临时文件再返回

代码示例

/**
 * @NApiVersion 2.x
 * @NScriptType Suitelet
 */
define(['N/file', 'N/response', './exceljs.min'], function(file, response, ExcelJS) {
    function onRequest(context) {
        if (context.request.method === 'GET') {
            // 1. 创建ExcelJS工作簿
            const workbook = new ExcelJS.Workbook();

            // 2. 填充第一个工作表数据
            const salesSheet = workbook.addWorksheet('销售订单');
            salesSheet.columns = [
                {header: '订单编号', key: 'tranid'},
                {header: '客户', key: 'entity'},
                {header: '订单总额', key: 'total'}
            ];
            const salesData = query.runSuiteQL({
                query: 'SELECT tranid, entity, total FROM transaction WHERE type = "SalesOrd"'
            }).asMappedResults();
            salesData.forEach(row => salesSheet.addRow(row));

            // 3. 填充第二个工作表数据
            const customerSheet = workbook.addWorksheet('客户列表');
            customerSheet.columns = [
                {header: '客户名称', key: 'entityid'},
                {header: '邮箱', key: 'email'}
            ];
            const customerData = query.runSuiteQL({
                query: 'SELECT entityid, email FROM customer WHERE isinactive = F'
            }).asMappedResults();
            customerData.forEach(row => customerSheet.addRow(row));

            // 4. 写入NetSuite临时文件并返回
            const excelFile = file.create({
                name: '自定义报表.xlsx',
                fileType: file.Type.EXCEL,
                contents: '',
                isOnline: false
            });

            workbook.xlsx.write(excelFile)
                .then(() => {
                    excelFile.save();
                    response.sendFile({file: excelFile, isInline: false});
                })
                .catch(err => response.write(`导出失败:${err.message}`));
        }
    }
    return {onRequest: onRequest};
});

注意事项

  • 需确保ExcelJS版本与NetSuite服务器端Node.js环境兼容
  • 异步操作需通过Promise处理,避免回调异常

内容的提问来源于stack exchange,提问作者Faiz Byputra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 17:45:11