diff --git a/src/components/DualSpreadsheet/DualSpreadsheet.tsx b/src/components/DualSpreadsheet/DualSpreadsheet.tsx index 43ffe19..663e129 100644 --- a/src/components/DualSpreadsheet/DualSpreadsheet.tsx +++ b/src/components/DualSpreadsheet/DualSpreadsheet.tsx @@ -116,7 +116,6 @@ interface CellProps { isMainCell: boolean rowSpan?: number colSpan?: number - mergedValue?: any } } @@ -191,11 +190,8 @@ const Cell = memo( } } - // Используем значение из объединенной ячейки, если доступно - const cellDisplayValue = - mergedCellInfo?.isMainCell && mergedCellInfo.mergedValue !== undefined - ? String(mergedCellInfo.mergedValue) - : displayValue + // Используем обычное значение displayValue для всех ячеек, включая объединенные + const cellDisplayValue = displayValue const handleClick = useCallback(() => { setActiveSheet(sheetType) @@ -413,7 +409,7 @@ const CellRenderer = ({ isMainCell: mergedCellInfo.isMainCell, rowSpan: mergedCellInfo.spans?.rowSpan, colSpan: mergedCellInfo.spans?.colSpan, - mergedValue: mergedCellInfo.mergedCell?.value, + // Убираем mergedValue - будем использовать актуальные данные из движка } : undefined @@ -716,6 +712,9 @@ const DualSpreadsheet: FC = ({ useEffect(() => { const reportTemplate = templateData?.[SHEET_NAMES.report] if (reportTemplate) { + // Очищаем старые значения + initialTemplateValues.current = {} + Object.entries(reportTemplate).forEach(([cellName, value]) => { initialTemplateValues.current[cellName] = String(value) }) diff --git a/src/hooks/useMultiSheetEngine.ts b/src/hooks/useMultiSheetEngine.ts index 32ba915..f0ad94d 100644 --- a/src/hooks/useMultiSheetEngine.ts +++ b/src/hooks/useMultiSheetEngine.ts @@ -1,7 +1,7 @@ import { useCallback, useEffect, useRef, useState } from 'react' import { - CellValue, - Workbook, + CellValue, + Workbook, } from '../lib/spreadsheet-engine/spreadsheet-engine' // interface CellData { @@ -62,17 +62,31 @@ export function useMultiSheetEngine({ workbookRef.current!.addSheet(sheetConfig.name) }) - // Загружаем начальные данные - if (Object.keys(initialData).length > 0) { - workbookRef.current.fromJSON(initialData) - // Первый пересчет для инициализации всех значений - safeRecalc() - } else { - // Увеличиваем ревизию, чтобы вызвать начальную отрисовку - setRevision((r) => r + 1) - } + // Увеличиваем ревизию для начальной отрисовки + setRevision((r) => r + 1) } - }, [initialData, safeRecalc, sheets]) // Восстанавливаем зависимости + }, [sheets]) + + // Отдельный useEffect для перезагрузки данных при изменении initialData + useEffect(() => { + if (!workbookRef.current) return + + if (Object.keys(initialData).length > 0) { + // Очищаем только те листы, для которых есть новые данные + for (const sheetName of Object.keys(initialData)) { + const sheet = workbookRef.current.getSheet(sheetName) + if (sheet) { + sheet.cells.clear() + } + } + + workbookRef.current.fromJSON(initialData) + safeRecalc() + } else { + // Если данных нет, просто обновляем ревизию + setRevision((r) => r + 1) + } + }, [initialData, safeRecalc]) // Синхронизация всех листов из движка // const syncAllSheetsFromEngine = useCallback(() => {