Support Article
Unable to export the charts using export to excel option
SA-8171
Summary
The user is unable to export the chart using "To Excel" option.
Error Messages
Not Applicable.
Steps to Reproduce
1. Create a report and add chart.
2. Also enable "Export to Excel".
3. Run the report and click on export to excel.
Result:The chart is not getting exported to excel.
Root Cause
This is expected behaviour. PRPC is designed to export only the data and not the chart from the report.
Resolution
Following local-change uses third party tool PhantomJS to take the snapshot of chart in PDF only.
You must download PhantomJS locally on your system.
About PhantomJS
PHANTOMJS is a headless webkit scriptable with a JS API. It is used to take snapshots of the web URL’s. In order to get report viewer chart into PDF you can use this phantomjs.
Steps involved:
- A JS file is required to take the URL and crop the page accordingly. (Additionally it dumps the image at some physical location)
- An activity which actually calls the phantomjs webkit which internally calls the JS file. (This activity will wait for the phantomjs response and ones it is done it gets the chart image into the markup)
// Passing hard coded user id and password and passing URL and chartName dynamically
var page = require('webpage').create();
page.viewportSize = { width: 2000, height: 3000 };
page.settings.userName = ""; //set username
page.settings.password = "";//set password
page.settings.clearMemoryCaches = true;
var reportURL = phantom.args[0];
phantom.clearCookies();
page.open(reportURL, function () {
var waitNRun=function(){
console.log("In wait");
result= page.evaluate(function () {
var divs = document.getElementsByTagName('div');
var chartDiv;
for (var i = 0; i < divs.length; i++) {
if (divs[i].getAttribute('id') != null && divs[i].getAttribute('id').indexOf('ichartDiv') == 0) {
var reg = /^\d+$/;
if (reg.test(divs[i].getAttribute('id').split('ichartDiv')[1])) {
chartDiv = divs[i];
break;
}
}
else if (divs[i].getAttribute('id') != null && divs[i].getAttribute('id').indexOf('staticChart') == 0) {
var reg = /^\d+$/;
if (reg.test(divs[i].getAttribute('id').split('staticChart')[1])) {
chartDiv = divs[i];
break;
}
}
}
var curtop=0,curleft = 0;
var chartDivForTop=chartDiv;
if (chartDivForTop.offsetParent) {
do {
curtop += chartDivForTop.offsetTop;
curleft += chartDivForTop.offsetLeft;
} while (chartDivForTop = chartDivForTop.offsetParent);
}
return [chartDiv.offsetHeight,chartDiv.offsetWidth,curtop,curleft];
});
try{
console.log('Crop brand new to : '+result[0]+"x"+result[1]+"x"+result[2]+"x"+result[3]);
page.clipRect = { top: result[2] +10, left: result[3], width: result[1], height: result[0] -45};
window.setTimeout(function () {
page.render('\\\\some_shared_location\\phantom\\Chart_Name.png'); //Give some physical location which is again needed in activity
phantom.exit();
}, 20000);
}
catch(err){console.log('exception');
phantom.exit(1);}
}
setTimeout(waitNRun,5000);
});
Activity Steps
pyPDFSettings available rule is used to invoke phantom. (since it is available rule customers can make changes to it accordingly)
Set variables:
Using Property-Set method of an activity set phantomjs location as well as js file location into some local variables.

Call phantomjs:
Use a java step of an activity call phantomjs as described below:

Embed chart into PDF markup:

Published January 31, 2016 - Updated October 8, 2020
Have a question? Get answers now.
Visit the Collaboration Center to ask questions, engage in discussions, share ideas, and help others.