Introduction
In this post, I am explain how to export google charts as image to server disk file in asp.net.In the previous example How to export google charts as image file in asp.net using jquery. , we have seen how to export google charts as image at the client side, In this example I will explain Saving exported google chart on server disk.
Steps :
Step - 1 : Create New Project.
Go to File > New > Project > Select asp.net MVC4 web application > Entry Application Name > Click OK > Select Basic Application > Select view engine Razor > OKStep-2: Add a Database.
Go to Solution Explorer > Right Click on App_Data folder > Add > New item > Select SQL Server Database Under Data > Enter Database name > Add.Step-3: Create table for fetch data.
Open Database > Right Click on Table > Add New Table > Add Columns > Save > Enter table name > Ok.Step-4: Add Entity Data Model.
Go to Solution Explorer > Right Click on Project name form Solution Explorer > Add > New item > Select ADO.net Entity Data Model under data > Enter model name > Add.A popup window will come (Entity Data Model Wizard) > Select Generate from database > Next >
Chose your data connection > select your database > next > Select tables > enter Model Namespace > Finish.
Step-5: Create a Controller .
Go to Solution Explorer > Right Click on Controllers folder form Solution Explorer > Add > Controller > Enter Controller name > Select Templete "empty MVC Controller"> Add.Here I have created a controller "HomeController"
Step-6: Add new action into your controller for Get View
Here I have added "Index" Action into "Home" Controller. Please write this following codepublic ActionResult GoogleChartColumn()
{
return View();
}
Step-7: Add view for your Action & design for show google chart.
Right Click on Action Method (here right click on Index action) > Add View... > Enter View Name > Select View Engine (Razor) >Add.View (Html Code)
@{
ViewBag.Title = "GoogleChartColumn";
}
<h2>Google Chart</h2>
<div style="max-width:800px">
<div id="chart_div">
</div>
<a id="export" href="#" style="display:none" onclick="ExportImageToServer()" >Export as Image to Server</a>
</div>
Step-8: Add js code for fetch data and render google chart.
@* Add script for fetch data as json format render google chart *@
@section scripts{
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script>
google.load('visualization', "1", { packages: ["corechart"] });
var chartData;
var exportData;
//Load Data
$.ajax({
url: '/Home/GetSalesData',
dataType: 'json',
type: 'GET',
success: function (d) {
chartData = d;
console.log(chartData);
},
error: function () {
alert('Error! Please try again.');
}
}).done(function () {
drawChart();
});
//Draw Chart
function drawChart() {
var data = google.visualization.arrayToDataTable(chartData);
var options = { title: "Company Sales Report", pointSize: 5, 'chartArea': { 'width': '60%', 'height': '80%', left: 120, top: 30 } };
var columnChart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
google.visualization.events.addListener(columnChart, 'ready', function ()
{
exportData = columnChart.getImageURI();
$('#export').show();
});
columnChart.draw(data, options);
}
function ExportImageToServer() {
var string = exportData;
var image = string.replace('data:image/png;base64,', '');
$.ajax({
type: "POST",
url: "/home/ExportReport",
data: '{"imageData":"' + image + '"}',
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (d) {
alert(d);
},
error: function () {
alert('Error! Please try again.');
}
});
}
</script>
}
Complete View (Html Page)
@{
ViewBag.Title = "GoogleChartColumn";
}
<h2>Google Chart</h2>
<div style="max-width:800px">
<div id="chart_div">
</div>
<a id="export" href="#" style="display:none" onclick="ExportImageToServer()" >Export as Image to Server</a>
</div>
@* Add script for fetch data as json format render google chart *@
@section scripts{
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script>
google.load('visualization', "1", { packages: ["corechart"] });
var chartData;
var exportData;
//Load Data
$.ajax({
url: '/Home/GetSalesData',
dataType: 'json',
type: 'GET',
success: function (d) {
chartData = d;
console.log(chartData);
},
error: function () {
alert('Error! Please try again.');
}
}).done(function () {
drawChart();
});
//Draw Chart
function drawChart() {
var data = google.visualization.arrayToDataTable(chartData);
var options = { title: "Company Sales Report", pointSize: 5, 'chartArea': { 'width': '60%', 'height': '80%', left: 120, top: 30 } };
var columnChart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
google.visualization.events.addListener(columnChart, 'ready', function ()
{
exportData = columnChart.getImageURI();
$('#export').show();
});
columnChart.draw(data, options);
}
function ExportImageToServer() {
var string = exportData;
var image = string.replace('data:image/png;base64,', '');
$.ajax({
type: "POST",
url: "/home/ExportReport",
data: '{"imageData":"' + image + '"}',
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (d) {
alert(d);
},
error: function () {
alert('Error! Please try again.');
}
});
}
</script>
}
Step-9: Add another action into your controller for Get Sales data
Here I have added "SalesDataYearWise" Action into "Home" Controller. Please write this following codepublic JsonResult GetSalesData()
{
using (MyDatabaseEntities dc = new MyDatabaseEntities())
{
var v = (from a in dc.SalesRecords
group a by a.SalesDate.Year into g
select new
{
Year = g.Key,
Electronics = g.Sum(a=>a.Electronics),
BookAndMedia = g.Sum(a=>a.BookAndMedia),
HomeAndKitchen = g.Sum(a=>a.HomeAndKitchen)
});
if (v != null)
{
var chartData = new object[v.Count() + 1];
chartData[0] = new object[]{
"Year",
"Electronics",
"Book and Media",
"Home and Kitchen"
};
int j = 0;
foreach (var i in v)
{
j++;
chartData[j] = new object[] {i.Year.ToString(), i.Electronics, i.BookAndMedia, i.HomeAndKitchen };
}
return new JsonResult { Data = chartData, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
}
return new JsonResult { Data = null, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
Step-10: Add another action into your controller for Save image to server disk.
Here I have added "ExportReport" Action into "Home" Controller. Please write this following codepublic JsonResult ExportReport(string imageData)
{
string fileName = Path.Combine(Server.MapPath("~/ExportImage"), DateTime.Now.ToString("ddMMyyyyhhmmsstt") + ".png");
using (FileStream fs = new FileStream(fileName, FileMode.Create))
{
using (BinaryWriter bw = new BinaryWriter(fs))
{
byte[] data = Convert.FromBase64String(imageData);
bw.Write(data);
bw.Close();
}
}
return new JsonResult { Data = "Image saved successfully" };
}