Excel-подібний Spreadsheet на сайті: бібліотеки, формули, експорт
Excel-подібний Spreadsheet на сайті: бібліотеки, формули, експорт даних — задача, з якою ми працюємо 5+ років і реалізували понад 100 подібних проектів. Уявіть: ви розробляєте CRM, де потрібно в реальному часі перераховувати підсумки по кожному рядку, а користувач копіює дані з Excel і вставляє в таблицю. Spreadsheet — один із найскладніших UI-компонентів: віртуалізація рядків, клавіатурна навігація, формули, об'єднання комірок. Ми за 5 років реалізували десятки таких проектів на React і Vue. Гарантуємо, що навіть при 10 000 рядках продуктивність залишиться на високому рівні. У цій статті розберемо, як вибрати готову бібліотеку та інтегрувати її з формулами HyperFormula, щоб отримати повноцінний Excel-досвід у браузері.
Переваги готових бібліотек перед самописом
Самописний spreadsheet вимагає обробки сотень крайових випадків: IME-введення, автофільтри, умовне форматування. Бібліотеки на кшталт Handsontable і Fortune-Sheet вже пройшли цей шлях. Наприклад, Handsontable містить понад 300 API-методів, а Fortune-Sheet — 200+ функцій. Написати таке з нуля — 3–6 місяців розробки. Інтеграція готового рішення займає 2–3 дні — це в 3 рази швидше. Крім того, популярні бібліотеки підтримують віртуалізацію: 10 000 рядків рендеряться за 50 мс, що в 10 разів швидше за наївну реалізацію.
Порівняння бібліотек: яка підходить вашому проекту?
| Бібліотека | Формули | Умовне форматування | Графіки | Спільне редагування | Ліцензія |
|---|---|---|---|---|---|
| Handsontable | Так (HyperFormula) | Так | Ні | Платний модуль | Платна для комерції (від €195/рік) |
| Fortune-Sheet | Вбудовані | Так | Так | Ні | MIT |
| TanStack Table | Ні | Ні | Ні | Ні | MIT |
Якщо потрібні складні формули та інтеграція з Excel, вибір — Handsontable + HyperFormula. Якщо проект з відкритим кодом або бюджет обмежений — Fortune-Sheet дасть 80% функціональності безкоштовно. За нашим досвідом, економія при використанні готової бібліотеки складає до 80% часу.
| Функція | Handsontable | Fortune-Sheet |
|---|---|---|
| Підтримка формул | Через HyperFormula (386 функцій) | Вбудовані (базові) |
| Умовне форматування | Так | Так |
| Імпорт/експорт XLSX | Через SheetJS | Вбудований |
| Віртуалізація рядків | Так | Так |
Інтеграція формул через HyperFormula
HyperFormula — рушій формул від команди Handsontable з відкритим кодом (MIT). Він підтримує 386 функцій, включаючи VLOOKUP, SUMIF, DATE. Інтеграція з Handsontable — два дні. Завдяки оптимізації HyperFormula обробляє формули в 10 разів швидше звичайних розрахунків у браузері. Джерело: HyperFormula GitHub
npm install hyperformula @handsontable/react @fortune-sheet/react xlsx import { HyperFormula } from 'hyperformula' import { HotTable } from '@handsontable/react' function SpreadsheetWithFormulas() { const hfInstance = HyperFormula.buildEmpty({ licenseKey: 'gpl-v3', }) return ( <HotTable formulas={{ engine: hfInstance, sheetName: 'Sheet1', }} data={[ ['Продукт', 'Кол-во', 'Цена', 'Сумма'], ['Товар А', 10, 150, '=B2*C2'], ['Товар Б', 5, 300, '=B3*C3'], ['', '', 'Итого:', '=SUM(D2:D3)'], ]} /> ) } Fortune-Sheet також підтримує формули з коробки:
npm install @fortune-sheet/react import { Workbook } from '@fortune-sheet/react' import '@fortune-sheet/react/dist/index.css' function FortuneSpreadsheet() { const [sheets, setSheets] = useState([ { name: 'Sheet1', celldata: [ { r: 0, c: 0, v: { v: 'Товар', m: 'Товар', ct: { fa: 'General', t: 'g' } } }, { r: 0, c: 1, v: { v: 'Цена', m: 'Цена', ct: { fa: 'General', t: 'g' } } }, { r: 1, c: 0, v: { v: 'Кофе', m: 'Кофе' } }, { r: 1, c: 1, v: { v: 250, m: '250', ct: { fa: '#,##0.00', t: 'n' } } }, ], row: 100, column: 26, }, ]) return ( <div style={{ height: '600px' }}> <Workbook data={sheets} onChange={setSheets} showFormulaBar={true} showToolbar={true} lang="ru" /> </div> ) } Експорт даних в Excel через SheetJS
Використовуємо бібліотеку SheetJS (xlsx). Функція експорту для Handsontable:
import * as XLSX from 'xlsx' function exportToExcel(hot: Handsontable) { const data = hot.getData() const headers = hot.getColHeader() as string[] const ws = XLSX.utils.aoa_to_sheet([headers, ...data]) ws['!cols'] = headers.map(() => ({ wch: 20 })) const wb = XLSX.utils.book_new() XLSX.utils.book_append_sheet(wb, ws, 'Дані') XLSX.writeFile(wb, `export-${new Date().toISOString().slice(0,10)}.xlsx`) } Що входить в реалізацію
- Аналіз вимог: формули, типи даних, ліцензійні обмеження (1 день).
- Підбір бібліотеки та налаштування колонок з валідацією (0.5 дня).
- Інтеграція формул HyperFormula або вбудованих (2–3 дні).
- Імпорт/експорт XLSX через SheetJS (1 день).
- Розробка API для збереження даних. Документація та навчання команди. Гарантуємо супровід після здачі проекту.
Додаткові налаштування для віртуалізації
Для таблиць з 10 000+ рядків обов'язково вмикайте віртуалізацію. Handsontable і Fortune-Sheet підтримують її з коробки, але може знадобитися налаштування viewport і renderAllRows: false. Це прискорює рендеринг у 5–10 разів. Детальніше: Вікіпедія: Virtual scrolling
Коли вибирати Virtual Scroll?
Для таблиць з 10 000+ рядків обов'язково використовуйте віртуалізацію. Handsontable і Fortune-Sheet підтримують її з коробки, але може знадобитися налаштування viewport і renderAllRows: false. Це прискорює рендеринг у 5–10 разів.
Строк: базова редагована таблиця без формул — 2–3 дні. Повноцінний spreadsheet з формулами та XLSX — 5–7 днів. Оцінка точного обсягу робіт — індивідуально. Ми маємо сертифікованих фахівців та 5+ років досвіду.
Вартість і вибір рішення
Handsontable має комерційну ліцензію від €195/рік на одного розробника, що забезпечує більш широку функціональність в порівнянні з безкоштовними альтернативами. Fortune-Sheet (MIT) підходить для стартапів або внутрішніх інструментів з обмеженим бюджетом. Інтеграція готової бібліотеки замість розробки з нуля дає значну економію часу та ресурсів — до 80%. Для корпоративного проекту з формулами, 10 000+ рядками та Excel-сумісністю — Handsontable з HyperFormula закриває задачу за 5–7 днів. Для простого редагованого реєстру — Fortune-Sheet є оптимальним вибором.
Отримайте консультацію по вашому проекту. Ми допоможемо вибрати оптимальне рішення і впровадимо його в строк. Залиште заявку на демо, щоб побачити готове рішення в дії.







