Данные на сайтах часто выкладываются в красивом, но не всегда удобном формате. В 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'

