Скачивание csv в формате таблицы
Делаю скачивание и формирование csv. С бэка приходит мсассив headers и массив data, нужно закинуть все это в csv и скачать, это я сделал. Но в скаченном файле таблица в одну длинющую строку, а нужно, чтоб формировалась именно таблица
import { ILogsCSVResponse } from '../../model/types/usersTableSchema';
export const downloadCsvLogs = (objectData: ILogsCSVResponse, name: string) => {
const filename = `${name}`;
const contentType = 'data:text/csv;charset=utf-8,';
const blob = new Blob(
[decodeURIComponent(encodeURI(JSON.stringify(objectData.data)))],
{
type: contentType,
},
);
// @ts-ignore
if (window.navigator && window.navigator?.msSaveOrOpenBlob)
// @ts-ignore
window.navigator.msSaveOrOpenBlob(blob, filename);
else {
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.target = '_blank';
a.download = filename;
a.click();
URL.revokeObjectURL(a.href);
a.remove();
}
};
Ответы (1 шт):
Автор решения: Evgeniy Leonidov
→ Ссылка
Увидеть бы данные, которые вам приходят. Откуда скрин? Ваш код преобразует объект данных в строку JSON, что приводит к тому, что все данные записываются в одну строчку. Вам же нужно сначала сформировать заголовки таблички, и только потом каждую строку данных соответственно, добавляя переводы строки!
Уточните данные на входе! Потому что код очень и очень примерный, и возможно вообще не подходит под вашу задачу
export const downloadCsvLogs = (objectData, name) => {
const filename = `${name}.csv`;
const contentType = 'text/csv;charset=utf-8;';
const headers = objectData.headers.map(header => header.label).join(',');
const rows = objectData.data.map(row => {
return objectData.headers.map(header => {
const value = row[header.key];
return typeof value === 'string' && (value.includes(',') || value.includes('\n') || value.includes('"'))
? '"' + value.replace(/"/g, '""') + '"'
: value;
}).join(',');
}).join('\r\n');
const csvContent = headers + '\r\n' + rows;
const blob = new Blob([csvContent], { type: contentType });
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(blob, filename);
} else {
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(link.href);
}
};