From a71f0186084d8720ea5c8c49a0ede0b7fe16f51e Mon Sep 17 00:00:00 2001 From: tlartem Date: Tue, 22 Jul 2025 08:50:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D1=81=D0=BA=D0=BB=D0=B0=D0=B4=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=8F=D1=87=D0=B5=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/component/DualSpreadsheet/utils.ts | 16 ++++----- src/hook/useMultiSheetEngine.ts | 36 ++++++++++++++++--- .../spreadsheet-engine/spreadsheet-engine.ts | 28 +++++++++++---- 3 files changed, 61 insertions(+), 19 deletions(-) diff --git a/src/component/DualSpreadsheet/utils.ts b/src/component/DualSpreadsheet/utils.ts index 7ae8f6f..337af01 100644 --- a/src/component/DualSpreadsheet/utils.ts +++ b/src/component/DualSpreadsheet/utils.ts @@ -251,14 +251,14 @@ export function convertReferencesToHighlights( ): HighlightedCell[] { const highlights: HighlightedCell[] = [] const colors = [ - 'bg-blue-200 border-blue-400', - 'bg-green-200 border-green-400', - 'bg-purple-200 border-purple-400', - 'bg-red-200 border-red-400', - 'bg-yellow-200 border-yellow-400', - 'bg-indigo-200 border-indigo-400', - 'bg-pink-200 border-pink-400', - 'bg-orange-200 border-orange-400', + 'bg-blue-200 text-blue-600', + 'bg-green-200 text-green-600', + 'bg-purple-200 text-purple-600', + 'bg-red-200 text-red-600', + 'bg-yellow-200 text-yellow-600', + 'bg-indigo-200 text-indigo-600', + 'bg-pink-200 text-pink-600', + 'bg-orange-200 text-orange-600', ] let colorIndex = 0 diff --git a/src/hook/useMultiSheetEngine.ts b/src/hook/useMultiSheetEngine.ts index b1ba809..38883c0 100644 --- a/src/hook/useMultiSheetEngine.ts +++ b/src/hook/useMultiSheetEngine.ts @@ -21,7 +21,7 @@ export function useMultiSheetEngine({ const workbookRef = useRef(null) const [isCalculating, setIsCalculating] = useState(false) const [revision, setRevision] = useState(0) // Новый счетчик для обновлений - const debouncedRecalcTimeoutRef = useRef(null) + const debouncedRecalcTimeoutRef = useRef(null) const isRecalculatingRef = useRef(false) // Храним изначальные данные шаблона для сравнения @@ -149,8 +149,21 @@ export function useMultiSheetEngine({ const cellName = columnToLabel(col) + (row + 1) const qualifiedName = `${sheetName}!${cellName}` - // Устанавливаем значение в движке без пересчета - workbookRef.current.setCell(qualifiedName, value) + // Конвертируем пустую строку в null + const cellValue: CellValue = value === '' ? null : value + + // Если значение начинается с =, то это формула + if (typeof cellValue === 'string' && cellValue.startsWith('=')) { + workbookRef.current.setCell(qualifiedName, cellValue) + } else { + // Пытаемся конвертировать в число, если возможно + const numValue = Number(cellValue) + if (!isNaN(numValue) && cellValue !== null && cellValue !== '') { + workbookRef.current.setCell(qualifiedName, numValue) + } else { + workbookRef.current.setCell(qualifiedName, cellValue) + } + } }, [] ) @@ -163,8 +176,21 @@ export function useMultiSheetEngine({ const cellName = columnToLabel(col) + (row + 1) const qualifiedName = `${sheetName}!${cellName}` - // Устанавливаем значение в движке - workbookRef.current.setCell(qualifiedName, value) + // Конвертируем пустую строку в null + const cellValue: CellValue = value === '' ? null : value + + // Если значение начинается с =, то это формула + if (typeof cellValue === 'string' && cellValue.startsWith('=')) { + workbookRef.current.setCell(qualifiedName, cellValue) + } else { + // Пытаемся конвертировать в число, если возможно + const numValue = Number(cellValue) + if (!isNaN(numValue) && cellValue !== null && cellValue !== '') { + workbookRef.current.setCell(qualifiedName, numValue) + } else { + workbookRef.current.setCell(qualifiedName, cellValue) + } + } // Запускаем безопасный пересчет safeRecalc() diff --git a/src/lib/spreadsheet-engine/spreadsheet-engine.ts b/src/lib/spreadsheet-engine/spreadsheet-engine.ts index 611c78a..90a2fd8 100644 --- a/src/lib/spreadsheet-engine/spreadsheet-engine.ts +++ b/src/lib/spreadsheet-engine/spreadsheet-engine.ts @@ -113,9 +113,17 @@ export class Cell { return '"#REF!"' } const cellValue = this.sheet.workbook.getCell(match).evaluate() - return typeof cellValue === 'string' - ? `"${cellValue}"` - : String(cellValue ?? 0) + // Только строки оборачиваем в кавычки, числа и булевы значения - нет + if (typeof cellValue === 'string') { + return `"${cellValue}"` + } else if ( + typeof cellValue === 'number' || + typeof cellValue === 'boolean' + ) { + return String(cellValue) + } else { + return '0' + } } catch (error) { return '"#REF!"' } @@ -130,9 +138,17 @@ export class Cell { try { const qualifiedRef = `${this.sheet.name}!${match}` const cellValue = this.sheet.workbook.getCell(qualifiedRef).evaluate() - return typeof cellValue === 'string' - ? `"${cellValue}"` - : String(cellValue ?? 0) + // Только строки оборачиваем в кавычки, числа и булевы значения - нет + if (typeof cellValue === 'string') { + return `"${cellValue}"` + } else if ( + typeof cellValue === 'number' || + typeof cellValue === 'boolean' + ) { + return String(cellValue) + } else { + return '0' + } } catch (error) { return '"#REF!"' }