@exlabs/react-csv-generator
v1.0.4
Published
The React CSV generator
Downloads
71
Readme
React CSV Generator
Let's generate a CSV file on the frontend side. Efficiently and quickly with TypeScript support.
- Customize your source of data
- Use default styles or customize it
- Use custom labels for data fields
- Generated file works well with Excel and Numbers
- ✨Magic ✨
Features
- Generate a CSV file from the array
- Generate a CSV file from one endpoint
- Generate a CSV file from a bunch of endpoint's pages (pagination support)
- Default loader during file generation (can be replaced)
- Custom, optional fields labels
- Custom filename
- Custom messages
- TypeScript support
Installation
npm install @exlabs/react-csv-generator
or
yarn add @exlabs/react-csv-generator
Available Props
| Prop | Required | Description | Example
| ------ | ------ | ------ | ------ |
| children
| ✅ | Content of the component| "Download" or <div>Download me</div>
| fileName
| ✅ | Name of the generated file | "generated-file"
| className
| ⬜️| Class name to custom CSS styling| "own-class"
| baseEndpoint
| ⬜️ ✅ | URL of the endpoint. If set, you can't set items
| "https://api.punkapi.com/v2/beers"
| endpointDetails
| ⬜️ | Additional params for the endpoint set in baseEndpoint
| { page: 1, per_page: 3 }
| items
| ⬜️ ✅ | Array of data ready to generate the CSV. If set, you can't set baseEndpoint
| [ { id: 1 }, { id: 2 } ]
| labels
| ⬜️ | Custom labels for fields | { name: 'User name', created_at: 'Created at' }
| objectNameInResponse
| ⬜️ | If endpoint will return data in some particular object, pass its name | "items"
| loader
| ⬜️ | Component to replace the default loader | <MyOwnLoader />
| errorMessage
| ⬜️ | Message if something goes wrong. Default value: Something went wrong, please try again.
| "Oppps, sorry!"
| noDataMessage
| ⬜️ | Message if there is no data to generate the CSV file. Default value: No data to generate the file.
| "Your data object is empty!"
Usage & Examples
Render it inside your React application:
import React from 'react';
import CsvGenerator from '@exlabs/react-csv-generator';
const data = [{ id: 1, name: 'first' }, { id: 2, name: 'second' }];
const MyComponent = () => {
return (
<div>
<h1>Hello!</h1>
<CsvGenerator fileName="my-name" items={data}>
Download!
</CsvGenerator>
</div>
);
};
export default MyComponent;
Get data from the endpoint:
import React from 'react';
import CsvGenerator from '@exlabs/react-csv-generator';
const MyComponent = () => {
return (
<div>
<h1>Hello!</h1>
<CsvGenerator
fileName="my-name"
baseEndpoint="https://api.punkapi.com/v2/beers"
>
Download!
</CsvGenerator>
</div>
);
};
export default MyComponent;
Get data from the endpoint with specific details:
import React from 'react';
import CsvGenerator from '@exlabs/react-csv-generator';
const MyComponent = () => {
return (
<div>
<h1>Hello!</h1>
<CsvGenerator
fileName="my-name"
baseEndpoint="https://api.punkapi.com/v2/beers"
endpointDetails={{ page: 3, per_page: 10 }}
>
Download!
</CsvGenerator>
</div>
);
};
export default MyComponent;
If your endpoint will return total_pages
the component will try to fetch data from all pages and then generate the CSV. An example of the returned object might look like this:
{
items: [{...}],
total_pages: 3,
}
The component will fetch https://api...?page=1
then https://api...?page=2
and finally https://api...?page=3
. Only one CSV file will be generated with data from all pages. There is a big chance that your pagination endpoint works this way. Don't forget to pass objectNameInResponse
prop. In the above example, it will be items
.
Generate file with custom labels:
import React from 'react';
import CsvGenerator from '@exlabs/react-csv-generator';
const MyComponent = () => {
return (
<div>
<h1>Hello!</h1>
<CsvGenerator
fileName="my-name"
baseEndpoint="https://api.punkapi.com/v2/beers"
endpointDetails={{ page: 3, per_page: 10 }}
labels={{ boil_volume: 'Boil Volume', mash_temp: 'Mash Temperature' }}
>
Download!
</CsvGenerator>
</div>
);
};
export default MyComponent;
Demo
Coming soon
Automation tests
For easier writing tests, we add data-cy="csv-generator-btn"
attribute to the component's button. For example, if you are using Cypress.io you can easily get this item by cy.get('[data-cy="csv-generator-btn"]')
Excel support
Opening generated CSV file in the newest Excel may be tricky. React CSV Generator uses commas as a separator so Excel needs to know about it.
- Open Excel
- Select new blank workbook
- Click
File
andOpen
- Select a generated CSV file
- In popup window select
Delimited
option and clickNext
- Set
comma
as a delimiter and clickNext
- Click
Finish
and enjoy 🎉
License
MIT