update at 2026-02-14 10:17:02

This commit is contained in:
douboer@gmail.com
2026-02-14 10:17:02 +08:00
parent 8e9dfb0396
commit 2cf67e31ea
2 changed files with 74 additions and 9 deletions

View File

@@ -275,7 +275,7 @@ function buildColumnRenderRows(headers, sourceDataColumn, sourceDescMap, targetD
function toFriendlyParseError(error, fallbackMessage) {
const message = error && error.message ? String(error.message) : '';
if (message.indexOf('xlsx 解析') >= 0) {
return '当前环境未启用 xlsx 解析,请先在开发者工具执行“构建 npm”';
return message || '当前环境未启用 xlsx 解析,请先在开发者工具执行“构建 npm”';
}
return message || fallbackMessage;
}

View File

@@ -12,20 +12,78 @@ function normalizeText(value) {
* - 使用缓存避免每次解析都重复 require
*/
let cachedXlsxModule;
let cachedXlsxLoadErrorMessage = '';
/**
* 兼容 CommonJS / ESM 默认导出差异,统一拿到 xlsx API。
*/
function normalizeXlsxModuleShape(moduleValue) {
if (moduleValue && typeof moduleValue.read === 'function' && moduleValue.utils) {
return moduleValue;
}
if (
moduleValue &&
moduleValue.default &&
typeof moduleValue.default.read === 'function' &&
moduleValue.default.utils
) {
return moduleValue.default;
}
return null;
}
/**
* 返回最近一次 xlsx 模块加载失败原因,便于页面层展示详细信息。
*/
function getXlsxLoadErrorMessage() {
return cachedXlsxLoadErrorMessage;
}
function getXlsxModule() {
if (cachedXlsxModule !== undefined) {
return cachedXlsxModule;
}
try {
cachedXlsxModule = require('xlsx');
} catch (error) {
// 兜底:兼容开发者工具未正确挂载 npm 解析时,直接从 miniprogram_npm 目录加载。
const loadAttempts = [
{
label: "require('xlsx')",
loader: () => require('xlsx')
},
{
label: "require('../miniprogram_npm/xlsx/xlsx')",
loader: () => require('../miniprogram_npm/xlsx/xlsx')
},
{
label: "require('../miniprogram_npm/xlsx/dist/xlsx.mini.min')",
loader: () => require('../miniprogram_npm/xlsx/dist/xlsx.mini.min')
},
{
label: "require('../miniprogram_npm/xlsx/dist/xlsx.full.min')",
loader: () => require('../miniprogram_npm/xlsx/dist/xlsx.full.min')
}
];
const failedReasons = [];
for (let i = 0; i < loadAttempts.length; i += 1) {
const attempt = loadAttempts[i];
try {
cachedXlsxModule = require('../miniprogram_npm/xlsx');
} catch (fallbackError) {
cachedXlsxModule = null;
const loaded = attempt.loader();
const normalized = normalizeXlsxModuleShape(loaded);
if (normalized) {
cachedXlsxModule = normalized;
cachedXlsxLoadErrorMessage = '';
return cachedXlsxModule;
}
failedReasons.push(`${attempt.label}: 模块导出结构不符合预期`);
} catch (loadError) {
const detail =
loadError && loadError.message ? String(loadError.message) : '未知异常';
failedReasons.push(`${attempt.label}: ${detail}`);
}
}
cachedXlsxModule = null;
cachedXlsxLoadErrorMessage = failedReasons.join(' | ');
return cachedXlsxModule;
}
@@ -155,6 +213,12 @@ function parseCsvText(csvText) {
function parseXlsxBuffer(buffer) {
const xlsx = getXlsxModule();
if (!xlsx) {
const loadErrorDetail = getXlsxLoadErrorMessage();
if (loadErrorDetail) {
throw new Error(
`当前环境未启用 xlsx 解析,请先在开发者工具执行“构建 npm”。加载详情: ${loadErrorDetail}`
);
}
throw new Error('当前环境未启用 xlsx 解析,请先在开发者工具执行“构建 npm”');
}
@@ -321,5 +385,6 @@ module.exports = {
parseCsvText,
parseXlsxBuffer,
parseTableByFileName,
buildSankeyData
buildSankeyData,
getXlsxLoadErrorMessage
};