import React, { useState } from 'react';
import * as XLSX from 'xlsx';
import { Pie } from 'react-chartjs-2';
import { Chart, ArcElement, Tooltip, Legend } from 'chart.js';
import ChartDataLabels from 'chartjs-plugin-datalabels';
// Register Chart.js components and plugins
Chart.register(ArcElement, Tooltip, Legend, ChartDataLabels);
const ExcelToCharts = () => {
const [chartData, setChartData] = useState(null);
const [key, setKey] = useState(0);
const handleFileUpload = (event) => {
const file = event.target.files[0];
const reader = new FileReader();
reader.onload = (e) => {
const data = new Uint8Array(e.target.result);
const workbook = XLSX.read(data, { type: 'array' });
const sheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[sheetName];
const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
processExcelData(jsonData);
};
reader.readAsArrayBuffer(file);
};
const processExcelData = (data) => {
// Extract labels and values
const labels = [];
const values = [];
for (let i = 1; i < data.length; i++) {
labels.push(data[i][0]);
values.push(data[i][1]);
}
setChartData({
labels: labels,
datasets: [
{
label: 'Data',
data: values,
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 206, 86, 0.2)',
'rgba(75, 192, 192, 0.2)',
'rgba(153, 102, 255, 0.2)',
'rgba(255, 159, 64, 0.2)',
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)',
],
borderWidth: 1,
},
],
});
setKey((prevKey) => prevKey + 1); // Force re-render of chart
};
const pieOptions = {
maintainAspectRatio: false,
responsive: true,
plugins: {
legend: {
position: 'top',
},
tooltip: {
enabled: true,
},
datalabels: {
formatter: (value, context) => {
return value;
},
color: 'black',
font: {
weight: 'bold',
},
},
},
};
return (
<div>
<h1>Excel to Pie Chart</h1>
<input type="file" accept=".xlsx, .xls" onChange={handleFileUpload} />
{chartData && (
<div style={{ width: '300px', height: '300px', margin: 'auto' }}>
<Pie key={key} data={chartData} options={pieOptions} />
</div>
)}
</div>
);
};
export default ExcelToCharts;