DEV Community

Adan Kalla
Adan Kalla

Posted on

6

Converting JSON to CSV in React: A DIY Approach

Here's a step-by-step breakdown.

  1. Import React:
   import React from 'react';
Enter fullscreen mode Exit fullscreen mode
  1. Define the DownloadProducts Component: Create a functional component named DownloadProducts, which takes elements as props. This component is responsible for converting the provided data into a CSV file and enabling users to download it.
   const DownloadProducts = ({ elements }) => {
Enter fullscreen mode Exit fullscreen mode
  1. Define Column Headers for CSV: Define an array fileHeaders containing the column headers for the CSV file. In this case, we have "product_name", "price", "quantity", and "total_price".
   const fileHeaders = [
     'product_name',
     'price',
     'quantity',
     'total_price'
   ];
Enter fullscreen mode Exit fullscreen mode
  1. Convert JSON to CSV Function: Define a function convertJSONToCSV that converts JSON data to a CSV-formatted string. It takes the JSON data and column headers as input and returns the CSV string.
   function convertJSONToCSV(jsonData, columnHeaders) {
     // Function body
   }
Enter fullscreen mode Exit fullscreen mode
  1. Function to Initiate CSV Download: Define a function downloadCSV to initiate the download of the CSV file when the user clicks a button. It takes JSON data and headers as input, converts the data to CSV format, creates a Blob object, and triggers the download.
   function downloadCSV(jsonData, headers) {
     // Function body
   }
Enter fullscreen mode Exit fullscreen mode
  1. Return Button Component for CSV Export: The DownloadProducts component returns a button that, when clicked, triggers the downloadCSV function. The button text reads "Export Product Data".
   return (
     <button
       onClick={() => {
         downloadCSV(elements, fileHeaders);
       }}
     >
       Export Product Data
     </button>
   );
Enter fullscreen mode Exit fullscreen mode
  1. Define Dummy JSON Data: We define a sample array dummyData containing objects representing product information. Each object has "product_name", "price", "quantity", and "total_price" fields.
   const dummyData = [
     // Sample product data objects
   ];
Enter fullscreen mode Exit fullscreen mode
  1. Export the Component with Dummy Data: We export the DownloadProducts component with the dummyData array passed as props to simulate actual product data.
   export default () => < DownloadProducts elements={dummyData} />;
Enter fullscreen mode Exit fullscreen mode

Full Code:

import React from 'react';

// Define the DownloadProducts component
const DownloadProducts = ({ elements }) => {
  // Define column headers for CSV
  const fileHeaders = [
    'product_name',
    'price',
    'quantity',
    'total_price'
  ];

  // Function to convert JSON to CSV string
  function convertJSONToCSV(jsonData, columnHeaders) {
    // Check if JSON data is empty
    if (jsonData.length === 0) {
      return '';
    }

    // Create headers string
    const headers = columnHeaders.join(',') + '\n';

    // Map JSON data to CSV rows
    const rows = jsonData
      .map((row) => {
        // Map each row to CSV format
        return columnHeaders.map((field) => row[field] || '').join(',');
      })
      .join('\n');

    // Combine headers and rows
    return headers + rows;
  }

  // Function to initiate CSV download
  function downloadCSV(jsonData, headers) {
    const csvData = convertJSONToCSV(jsonData, headers);

    // Check if CSV data is empty
    if (csvData === '') {
      alert('No data to export');
    } else {
      // Create CSV file and initiate download
      const blob = new Blob([csvData], { type: 'text/csv;charset=utf-8;' });
      const link = document.createElement('a');
      link.href = URL.createObjectURL(blob);
      link.setAttribute('download', 'product_data.csv');
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
    }
  }

  // Render the button for CSV export
  return (
    <button
      onClick={() => {
        downloadCSV(elements, fileHeaders);
      }}
    >
      Export Product Data
    </button>
  );
};

// Sample JSON data for products
const dummyData = [
  {
    "product_name": "Widget",
    "price": 50,
    "quantity": 2,
    "total_price": 100
  },
  {
    "product_name": "Gadget",
    "price": 100,
    "quantity": 1,
    "total_price": 100
  },
  {
    "product_name": "Tool",
    "price": 75,
    "quantity": 3,
    "total_price": 225
  },
  {
    "product_name": "Accessory",
    "price": 25,
    "quantity": 4,
    "total_price": 100
  },
  {
    "product_name": "Equipment",
    "price": 200,
    "quantity": 1,
    "total_price": 200
  }
];

// Export the component with sample data
export default () => <DownloadProducts elements={dummyData} />;


Enter fullscreen mode Exit fullscreen mode

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (1)

Collapse
 
davisbento profile image
Davi da Silva Bento

Thanks man, worked like a charm!! And without any lib, the way I like xD

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs