update at 2026-02-14 10:17:02
This commit is contained in:
@@ -275,7 +275,7 @@ function buildColumnRenderRows(headers, sourceDataColumn, sourceDescMap, targetD
|
|||||||
function toFriendlyParseError(error, fallbackMessage) {
|
function toFriendlyParseError(error, fallbackMessage) {
|
||||||
const message = error && error.message ? String(error.message) : '';
|
const message = error && error.message ? String(error.message) : '';
|
||||||
if (message.indexOf('xlsx 解析') >= 0) {
|
if (message.indexOf('xlsx 解析') >= 0) {
|
||||||
return '当前环境未启用 xlsx 解析,请先在开发者工具执行“构建 npm”';
|
return message || '当前环境未启用 xlsx 解析,请先在开发者工具执行“构建 npm”';
|
||||||
}
|
}
|
||||||
return message || fallbackMessage;
|
return message || fallbackMessage;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,20 +12,78 @@ function normalizeText(value) {
|
|||||||
* - 使用缓存避免每次解析都重复 require
|
* - 使用缓存避免每次解析都重复 require
|
||||||
*/
|
*/
|
||||||
let cachedXlsxModule;
|
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() {
|
function getXlsxModule() {
|
||||||
if (cachedXlsxModule !== undefined) {
|
if (cachedXlsxModule !== undefined) {
|
||||||
return cachedXlsxModule;
|
return cachedXlsxModule;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 {
|
try {
|
||||||
cachedXlsxModule = require('xlsx');
|
const loaded = attempt.loader();
|
||||||
} catch (error) {
|
const normalized = normalizeXlsxModuleShape(loaded);
|
||||||
// 兜底:兼容开发者工具未正确挂载 npm 解析时,直接从 miniprogram_npm 目录加载。
|
if (normalized) {
|
||||||
try {
|
cachedXlsxModule = normalized;
|
||||||
cachedXlsxModule = require('../miniprogram_npm/xlsx');
|
cachedXlsxLoadErrorMessage = '';
|
||||||
} catch (fallbackError) {
|
return cachedXlsxModule;
|
||||||
|
}
|
||||||
|
failedReasons.push(`${attempt.label}: 模块导出结构不符合预期`);
|
||||||
|
} catch (loadError) {
|
||||||
|
const detail =
|
||||||
|
loadError && loadError.message ? String(loadError.message) : '未知异常';
|
||||||
|
failedReasons.push(`${attempt.label}: ${detail}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cachedXlsxModule = null;
|
cachedXlsxModule = null;
|
||||||
}
|
cachedXlsxLoadErrorMessage = failedReasons.join(' | ');
|
||||||
}
|
|
||||||
return cachedXlsxModule;
|
return cachedXlsxModule;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,6 +213,12 @@ function parseCsvText(csvText) {
|
|||||||
function parseXlsxBuffer(buffer) {
|
function parseXlsxBuffer(buffer) {
|
||||||
const xlsx = getXlsxModule();
|
const xlsx = getXlsxModule();
|
||||||
if (!xlsx) {
|
if (!xlsx) {
|
||||||
|
const loadErrorDetail = getXlsxLoadErrorMessage();
|
||||||
|
if (loadErrorDetail) {
|
||||||
|
throw new Error(
|
||||||
|
`当前环境未启用 xlsx 解析,请先在开发者工具执行“构建 npm”。加载详情: ${loadErrorDetail}`
|
||||||
|
);
|
||||||
|
}
|
||||||
throw new Error('当前环境未启用 xlsx 解析,请先在开发者工具执行“构建 npm”');
|
throw new Error('当前环境未启用 xlsx 解析,请先在开发者工具执行“构建 npm”');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,5 +385,6 @@ module.exports = {
|
|||||||
parseCsvText,
|
parseCsvText,
|
||||||
parseXlsxBuffer,
|
parseXlsxBuffer,
|
||||||
parseTableByFileName,
|
parseTableByFileName,
|
||||||
buildSankeyData
|
buildSankeyData,
|
||||||
|
getXlsxLoadErrorMessage
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user