JSON export - Chart.js line chart
In this sample we use JSON data, containing over 2000 currency rates, from EPPlus to populate a Charts.js line chart. The rates are imported to EPPlus from a .csv file using the LoadFromText function and exported to JSON via the ToJson() method. The JSON data is fetched via an ajax call to a separate MVC controller action (JsonExportController.Sample1GetJsonData())
Loading chart...
// runs when the DOM content has been fully loaded and fetches
// the exported json data via an ajax (jQuery.getJSON) call.
document.addEventListener('DOMContentLoaded', function () {
$.getJSON("/api/currencyrates", function(data){
let jsonData = JSON.parse(data);
let config = {
type: 'line',
data: getChartJsData(0, [1, 2, 3, 4], jsonData.range),
options: {
plugins: {
title: {
display: true,
text: 'Historial currency rates in USD'
}
}
}
};
document.getElementById("currency-chart-loader").style.display = 'none';
let myChart = new Chart(document.getElementById("myChart"), config);
}, false);
});
// Reads data from exported range and creates input for a Chart.js line chart.
// The argument xCol should be the 0-based index of the range column that contains the labels of the x-axis.
// The argument indexes should be an array containing the 0 - based indexes of the ranges columns
// columns to use in the datasets.
function getChartJsData(labelColumn, dataColumns, jsonRange) {
var xDataType;
var dataTypes = [];
var colors = ['black', 'blue', 'red', 'orange', 'green']
var data = {
labels: [],
datasets: []
};
// Read data from the column section
for (var i = 0; i < jsonRange.columns.length; i++) {
if (dataColumns.indexOf(i) > -1) {
data.datasets.push({
label: jsonRange.columns[i].name,
data: [],
borderColor: colors[i],
backgroundColor: colors[i],
borderWidth: 1,
pointRadius: 0.5,
fill: false
});
}
}
// Read data in reverse order from the range's rows
let labelDataType = jsonRange.columns[labelColumn].dt;
for (var row = jsonRange.rows.length - 1; row >= 0 ; row--) {
let labelValue = getValue(jsonRange.rows[row].cells[labelColumn].v, labelDataType);
data.labels.push(jsonRange.rows[row].cells[labelColumn].t);
for (var i = 0; i < dataColumns.length; i++) {
let columnIndex = dataColumns[i];
let val = getValue(jsonRange.rows[row].cells[columnIndex].v, jsonRange.columns[columnIndex].dt);
data.datasets[i].data.push({ x: labelValue, y: val });
}
}
return data;
}
function getValue(val, datatype) {
if (datatype == "string") {
return val;
}
else if (datatype == "number") {
return parseFloat(val);
}
else if (datatype == "datetime") {
return new Date(parseInt(val));
}
}
This is just a small subset of the actual json in the sample to show the format.
{
"range": {
"columns": [
{
"name": "Date",
"dt": "datetime"
},
{
"name": "GBP",
"dt": "number"
},
{
"name": "EUR",
"dt": "number"
},
{
"name": "AUD",
"dt": "number"
},
{
"name": "CAD",
"dt": "number"
}
],
"rows": [
{
"cells": [
{
"v": "1636588800000",
"t": "2021-11-11"
},
{
"v": "0.7464",
"t": "0,7464"
},
{
"v": "0.8726",
"t": "0,8726"
},
{
"v": "1.3699",
"t": "1,3699"
},
{
"v": "1.2582",
"t": "1,2582"
}
]
},
{
"cells": [
{
"v": "1635984000000",
"t": "2021-11-04"
},
{
"v": "0.7377",
"t": "0,7377"
},
{
"v": "0.8644",
"t": "0,8644"
},
{
"v": "1.3486",
"t": "1,3486"
},
{
"v": "1.2417",
"t": "1,2417"
}
]
}
]
}
}
[HttpGet, Route("/api/currencyrates")]
public async Task<JsonResult> Sample1GetJsonData()
{
using(var package = new ExcelPackage())
{
var sheet = package.Workbook.Worksheets.Add("Currencies");
var csvFileInfo = new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"data\\currencies2011weekly.csv"));
var format = new ExcelTextFormat
{
Delimiter = ';',
Culture = CultureInfo.InvariantCulture,
DataTypes = new eDataTypes[] { eDataTypes.DateTime, eDataTypes.Number, eDataTypes.Number, eDataTypes.Number, eDataTypes.Number }
};
var range = await sheet.Cells["A1"].LoadFromTextAsync(csvFileInfo, format);
sheet.Cells[range.Start.Row, 1, range.End.Row, 1].Style.Numberformat.Format = "yyyy-MM-dd";
sheet.Cells[range.Start.Row, 2, range.End.Row, 5].Style.Numberformat.Format = "#,##0.0000";
var jsonData = range.ToJson(x=>x.AddDataTypesOn=eDataTypeOn.OnColumn);
return Json(jsonData);
}
}