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

NestJS/TypeScript引入SheetJS报错:require()不支持ES模块如何解决?

解决NestJS/TypeScript中SheetJS ES模块导入错误

问题场景

使用NestJS/TypeScript开发时,在服务文件中按照SheetJS文档引入模块,代码如下:

/* load the codepage support library for extended support with older formats  */
import * as cpexcel from 'xlsx/dist/cpexcel.full.mjs';
import * as XLSX from 'xlsx/xlsx.mjs';

/* load 'fs' for readFile and writeFile support */
import { Injectable } from '@nestjs/common';
import { DSRequestContextService } from '@shared/services/context/context_service';
import { DSLogService } from '@shared/services/log/log.service';

XLSX.set_fs(fs);

XLSX.stream.set_readable(Readable);

XLSX.set_cptable(cpexcel);

运行时出现错误:

[ERROR] 18:11:27 Error: require() of ES Module /mnt/d/Repos/document-engine/node_modules/xlsx/dist/cpexcel.full.mjs not supported.
Instead change the require of /mnt/d/Repos/document-engine/node_modules/xlsx/dist/cpexcel.full.mjs to a dynamic import() which is available in all CommonJS modules.

解决方案

方法1:使用SheetJS的CommonJS兼容导入

直接导入SheetJS的CommonJS版本,无需单独引入cpexcel(最新版本已整合相关支持,或自动处理codepage依赖):

import * as XLSX from 'xlsx';
import * as fs from 'fs';
import { Readable } from 'stream';
import { Injectable } from '@nestjs/common';
import { DSRequestContextService } from '@shared/services/context/context_service';
import { DSLogService } from '@shared/services/log/log.service';

XLSX.set_fs(fs);
XLSX.stream.set_readable(Readable);
// 如需手动指定codepage,可使用CommonJS版本的cpexcel
// XLSX.set_cptable(require('xlsx/dist/cpexcel.full.js'));

方法2:使用动态导入处理ES模块

按照错误提示改用动态import(),在异步函数中加载cpexcel模块:

import * as XLSX from 'xlsx/xlsx.mjs';
import * as fs from 'fs';
import { Readable } from 'stream';
import { Injectable } from '@nestjs/common';
import { DSRequestContextService } from '@shared/services/context/context_service';
import { DSLogService } from '@shared/services/log/log.service';

@Injectable()
export class YourExcelService {
  async processExcel() {
    // 动态导入cpexcel模块
    const cpexcel = await import('xlsx/dist/cpexcel.full.mjs');
    XLSX.set_cptable(cpexcel);
    XLSX.set_fs(fs);
    XLSX.stream.set_readable(Readable);

    // 后续Excel处理逻辑
  }
}

方法3:调整项目模块系统配置

在项目根目录的package.json中添加"type": "module",同时修改tsconfig.json对应配置:

  • 将compilerOptions.module设为ESNext
  • 将compilerOptions.target设为ES2020或更高版本
  • 确保compilerOptions.moduleResolution设为NodeNext

注意:此修改会影响整个项目的模块导入方式,需要验证所有依赖是否兼容ES模块。

内容的提问来源于stack exchange,提问作者Antonio Pavicevac-Ortiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:18:38