import { FileBlob, SpreadsheetFile } from '@oai/artifact-tool'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; const projectRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); const inputPath = path.join(projectRoot, 'product-docs', '职来产品功能设计.xlsx'); const input = await FileBlob.load(inputPath); const workbook = await SpreadsheetFile.importXlsx(input); const summary = await workbook.inspect({ kind: 'workbook,sheet,table', maxChars: 12000, tableMaxRows: 8, tableMaxCols: 16, tableMaxCellChars: 120, }); console.log('SUMMARY'); console.log(summary.ndjson); const sheets = await workbook.inspect({ kind: 'sheet', include: 'id,name', maxChars: 4000 }); console.log('SHEETS'); console.log(sheets.ndjson); for (const s of workbook.worksheets.items) { const used = s.getUsedRange(); if (!used) continue; console.log(`SHEET_RANGE ${s.name} ${used.address}`); const region = await workbook.inspect({ kind: 'region', sheetId: s.name, range: used.address, maxChars: 30000, tableMaxRows: 250, tableMaxCols: 40, tableMaxCellChars: 200, }); console.log(region.ndjson); } const detail = workbook.worksheets.getItem('功能详细清单').getRange('A1:I96').values; const rows = detail.slice(1).filter(r => r.some(v => v !== null && v !== '')); const count = (keyFn) => rows.reduce((m, r) => { const k = keyFn(r); m[k] = (m[k] || 0) + 1; return m; }, {}); console.log('COUNTS_PRIORITY', JSON.stringify(count(r => r[7]))); console.log('COUNTS_PHASE', JSON.stringify(count(r => r[8]))); console.log('COUNTS端模块', JSON.stringify(count(r => `${r[1]}|${r[2]}|${r[3]}`))); console.log('一期_P0', JSON.stringify(rows.filter(r => r[7] === 'P0' && r[8] === 'Y').map(r => ({id:r[0],端:r[1],tab:r[2],module:r[3],name:r[4]}))));