Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
In this article, we will design an MVC application that will export jqPlot chart into a PowerPoint file. jqPlot is a plotting and charting plugin for the jQuery Javascript framework. Open XML is a library & document format to manipulate Office documents like Word, Excel and PowerPoint. Create an internet MVC 3 application in VS 2010 and name it as ExportjqPlotChart. Now, add reference to DocumentFormat.OpenXml.dll, WindowsBase.dll [Download from here]. Include jqPlot files [jquery.jqplot.min.js, jqplot.pieRenderer.min.js] and below Open XML namespaces
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Presentation;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Drawing.Charts;
Modify Index view under Home Controller to generate jqPlot chart as shown below:
@using (Html.BeginForm())
{
<div>
<div id="divChart" style="width:350px;height:400px;"></div>
Graph's Image:
<div id="divChartImg"></div>
<br />
<input type="button" name="ExportGraph" id="ExportGraph" value="Export Chart" />
<input type="hidden" name="imgData" id="imgData" value="hidden text" />
</div>
}
<script type="text/javascript">
$(document).ready(function () {
//Draw a Sample jqPlot chart
var data = [['Heavy Industry', 12], ['Retail', 9], ['Light Industry', 14], ['Out of home', 16], ['Commuting', 7], ['Orientation', 9]];
var plot1 = jQuery.jqplot('divChart', [data], { seriesDefaults: { renderer: jQuery.jqplot.PieRenderer, rendererOptions: { showDataLabels: true} }, legend: { show: true, location: 'e'} }); // Save Image's data embedded in src attribute in a hidden variable
$("#ExportGraph").click(function () //Convert Graph to Image
var j = $("#divChart").jqplotToImageElem();
$("#divChartImg").append(j);
$('#divChart').hide();
$("#imgData").val($("#divChartImg img").attr('src'));
$('form').submit();
});
});
</script>
On click of Export Chart button, we converted Pie chart to a image using jqplotToImageElem() . Than, the Graph's image content embedded in src attribute of divChartImg is stored in a hidden variable to access in our action after form submission.
Create a PowerPoint file having a sample image named as Template.pptx under Content folde as shown below:
Add below POST action for saving the Graph's image and returning the PowerPoint.
[HttpPost]
public ActionResult Index(FormCollection form)
{
try
{
//Save Image of jqPlot Chart to a file
string fileName = Guid.NewGuid().ToString()+".jpg";
var data = form["imgData"].Replace("data:image/png;base64,", "");
Byte[] bitmapData = new Byte[data.Length];
bitmapData = Convert.FromBase64String(FixBase64ForImage(data));
System.IO.MemoryStream streamBitmap = new System.IO.MemoryStream(bitmapData);
Bitmap bitImage = new Bitmap((Bitmap)Image.FromStream(streamBitmap));
//bitImage.Save(Server.MapPath("~/content/") + fileName);// This statement will save file locally as an Image.
//Insert the jqPlot Chart's Image into PowerPoint
using (PresentationDocument prstDoc = PresentationDocument.Open(Server.MapPath("~/content/") + "Template.pptx", true))
{
string imgId = "rId" + new Random().Next(2000).ToString();
ImagePart imagePart = prstDoc.PresentationPart.SlideParts.FirstOrDefault().AddImagePart(ImagePartType.Jpeg, imgId);
imagePart.FeedData(new MemoryStream(bitmapData.ToArray()));
DocumentFormat.OpenXml.Drawing.Blip blip = prstDoc.PresentationPart.SlideParts.FirstOrDefault().Slide.Descendants<DocumentFormat.OpenXml.Drawing.Blip>().First();
blip.Embed = imgId;
prstDoc.PresentationPart.SlideParts.FirstOrDefault().Slide.Save();
prstDoc.PresentationPart.Presentation.Save();
prstDoc.Close();
}
return File(Server.MapPath("~/content/") + "Template.pptx", "application/mspowerpoint", "Graph.pptx");
}
catch (Exception ex)
{
return Content(ex.Message);
}
}
public string FixBase64ForImage(string Image)
{
System.Text.StringBuilder sbText = new System.Text.StringBuilder(Image, Image.Length);
sbText.Replace("\r\n", String.Empty);
sbText.Replace(" ", String.Empty);
return sbText.ToString();
}
}
We read the byte stream of Chart's image and added as an Imagepart to PPT. Finally, PPT image is replaced with Graph's image and returned to client as a File Result. I will outline the steps followed for exporting jqPlot chart to PowerPoint:
1) Created a sample jqPlot Pie chart
2) Converted it to image using jqplotToImageElem().
3) Image content in bytes is submitted to the action as a hidden variable.
4) This image's bytes are passed as a Memory stream in PowerPoint and replaced the actual image by mapping it to new ImgId.
I am attaching the source code reference. By tweaking the above code, we can export any jqPlot graph to an image and than into PowerPoint. I hope this article might be helpful to all.
Comments
- Anonymous
May 20, 2015
ddd - Anonymous
May 20, 2015
it's good