charts - 如何将 angular-d3-charts 保存到 SVG/JPEG/Excel 中,如 highcharts

标签 charts export angular6

在我的项目中展示我的 angular-d3-charts。但我需要将图表保存/导出为 Jpeg/png/svg 或 excel 等。如图所示,我们有这些选项高图表。 Highcharts sample image那么我怎样才能在这个图表中实现呢?有什么办法可以告诉我吗?

提前致谢。

最佳答案

将图表下载为图像,
首先从图表的 <svg> 创建一个图像,
然后在 <canvas> 上绘制图像元素,
那么你可以使用canvas.toDataURL获取图像的 Base64 字符串以供下载。

参见buildImageUrl在以下工作片段中运行。
单击下载按钮查看其运行情况。

<!DOCTYPE html>
<head>
  <meta charset="utf-8">
  <style>
  .hidden {
    display: none;
    visibility: hidden;
  }
  </style>
</head>
<body>
  <div>
    <input type="button" id="download" value="Download">
  </div>
  <div>
    <canvas class="hidden" id="canvas"></canvas>
  </div>
  <script src="https://d3js.org/d3.v3.min.js"></script>
  <script>
    // Set the dimensions of the canvas / graph
    var margin = {top: 30, right: 20, bottom: 30, left: 50},
      width = 600 - margin.left - margin.right,
      height = 270 - margin.top - margin.bottom;

    // Parse the date / time
    var parseDate = d3.time.format("%d-%b-%y").parse;

    // Set the ranges
    var x = d3.time.scale().range([0, width]);
    var y = d3.scale.linear().range([height, 0]);

    // Define the axes
    var xAxis = d3.svg.axis().scale(x)
      .orient("bottom").ticks(5);
    var yAxis = d3.svg.axis().scale(y)
      .orient("left").ticks(5);

    // Define the line
    var valueline = d3.svg.line()
      .x(function(d) { return x(d.date); })
      .y(function(d) { return y(d.close); });

    // Adds the svg canvas
    var svg = d3.select("body")
      .append("svg")
          .attr("width", width + margin.left + margin.right)
          .attr("height", height + margin.top + margin.bottom)
      .append("g")
          .attr("transform",
                "translate(" + margin.left + "," + margin.top + ")");

    // Load the data
    var data = [
      {date: '1-May-12', close: 58.13},
      {date: '30-Apr-12', close: 53.98},
      {date: '27-Apr-12', close: 67.00},
      {date: '26-Apr-12', close: 89.70},
      {date: '25-Apr-12', close: 99.00},
      {date: '24-Apr-12', close: 130.28},
      {date: '23-Apr-12', close: 166.70},
      {date: '20-Apr-12', close: 234.98},
      {date: '19-Apr-12', close: 345.44},
      {date: '18-Apr-12', close: 443.34},
      {date: '17-Apr-12', close: 543.70},
      {date: '16-Apr-12', close: 580.13},
      {date: '13-Apr-12', close: 605.23},
      {date: '12-Apr-12', close: 622.77},
      {date: '11-Apr-12', close: 626.20},
      {date: '10-Apr-12', close: 628.44},
      {date: '9-Apr-12', close: 636.23},
      {date: '5-Apr-12', close: 633.68},
      {date: '4-Apr-12', close: 624.31},
      {date: '3-Apr-12', close: 629.32},
      {date: '2-Apr-12', close: 618.63},
      {date: '30-Mar-12', close: 599.55},
      {date: '29-Mar-12', close: 609.86},
      {date: '28-Mar-12', close: 617.62},
      {date: '27-Mar-12', close: 614.48},
      {date: '26-Mar-12', close: 606.98}
    ];
    data.forEach(function(d) {
      d.date = parseDate(d.date);
      d.close = +d.close;
    });

    // Scale the range of the data
    x.domain(d3.extent(data, function(d) { return d.date; }));
    y.domain([0, d3.max(data, function(d) { return d.close; })]);

    // Add the valueline path.
    svg.append("path")
      .attr("fill", "none")
      .attr("stroke", "steelblue")
      .attr("stroke-width", 1.5)
      .attr("stroke-linejoin", "round")
      .attr("stroke-linecap", "round")
      .attr("d", valueline(data));

    // Add the X Axis
    svg.append("g")
      .attr("transform", "translate(0," + height + ")")
      .attr("fill", "none")
      .attr("stroke", "grey")
      .attr("stroke-width", 1)
      .attr("shape-rendering", "crispEdges")
      .call(xAxis);

    // Add the Y Axis
    svg.append("g")
      .attr("fill", "none")
      .attr("stroke", "grey")
      .attr("stroke-width", 1)
      .attr("shape-rendering", "crispEdges")
      .call(yAxis);

    // Change font
    d3.selectAll("text")
      .attr("fill","#444")
      .style("font-family","Verdana")
      .attr("stroke","none");

    // Add download button event listener
    document.getElementById('download').addEventListener('click', buildImageUrl);

    /**
     * build image
     */
    function buildImageUrl() {
      var canvas;    // canvas element
      var domUrl;    // object url
      var image;     // chart image
      var imageUrl;  // chart image url
      var svg;       // svg element

      // add svg namespace to chart
      svg = document.getElementsByTagName('svg')[0];
      svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');

      // create image url from svg
      domUrl = window.URL || window.webkitURL || window;
      imageUrl = domUrl.createObjectURL(new Blob([svg.outerHTML], {type: 'image/svg+xml'}));

      // create chart image
      image = new Image();
      image.onload = function() {
        // add image to canvas
        canvas = document.getElementById('canvas');
        canvas.setAttribute('width', parseFloat(svg.getAttribute('width')));
        canvas.setAttribute('height', parseFloat(svg.getAttribute('height')));
        canvas.getContext('2d').drawImage(image, 0, 0);

        // download image
        downloadImage(canvas.toDataURL('image/png'));
        domUrl.revokeObjectURL(imageUrl);
      }
      image.src = imageUrl;
    }

    /**
     * download image of chart
     */
    function downloadImage(imageUrl) {
      var browserIsIE;   // determine if browser is IE
      var downloadLink;  // anchor dom element to trigger download
      var fileName;      // donwload file name

      // determine browser, download the image
      fileName = 'chart.png';
      browserIsIE = false || !!document.documentMode;
      if (browserIsIE) {
        // convert image uri to blob, use ie navigator to download
        window.navigator.msSaveBlob(base64ToBlob(imageUrl.substr(imageUrl.indexOf(',') + 1), 'data:image/png'), fileName);
      } else {
        // create anchor dom element to image uri, raise click event
        downloadLink = document.createElement('a');
        downloadLink.href = imageUrl;
        downloadLink.download = fileName;
        raiseEvent(downloadLink, 'click');
      }
    }

    /**
     * create and execute an event object
     */
    function raiseEvent(element, eventType) {
      var eventRaised;  // event object

      // determine how and create the event
      if (document.createEvent) {
        eventRaised = document.createEvent('MouseEvents');
        eventRaised.initEvent(eventType, true, false);
        element.dispatchEvent(eventRaised);
      } else if (document.createEventObject) {
        eventRaised = document.createEventObject();
        element.fireEvent('on' + eventType, eventRaised);
      }
    }
  </script>
</body>

关于charts - 如何将 angular-d3-charts 保存到 SVG/JPEG/Excel 中,如 highcharts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52771590/

相关文章:

javascript - Highcharts 离线导出尝试从在线 cdn 加载库并出错

javascript - Kendo UI - 来自 JSON 数组的柱形图

angular - Angular ListView 组件,它将接受任何数据源

angular cli 6,ng测试不起作用

java - apache poi 4.0 条形图示例不起作用

javascript - ng-google-chart 柱形图中每列的自定义颜色

export - highcharts 导出服务器 js 脚本错误代码

grails - 首次尝试导出Excel时出错

java - 当我导出 Java 项目时,我的图形不会显示

angular - 无法在服务中正确设置 POST 的 RequestOptionsArgs