Сделать экспорт в Excel – простой способ на React

Данные на сайтах часто выкладываются в красивом, но не всегда удобном формате. В Excel можно обработать данные - сортировать, фильтровать, делать расчеты, подготовить статистику или отчет с помощью сводных таблиц – очень много чего. Базовая версия описанного ниже экспорта в Excel из приложения React потребует не более 5 минут.

Экспорт в Excel - очень распространённая задача для разработчика. Это не удивительно - интерфейс Excel понятен и привычен, он делает работу с данными комфортной для заказчика. Ведь заказчик редко умеет кодировать. А в Excel - никаких странных интерфейсов, только привычная таблица.

Для заказчика функция «экспорт в Excel» - лишь кнопка на сайте. Он редко задумывается о сложности процесса. Потому иногда случаются конфликты по поводу согласования сроков реализации.

Ниже будет описано решение для React. В принципе, это реализация на Javascript, но с адаптацией для React приложения. Генерация файла будет проходить на клиенте, потому рекомендую применять его для сравнительно небольших объемов данных.

Нам понадобятся пакеты XLSX и file-saver. Если пишете на TypeScript, то вместо пакета file-saver нужно использовать @types/file-saver.

Итак, добавьте пакеты в решение:

npm install --save @types/file-saver XLSX

На странице приложения в компоненте React есть массив данных, он хранится в переменной matches. Это архив объектов.

const [matches, loadMatched] = useState<IMatch[]>([])

Переменная заполняется дефолтными данными в useEffect и потом обновляется пользователем.

В React компоненте размещена кнопка, которая вызывает функцию сохранения

<button onClick={ () => { XLSXDownload(matches)}}>Export Excel</button>

Пример реализации функции XLSXDownload(matches) ниже. Для удобства, ее можно вынести в отдельный файл.

export const  XLSXDownload = (data: IMatch[]) => {
    console.log('save')
    const dataArray = data.map(match => [
        match.homeTeam, // Assuming property1, property2, etc. are properties of IMatch
        match.awayTeam,
        // Add more properties as needed
    ]);

    function saveExcelFile() {
        const fileType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8';
        const fileExtension = '.xlsx';
        const fileName = 'test' + fileExtension;
        const Heading = [['FirstName', 'Last Name', 'Email']];
        const wb = XLSX.utils.book_new();
        const ws: XLSX.WorkSheet = XLSX.utils.json_to_sheet([]);
        XLSX.utils.sheet_add_aoa(ws, Heading);
        XLSX.utils.sheet_add_json(ws, data, { origin: 'A2', skipHeader: true });
        XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
        // this code is to set width of columns
        const max_width = data.reduce((w, r) => Math.max(w, r.homeTeam.length), 10);
        ws["!cols"] = [ { wch: max_width } ];

        const excelBuffer = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });
        const ms = new Blob([excelBuffer], { type: fileType });
        FileSaver.saveAs(ms, fileName + fileExtension);
    }
    saveExcelFile();
}

Для работы функции должны быть подключены пакеты XLSX и 'file-saver'.

import * as XLSX from 'xlsx'
import FileSaver from 'file-saver'

Комментариев нет »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment







MarkiMarta.ru. Записки отца-программиста" с 2009 г.
Категория информационной продукции 18+
Яндекс.Метрика