Скачивание 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); 
      }
    };
→ Ссылка